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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 135x 135x 135x 135x 135x 135x 135x 40x 40x 95x 95x 95x 95x 95x 135x 70x 70x 2x 2x 2x 2x 68x 68x 68x 70x 30x 30x 70x 16x 16x 16x 16x 51x 51x 51x 70x 5x 5x 5x 5x 5x 51x 135x 25x 25x 25x 1x 1x 25x 24x 25x 1x 1x 1x 1x 25x 74x 74x 74x 1x 1x | import {INode} from "../../nodes/_inode";
import {AbstractType} from "../../types/basic/_abstract_type";
import {VoidType} from "../../types/basic/void_type";
import {StructureType} from "../../types/basic/structure_type";
import {ObjectReferenceType} from "../../types/basic/object_reference_type";
import {ObjectOriented} from "../_object_oriented";
import {DataReference} from "../../types/basic/data_reference_type";
import {ReferenceType} from "../_reference";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {AnyType} from "../../types/basic";
import {CheckSyntaxKey, SyntaxInput, syntaxIssue} from "../_syntax_input";
export class AttributeName {
public static runSyntax(
context: AbstractType | undefined,
node: INode,
input: SyntaxInput,
type?: ReferenceType | ReferenceType[] | undefined,
error = true): AbstractType | undefined {
if (context instanceof VoidType) {
return context;
}
const helper = new ObjectOriented(input.scope);
let ret: AbstractType | undefined = undefined;
if (context instanceof ObjectReferenceType) {
const def = input.scope.findObjectDefinition(context.getIdentifierName());
if (def === undefined) {
const message = "Definition for \"" + context.getIdentifierName() + "\" not found in scope(AttributeName)";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
const token = node.getFirstToken();
const name = token.getStr();
let found: TypedIdentifier | undefined = helper.searchAttributeName(def, name);
if (found === undefined) {
found = helper.searchConstantName(def, name);
}
if (found === undefined) {
const message = "Attribute or constant \"" + name + "\" not found in \"" + def.getName() + "\"";
if (error === true) {
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
}
return VoidType.get(CheckSyntaxKey);
}
if (type) {
input.scope.addReference(token, found, type, input.filename);
}
if (found && name.includes("~")) {
const idef = input.scope.findInterfaceDefinition(name.split("~")[0]);
if (idef) {
input.scope.addReference(token, idef, ReferenceType.ObjectOrientedReference, input.filename);
}
}
ret = found.getType();
} else if (context instanceof DataReference) {
const sub = context.getType();
const name = node.getFirstToken().getStr();
if (name === "*" || sub instanceof VoidType || sub instanceof AnyType) {
return sub;
}
if (!(sub instanceof StructureType)) {
const message = "Data reference not structured";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
ret = sub.getComponentByName(name);
if (ret === undefined) {
const message = "Component \"" + name + "\" not found in data reference structure";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
} else {
const message = "Not an object reference, attribute name";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
return ret;
}
} |