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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8x 8x 11x 11x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 7x 7x 7x 1x 1x 1x 1x 6x 7x 7x 1x 1x 1x 1x 1x 8x 1x 1x 1x 8x 6x 6x 8x 6x 8x 6x 6x 1x | import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {StatementSyntax} from "../_statement_syntax";
import {Target} from "../expressions/target";
import {FSTarget} from "../expressions/fstarget";
import {ComponentCond} from "../expressions/component_cond";
import {AnyType, StructureType, TableAccessType, TableType, UnknownType, VoidType} from "../../types/basic";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
export class ModifyInternal implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
for (const s of node.findDirectExpressions(Expressions.Source)) {
Source.runSyntax(s, input);
}
// there is only one
const target = node.findFirstExpression(Expressions.Target);
const targetExpression = target;
if (targetExpression) {
// it might be a dynamic target
const targetType = Target.runSyntax(targetExpression, input);
if (targetType instanceof VoidType
|| targetType instanceof AnyType
|| targetType instanceof UnknownType) {
// ok
} else if (targetType instanceof TableType) {
if (node.findDirectTokenByText("TABLE") === undefined
&& node.findDirectTokenByText("INDEX")
&& targetType.getAccessType() === TableAccessType.hashed) {
const message = "Implicit or explicit index operation on hashed table is not possible";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
if (node.findDirectTokenByText("TABLE")
&& node.findDirectTokenByText("INDEX")
&& targetType.isWithHeader() === false) {
// MODIFY TABLE INDEX
const message = "Table does not have header line";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
} else if (targetType instanceof StructureType) {
// it might originate from a TABLES statement
if (target.concatTokens().toUpperCase() !== targetType.getDDICName()) {
const message = "Not an internal table";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
} else {
const message = "Not an internal table";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
}
const fstarget = node.findDirectExpression(Expressions.FSTarget);
if (fstarget) {
FSTarget.runSyntax(fstarget, input, undefined);
}
for (const t of node.findDirectExpressions(Expressions.ComponentCond)) {
ComponentCond.runSyntax(t, input);
}
}
} |