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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 99x 99x 99x 99x 99x 99x 99x 99x 99x 99x 99x 99x 97x 97x 99x 99x 2x 2x 99x 45x 45x 99x 99x 99x 99x 1x 1x 98x 98x 98x 98x 98x 98x 98x 1x | import {ExpressionNode, StatementNode} from "../../nodes"; import {CurrentScope} from "../_current_scope"; import {TypedIdentifier, IdentifierMeta} from "../../types/_typed_identifier"; import {Source} from "./source"; import * as Expressions from "../../2_statements/expressions"; import {AbstractType} from "../../types/basic/_abstract_type"; import {BasicTypes} from "../basic_types"; import {UnknownType} from "../../types/basic/unknown_type"; import {ReferenceType} from "../_reference"; export class InlineFieldDefinition { public runSyntax( node: ExpressionNode | StatementNode, scope: CurrentScope, filename: string, targetType?: AbstractType): AbstractType | undefined { let type: AbstractType | undefined = undefined; const field = node.findDirectExpression(Expressions.Field)?.getFirstToken(); if (field === undefined) { return undefined; } const source = node.findDirectExpression(Expressions.Source); if (source) { type = new Source().runSyntax(source, scope, filename); } const typeName = node.findDirectExpression(Expressions.TypeName); if (typeName) { type = new BasicTypes(filename, scope).parseType(typeName); } if (targetType !== undefined) { type = targetType; } if (type === undefined) { type = new UnknownType("InlineFieldDefinition, fallback"); } const name = field.getStr(); if (scope.findVariable(name) !== undefined) { throw new Error(`Variable ${name} already defined`); } const identifier = new TypedIdentifier(field, filename, type, [IdentifierMeta.InlineDefinition]); scope.addReference(field, identifier, ReferenceType.DataWriteReference, filename); scope.addIdentifier(identifier); return type; } } |