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 909x 909x 909x 909x 909x 909x 909x 677x 677x 678x 677x 677x 1x 1x 677x 909x 909x 909x 909x 908x 909x 231x 231x 231x 908x 909x 6x 909x 12x 12x 12x 12x 909x 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 ? Target.runSyntax(firstTarget, input) : undefined; for (const t of targets) { if (t === firstTarget) { continue; } Target.runSyntax(t, input); } } const source = node.findDirectExpression(Expressions.Source); const sourceType = source ? 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) { 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; } } } |