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 93x 93x 93x 93x 93x 93x 93x 93x 93x 93x 93x 93x 91x 91x 93x 93x 2x 2x 93x 41x 41x 93x 93x 93x 93x 1x 1x 92x 92x 92x 92x 92x 92x 92x 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; } } |