Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 890x 890x 890x 890x 890x 890x 890x 663x 663x 664x 663x 663x 1x 1x 663x 890x 890x 890x 890x 889x 890x 226x 226x 226x 889x 890x 6x 890x 11x 11x 11x 11x 890x 1x | import * as Expressions from "../../2_statements/expressions"; import {StatementNode} from "../../nodes"; import {Source} from "../expressions/source"; import {Target} from "../expressions/target"; import {InlineData} from "../expressions/inline_data"; import {AbstractType} from "../../types/basic/_abstract_type"; import {StatementSyntax} from "../_statement_syntax"; import {TypeUtils} from "../_type_utils"; import {SyntaxInput, syntaxIssue} from "../_syntax_input"; export class Move implements StatementSyntax { public runSyntax(node: StatementNode, input: SyntaxInput): void { const targets = node.findDirectExpressions(Expressions.Target); const firstTarget = targets[0]; const inline = firstTarget?.findDirectExpression(Expressions.InlineData); let targetType: AbstractType | undefined = undefined; if (inline === undefined) { targetType = firstTarget ? new Target().runSyntax(firstTarget, input) : undefined; for (const t of targets) { if (t === firstTarget) { continue; } new Target().runSyntax(t, input); } } const source = node.findDirectExpression(Expressions.Source); const sourceType = source ? new Source().runSyntax(source, input, targetType) : undefined; if (sourceType === undefined) { const message = "No source type determined"; input.issues.push(syntaxIssue(input, node.getFirstToken(), message)); return; } if (inline) { new InlineData().runSyntax(inline, input, sourceType); targetType = sourceType; } if (node.findDirectTokenByText("?=")) { if (new TypeUtils(input.scope).isCastable(sourceType, targetType) === false) { const message = "Incompatible types"; input.issues.push(syntaxIssue(input, node.getFirstToken(), message)); return; } } else if (new TypeUtils(input.scope).isAssignable(sourceType, targetType) === false) { const message = "Incompatible types"; input.issues.push(syntaxIssue(input, node.getFirstToken(), message)); return; } } } |