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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 116x 116x 116x 116x 116x 116x 116x 116x 116x 116x 116x 116x 90x 90x 92x 92x 91x 91x 3x 3x 3x 3x 91x 92x 87x 116x 12x 12x 113x 113x 113x 1x 1x | import * as Expressions from "../../2_statements/expressions";
import {ExpressionNode, StatementNode} from "../../nodes";
import {StructureType, VoidType} from "../../types/basic";
import {AbstractType} from "../../types/basic/_abstract_type";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
import {Source} from "./source";
export class FieldAssignment {
public static runSyntax(
node: ExpressionNode | StatementNode,
input: SyntaxInput,
targetType: AbstractType | undefined): void {
const fieldSub = node.findDirectExpression(Expressions.FieldSub);
if (fieldSub === undefined) {
const message = "FieldAssignment, FieldSub node not found";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const s = node.findDirectExpression(Expressions.Source);
if (s === undefined) {
const message = "FieldAssignment, Source node not found";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
let type: AbstractType | undefined = undefined;
if (targetType instanceof StructureType) {
let context: AbstractType | undefined = targetType;
for (const c of fieldSub.getChildren()) {
const text = c.concatTokens();
if (text !== "-" && context instanceof StructureType) {
context = context.getComponentByName(text);
if (context === undefined) {
const message = `field ${text} does not exist in structure`;
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
}
}
type = context;
} else if (targetType instanceof VoidType) {
type = targetType;
}
Source.runSyntax(s, input, type);
}
} |