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 886x 886x 886x 886x 886x 886x 886x 661x 661x 662x 661x 661x 1x 1x 661x 886x 886x 886x 886x 885x 886x 224x 224x 224x 885x 886x 6x 886x 11x 11x 11x 11x 886x 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; } } } |