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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 421x 421x 421x 421x 421x 84x 84x 421x 421x 421x 421x 421x 421x 2x 2x 2x 2x 421x 418x 421x 1x 1x 418x 421x 418x 418x 421x 11x 11x 2x 2x 2x 2x 11x 421x 421x 1x | import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {Target} from "../expressions/target";
import {StatementSyntax} from "../_statement_syntax";
import {Dynamic} from "../expressions/dynamic";
import {TypeUtils} from "../_type_utils";
import {FieldChain} from "../expressions/field_chain";
import {ReferenceType} from "../_reference";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
export class Write implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
// todo, more
let second = node.getChildren()[1];
if (second.get() instanceof Expressions.WriteOffsetLength) {
second = node.getChildren()[2];
}
for (const s of node.findDirectExpressions(Expressions.Source)) {
const type = Source.runSyntax(s, input);
if (s === second
&& new TypeUtils(input.scope).isCharLike(type) === false
&& new TypeUtils(input.scope).isHexLike(type) === false) {
const message = "Source not character like";
input.issues.push(syntaxIssue(input, s.getFirstToken(), message));
return;
}
}
for (const s of node.findDirectExpression(Expressions.WriteOffsetLength)?.findDirectExpressions(Expressions.SimpleFieldChain2) || []) {
FieldChain.runSyntax(s, input, ReferenceType.DataReadReference);
}
for (const s of node.findAllExpressions(Expressions.Dynamic)) {
Dynamic.runSyntax(s, input);
}
const target = node.findDirectExpression(Expressions.Target);
if (target) {
const targetType = Target.runSyntax(target, input);
if (new TypeUtils(input.scope).isCharLikeField(targetType) === false) {
const message = `"${target.concatTokens()}" must be a character-like field (data type C, N, D, or T, got "${
targetType?.constructor.name}")`;
input.issues.push(syntaxIssue(input, target.getFirstToken(), message));
}
}
}
}
|