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 69 70 71 72 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 2x 2x 2x 2x 2x 8x 8x 8x 8x 8x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8x 8x 8x 8x 8x 8x 8x 8x 8x 10x 8x 8x 8x 8x 8x 1x | import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {UnknownType, TableType, StructureType, CharacterType, VoidType, TableKeyType} from "../../types/basic";
import {BasicTypes} from "../basic_types";
import {Dynamic} from "../expressions/dynamic";
import {StatementSyntax} from "../_statement_syntax";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
import {Identifier} from "../../1_lexer/tokens";
export class SelectOption implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
const nameExpression = node.findFirstExpression(Expressions.FieldSub);
if (nameExpression === undefined) {
return;
}
let nameToken = nameExpression.getFirstToken();
// FieldSub can include dashes and optional length, eg s-matnr or s_name(10).
if (nameExpression.getChildren().length > 1) {
const fullName = nameExpression.concatTokens().replace(/\(.+$/, "").replace(/\[\]$/, "");
nameToken = new Identifier(nameToken.getStart(), fullName);
}
if (nameToken && nameToken.getStr().length > 8) {
const message = "Select-option name too long, " + nameToken.getStr();
input.issues.push(syntaxIssue(input, nameToken, message));
return;
}
for (const d of node.findDirectExpressions(Expressions.Dynamic)) {
Dynamic.runSyntax(d, input);
input.scope.addIdentifier(
new TypedIdentifier(nameToken, input.filename, VoidType.get("DYNAMIC_SELECT_OPTION")));
return;
}
const nameChain = node.findFirstExpression(Expressions.FieldChain);
let found = new BasicTypes(input).resolveLikeName(nameChain);
if (found) {
if (found instanceof StructureType) {
let length = 0;
for (const c of found.getComponents()) {
if (c.type instanceof CharacterType) {
length += c.type.getLength();
}
}
if (length === 0) {
found = VoidType.get("Selectoption, fallback");
} else {
found = new CharacterType(length);
}
}
const stru = new StructureType([
{name: "SIGN", type: new CharacterType(1)},
{name: "OPTION", type: new CharacterType(2)},
{name: "LOW", type: found},
{name: "HIGH", type: found},
]);
input.scope.addIdentifier(
new TypedIdentifier(nameToken, input.filename, new TableType(stru, {withHeader: true, keyType: TableKeyType.default})));
} else {
input.scope.addIdentifier(
new TypedIdentifier(nameToken, input.filename, new UnknownType("Select option, fallback")));
}
const magicName = "%_" + nameToken.getStr() + "_%_app_%";
const magicToken = new Identifier(nameToken.getStart(), magicName);
input.scope.addIdentifier(new TypedIdentifier(magicToken, input.filename, VoidType.get("SELECT-OPTION magic")));
}
} |