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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 12x 12x 7x 7x 7x 12x 36x 36x 36x 9x 9x 9x 9x 9x 36x 2x 2x 36x 12x 36x 24x 36x 1x 1x 1x 1x 23x 36x 36x 5x 5x 10x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 23x 23x 23x 36x 36x 23x 23x 23x 23x 23x 1x | import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {IStructureComponent, StructureType, TableType, UnknownType, VoidType} from "../../types/basic";
import {BasicTypes} from "../basic_types";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {CheckSyntaxKey, SyntaxInput, syntaxIssue} from "../_syntax_input";
import {AssertError} from "../assert_error";
import {ReferenceType} from "../_reference";
export class IncludeType {
public runSyntax(node: StatementNode, input: SyntaxInput): IStructureComponent[] | VoidType | UnknownType {
const components: IStructureComponent[] = [];
const iname = node.findFirstExpression(Expressions.TypeName);
if (iname === undefined) {
throw new AssertError("IncludeType, unexpected node structure");
}
const firstToken = iname.getFirstToken();
const name = firstToken.getStr();
const isStructure = node.findDirectTokenByText("STRUCTURE") !== undefined;
let ityp = new BasicTypes(input).parseType(iname);
if ((ityp instanceof VoidType && isStructure) || ityp instanceof UnknownType) {
const found = input.scope.findVariable(name);
if (found) {
input.scope.addReference(firstToken, found, ReferenceType.DataReadReference, input.filename);
ityp = found.getType();
}
}
const as = node.findExpressionAfterToken("AS")?.concatTokens();
if (as && ityp instanceof StructureType) {
ityp = new StructureType(ityp.getComponents().concat([{
name: as,
type: ityp,
asInclude: true,
}]));
} else if (ityp instanceof TableType && isStructure) {
ityp = ityp.getRowType();
}
if (ityp instanceof VoidType) {
return ityp;
} else if (ityp instanceof UnknownType) {
return ityp;
}
if (!(ityp instanceof StructureType)) {
const message = "not structured, " + name;
input.issues.push(syntaxIssue(input, iname.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
const suffix = node.findExpressionAfterToken("SUFFIX")?.concatTokens();
if (suffix && ityp instanceof StructureType) {
const components: IStructureComponent[] = [];
for (const c of ityp.getComponents()) {
if (c.name === as) {
components.push({...c, suffix: suffix, asInclude: c.asInclude});
continue;
}
components.push({
name: c.name + suffix,
type: c.type,
});
}
ityp = new StructureType(components);
}
if (ityp
&& ityp instanceof TypedIdentifier
&& ityp.getType() instanceof StructureType) {
const stru = ityp.getType() as StructureType;
components.push(...stru.getComponents());
} else if (ityp && ityp instanceof StructureType) {
components.push(...ityp.getComponents());
} else if (ityp && ityp instanceof VoidType) {
return ityp;
} else if (input.scope.getDDIC().inErrorNamespace(name) === false) {
return VoidType.get(name);
} else {
const message = "IncludeType, type not found \"" + iname.concatTokens() + "\"";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
return components;
}
} |