ifc-expressions 2.3.0 → 3.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -30
- package/dist/IfcExpression.d.ts +24 -26
- package/dist/IfcExpressionErrorListener.d.ts +3 -3
- package/dist/IfcExpressionOptions.d.ts +4 -0
- package/dist/autocomplete/CompletionItem.d.ts +24 -0
- package/dist/autocomplete/IfcExpressionAutocomplete.d.ts +11 -0
- package/dist/builtin/BuiltinRuntimeValueConverter.d.ts +7 -0
- package/dist/builtin/BuiltinVariableRegistry.d.ts +50 -0
- package/dist/cjs/IfcExpression.js +112 -37
- package/dist/cjs/IfcExpression.js.map +1 -1
- package/dist/cjs/IfcExpressionErrorListener.js +3 -8
- package/dist/cjs/IfcExpressionErrorListener.js.map +1 -1
- package/dist/cjs/IfcExpressionOptions.js +3 -0
- package/dist/cjs/IfcExpressionOptions.js.map +1 -0
- package/dist/cjs/autocomplete/CompletionItem.js +3 -0
- package/dist/cjs/autocomplete/CompletionItem.js.map +1 -0
- package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js +654 -0
- package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
- package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js +124 -0
- package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
- package/dist/cjs/builtin/BuiltinVariableRegistry.js +405 -0
- package/dist/cjs/builtin/BuiltinVariableRegistry.js.map +1 -0
- package/dist/cjs/compiler/ExprCompiler.js +44 -41
- package/dist/cjs/compiler/ExprCompiler.js.map +1 -1
- package/dist/cjs/compiler/ExprManager.js.map +1 -1
- package/dist/cjs/compiler/IfcExpressionValidationListener.js +85 -25
- package/dist/cjs/compiler/IfcExpressionValidationListener.js.map +1 -1
- package/dist/cjs/compiler/TypeManager.js.map +1 -1
- package/dist/cjs/context/IfcExpressionContext.js.map +1 -1
- package/dist/cjs/context/NopContext.js +3 -0
- package/dist/cjs/context/NopContext.js.map +1 -1
- package/dist/cjs/documentation/Documentation.js +11 -0
- package/dist/cjs/documentation/Documentation.js.map +1 -0
- package/dist/cjs/error/ExpressionTypeError.js.map +1 -1
- package/dist/cjs/error/IfcExpressionBuiltinConfigException.js +10 -0
- package/dist/cjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
- package/dist/cjs/error/InvalidSyntaxException.js.map +1 -1
- package/dist/cjs/error/NoSuchFunctionException.js.map +1 -1
- package/dist/cjs/error/NoSuchMemberException.js +13 -0
- package/dist/cjs/error/NoSuchMemberException.js.map +1 -0
- package/dist/cjs/error/ValidationException.js.map +1 -1
- package/dist/cjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
- package/dist/cjs/expression/ExprKind.js +3 -0
- package/dist/cjs/expression/ExprKind.js.map +1 -1
- package/dist/cjs/expression/function/Func.js +18 -14
- package/dist/cjs/expression/function/Func.js.map +1 -1
- package/dist/cjs/expression/function/FuncArg.js +11 -5
- package/dist/cjs/expression/function/FuncArg.js.map +1 -1
- package/dist/cjs/expression/function/IfcExpressionFunctions.js +198 -42
- package/dist/cjs/expression/function/IfcExpressionFunctions.js.map +1 -1
- package/dist/cjs/expression/function/impl/CHOOSE.js.map +1 -1
- package/dist/cjs/expression/function/impl/IF.js.map +1 -1
- package/dist/cjs/expression/function/impl/MAP.js.map +1 -1
- package/dist/cjs/expression/function/impl/ReplacePattern.js +20 -2
- package/dist/cjs/expression/function/impl/ReplacePattern.js.map +1 -1
- package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js +59 -0
- package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
- package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js +34 -0
- package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
- package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js +29 -0
- package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
- package/dist/cjs/gen/parser/IfcExpressionLexer.js +126 -104
- package/dist/cjs/gen/parser/IfcExpressionLexer.js.map +1 -1
- package/dist/cjs/gen/parser/IfcExpressionListener.js +7 -4
- package/dist/cjs/gen/parser/IfcExpressionListener.js.map +1 -1
- package/dist/cjs/gen/parser/IfcExpressionParser.js +739 -682
- package/dist/cjs/gen/parser/IfcExpressionParser.js.map +1 -1
- package/dist/cjs/gen/parser/IfcExpressionVisitor.js +4 -4
- package/dist/cjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/type/ContextObjectType.js +45 -0
- package/dist/cjs/type/ContextObjectType.js.map +1 -0
- package/dist/cjs/type/Types.js +4 -6
- package/dist/cjs/type/Types.js.map +1 -1
- package/dist/cjs/value/ContextObjectValue.js +23 -0
- package/dist/cjs/value/ContextObjectValue.js.map +1 -0
- package/dist/cjs/value/ExpressionValue.js.map +1 -1
- package/dist/cjs/value/Value.js.map +1 -1
- package/dist/compiler/ExprCompiler.d.ts +8 -3
- package/dist/compiler/ExprManager.d.ts +1 -1
- package/dist/compiler/IfcExpressionValidationListener.d.ts +9 -3
- package/dist/compiler/TypeManager.d.ts +1 -1
- package/dist/context/IfcExpressionContext.d.ts +3 -4
- package/dist/context/NopContext.d.ts +1 -0
- package/dist/documentation/Documentation.d.ts +12 -0
- package/dist/error/ExpressionTypeError.d.ts +1 -1
- package/dist/error/IfcExpressionBuiltinConfigException.d.ts +3 -0
- package/dist/error/InvalidSyntaxException.d.ts +1 -1
- package/dist/error/NoSuchFunctionException.d.ts +1 -1
- package/dist/error/NoSuchMemberException.d.ts +6 -0
- package/dist/error/ValidationException.d.ts +1 -1
- package/dist/error/WrongFunctionArgumentTypeException.d.ts +1 -1
- package/dist/expression/ExprKind.d.ts +3 -0
- package/dist/expression/function/Func.d.ts +7 -21
- package/dist/expression/function/FuncArg.d.ts +6 -5
- package/dist/expression/function/IfcExpressionFunctions.d.ts +1 -0
- package/dist/expression/function/impl/CHOOSE.d.ts +1 -1
- package/dist/expression/function/impl/IF.d.ts +1 -1
- package/dist/expression/function/impl/MAP.d.ts +1 -1
- package/dist/expression/reference/BuiltinFunctionCallExpr.d.ts +19 -0
- package/dist/expression/reference/BuiltinPropertyAccessExpr.d.ts +15 -0
- package/dist/expression/reference/BuiltinRootReferenceExpr.d.ts +14 -0
- package/dist/gen/parser/IfcExpressionLexer.d.ts +9 -8
- package/dist/gen/parser/IfcExpressionListener.d.ts +89 -59
- package/dist/gen/parser/IfcExpressionParser.d.ts +192 -169
- package/dist/gen/parser/IfcExpressionVisitor.d.ts +51 -35
- package/dist/index.d.ts +2 -2
- package/dist/mjs/IfcExpression.js +104 -32
- package/dist/mjs/IfcExpression.js.map +1 -1
- package/dist/mjs/IfcExpressionErrorListener.js +3 -8
- package/dist/mjs/IfcExpressionErrorListener.js.map +1 -1
- package/dist/mjs/IfcExpressionOptions.js +2 -0
- package/dist/mjs/IfcExpressionOptions.js.map +1 -0
- package/dist/mjs/autocomplete/CompletionItem.js +2 -0
- package/dist/mjs/autocomplete/CompletionItem.js.map +1 -0
- package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js +650 -0
- package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
- package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js +117 -0
- package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
- package/dist/mjs/builtin/BuiltinVariableRegistry.js +399 -0
- package/dist/mjs/builtin/BuiltinVariableRegistry.js.map +1 -0
- package/dist/mjs/compiler/ExprCompiler.js +43 -40
- package/dist/mjs/compiler/ExprCompiler.js.map +1 -1
- package/dist/mjs/compiler/ExprManager.js.map +1 -1
- package/dist/mjs/compiler/IfcExpressionValidationListener.js +85 -22
- package/dist/mjs/compiler/IfcExpressionValidationListener.js.map +1 -1
- package/dist/mjs/compiler/TypeManager.js.map +1 -1
- package/dist/mjs/context/IfcExpressionContext.js.map +1 -1
- package/dist/mjs/context/NopContext.js +3 -0
- package/dist/mjs/context/NopContext.js.map +1 -1
- package/dist/mjs/documentation/Documentation.js +7 -0
- package/dist/mjs/documentation/Documentation.js.map +1 -0
- package/dist/mjs/error/ExpressionTypeError.js.map +1 -1
- package/dist/mjs/error/IfcExpressionBuiltinConfigException.js +6 -0
- package/dist/mjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
- package/dist/mjs/error/InvalidSyntaxException.js.map +1 -1
- package/dist/mjs/error/NoSuchFunctionException.js.map +1 -1
- package/dist/mjs/error/NoSuchMemberException.js +9 -0
- package/dist/mjs/error/NoSuchMemberException.js.map +1 -0
- package/dist/mjs/error/ValidationException.js.map +1 -1
- package/dist/mjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
- package/dist/mjs/expression/ExprKind.js +3 -0
- package/dist/mjs/expression/ExprKind.js.map +1 -1
- package/dist/mjs/expression/function/Func.js +18 -14
- package/dist/mjs/expression/function/Func.js.map +1 -1
- package/dist/mjs/expression/function/FuncArg.js +11 -5
- package/dist/mjs/expression/function/FuncArg.js.map +1 -1
- package/dist/mjs/expression/function/IfcExpressionFunctions.js +198 -42
- package/dist/mjs/expression/function/IfcExpressionFunctions.js.map +1 -1
- package/dist/mjs/expression/function/impl/CHOOSE.js.map +1 -1
- package/dist/mjs/expression/function/impl/IF.js.map +1 -1
- package/dist/mjs/expression/function/impl/MAP.js.map +1 -1
- package/dist/mjs/expression/function/impl/ReplacePattern.js +20 -2
- package/dist/mjs/expression/function/impl/ReplacePattern.js.map +1 -1
- package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js +55 -0
- package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
- package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js +30 -0
- package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
- package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js +25 -0
- package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
- package/dist/mjs/gen/parser/IfcExpressionLexer.js +101 -104
- package/dist/mjs/gen/parser/IfcExpressionLexer.js.map +1 -1
- package/dist/mjs/gen/parser/IfcExpressionListener.js +5 -3
- package/dist/mjs/gen/parser/IfcExpressionListener.js.map +1 -1
- package/dist/mjs/gen/parser/IfcExpressionParser.js +700 -670
- package/dist/mjs/gen/parser/IfcExpressionParser.js.map +1 -1
- package/dist/mjs/gen/parser/IfcExpressionVisitor.js +2 -3
- package/dist/mjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
- package/dist/mjs/index.js +1 -1
- package/dist/mjs/index.js.map +1 -1
- package/dist/mjs/type/ContextObjectType.js +41 -0
- package/dist/mjs/type/ContextObjectType.js.map +1 -0
- package/dist/mjs/type/Types.js +4 -6
- package/dist/mjs/type/Types.js.map +1 -1
- package/dist/mjs/value/ContextObjectValue.js +19 -0
- package/dist/mjs/value/ContextObjectValue.js.map +1 -0
- package/dist/mjs/value/ExpressionValue.js.map +1 -1
- package/dist/mjs/value/Value.js.map +1 -1
- package/dist/type/ContextObjectType.d.ts +17 -0
- package/dist/type/Types.d.ts +2 -6
- package/dist/value/ContextObjectValue.d.ts +11 -0
- package/dist/value/ExpressionValue.d.ts +2 -1
- package/dist/value/Value.d.ts +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["builtin/BuiltinVariableRegistry.ts"],"names":[],"mappings":"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","file":"builtin/BuiltinVariableRegistry.js","sourcesContent":["import { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { IfcExpressionBuiltinConfigException } from \"../error/IfcExpressionBuiltinConfigException.js\";\nimport { ExprType } from \"../type/ExprType.js\";\nimport { Type, Types } from \"../type/Types.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { BuiltinRootReferenceExpr } from \"../expression/reference/BuiltinRootReferenceExpr.js\";\nimport { ElemObjectReferenceExpr } from \"../expression/reference/ElemObjectReferenceExpr.js\";\nimport { PropObjectReferenceExpr } from \"../expression/reference/PropObjectReferenceExpr.js\";\nimport {\n ArgumentDocumentation,\n LocalizedText,\n} from \"../documentation/Documentation.js\";\n\nexport type BuiltinPropertyDefinition = {\n name: string;\n kind: \"property\";\n valueType: ExprType;\n documentation?: LocalizedText;\n};\n\nexport type BuiltinFunctionDefinition = {\n name: string;\n kind: \"function\";\n returnType: ExprType;\n argumentTypes: Array<ExprType>;\n documentation?: LocalizedText;\n argumentDocumentation?: Array<ArgumentDocumentation>;\n};\n\nexport type BuiltinMemberDefinition =\n | BuiltinPropertyDefinition\n | BuiltinFunctionDefinition;\n\nexport function isBuiltinPropertyDefinition(\n definition: BuiltinMemberDefinition | undefined\n): definition is BuiltinPropertyDefinition {\n return definition?.kind === \"property\";\n}\n\nexport function isBuiltinFunctionDefinition(\n definition: BuiltinMemberDefinition | undefined\n): definition is BuiltinFunctionDefinition {\n return definition?.kind === \"function\";\n}\n\nexport type BuiltinVariableDefinition = {\n name: string;\n type?: ExprType;\n documentation?: LocalizedText;\n members?: Array<BuiltinMemberDefinition>;\n createReferenceExpr?: () => Expr<any>;\n};\n\nexport type RegisteredBuiltinVariableDefinition = {\n name: string;\n type: ExprType;\n documentation?: LocalizedText;\n members: Map<string, BuiltinMemberDefinition>;\n createReferenceExpr: () => Expr<any>;\n};\n\nfunction normalizeBuiltinName(name: string): string {\n return name?.replace(/^\\$/, \"\").toUpperCase();\n}\n\ntype StandardIfcObjectTypes = {\n elementType: ContextObjectType;\n propertyType: ContextObjectType;\n propertySetType: ContextObjectType;\n typeObjectType: ContextObjectType;\n};\n\nfunction memberArg(\n labelKey: string,\n labelFallback: string,\n summaryKey: string,\n summaryFallback: string\n): ArgumentDocumentation {\n return {\n label: { key: labelKey, fallback: labelFallback },\n documentation: { key: summaryKey, fallback: summaryFallback },\n };\n}\n\nfunction createStandardIfcObjectTypes(): StandardIfcObjectTypes {\n const elementMembers = new Map<string, BuiltinMemberDefinition>();\n const propertyMembers = new Map<string, BuiltinMemberDefinition>();\n const propertySetMembers = new Map<string, BuiltinMemberDefinition>();\n const typeObjectMembers = new Map<string, BuiltinMemberDefinition>();\n\n const propertyType = new ContextObjectType(\n Type.IFC_PROPERTY_REF.getName(),\n Type.IFC_PROPERTY_REF,\n propertyMembers\n );\n const propertySetType = new ContextObjectType(\n Type.IFC_PROPERTY_SET_REF.getName(),\n Type.IFC_PROPERTY_SET_REF,\n propertySetMembers\n );\n const typeObjectType = new ContextObjectType(\n Type.IFC_TYPE_OBJECT_REF.getName(),\n Type.IFC_TYPE_OBJECT_REF,\n typeObjectMembers\n );\n const elementType = new ContextObjectType(\n Type.IFC_ELEMENT_REF.getName(),\n Type.IFC_ELEMENT_REF,\n elementMembers\n );\n\n standardIfcElementMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n elementMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcPropertyMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n propertyMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcPropertySetMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n propertySetMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcTypeObjectMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n typeObjectMembers.set(normalizeBuiltinName(member.name), member);\n });\n\n return {\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n };\n}\n\nfunction standardIfcElementMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.name.summary\",\n fallback: \"name(): name of the current IFC element\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC element\",\n },\n },\n {\n name: \"ifcClass\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.ifcClass.summary\",\n fallback: \"ifcClass(): IFC class name of the current element\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.description.summary\",\n fallback: \"description(): description of the current IFC element\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$element.property.summary\",\n fallback: \"property(name): property of the current IFC element by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$element.property.arg.name.label\",\n \"name\",\n \"builtin.$element.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$element.propertySet.summary\",\n fallback:\n \"propertySet(name): property set of the current IFC element by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$element.propertySet.arg.name.label\",\n \"name\",\n \"builtin.$element.propertySet.arg.name.summary\",\n \"The name of the property set to resolve\"\n ),\n ],\n },\n {\n name: \"type\",\n kind: \"function\",\n returnType: types.typeObjectType,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.type.summary\",\n fallback: \"type(): type object of the current IFC element\",\n },\n },\n ];\n}\n\nfunction standardIfcPropertyMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.name.summary\",\n fallback: \"name(): name of the current IFC property\",\n },\n },\n {\n name: \"ifcClass\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.ifcClass.summary\",\n fallback: \"ifcClass(): IFC class name of the current property\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.description.summary\",\n fallback: \"description(): description of the current IFC property\",\n },\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.propertySet.summary\",\n fallback:\n \"propertySet(): property set containing the current IFC property\",\n },\n },\n {\n name: \"value\",\n kind: \"function\",\n returnType: Types.or(Type.STRING, Type.NUMERIC, Type.BOOLEAN, Type.ARRAY),\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.value.summary\",\n fallback: \"value(): value of the current IFC property\",\n },\n },\n ];\n}\n\nfunction standardIfcPropertySetMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.name.summary\",\n fallback: \"name(): name of the current IFC property set\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC property set\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.description.summary\",\n fallback: \"description(): description of the current IFC property set\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$propertySet.property.summary\",\n fallback:\n \"property(name): property of the current IFC property set by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$propertySet.property.arg.name.label\",\n \"name\",\n \"builtin.$propertySet.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n ];\n}\n\nfunction standardIfcTypeObjectMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.name.summary\",\n fallback: \"name(): name of the current IFC type object\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC type object\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.description.summary\",\n fallback: \"description(): description of the current IFC type object\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$typeObject.property.summary\",\n fallback:\n \"property(name): property of the current IFC type object by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$typeObject.property.arg.name.label\",\n \"name\",\n \"builtin.$typeObject.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$typeObject.propertySet.summary\",\n fallback:\n \"propertySet(name): property set of the current IFC type object by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$typeObject.propertySet.arg.name.label\",\n \"name\",\n \"builtin.$typeObject.propertySet.arg.name.summary\",\n \"The name of the property set to resolve\"\n ),\n ],\n },\n ];\n}\n\nconst standardIfcObjectTypes = createStandardIfcObjectTypes();\n\nexport class BuiltinVariableRegistry {\n private static readonly defaultRegistry = new BuiltinVariableRegistry([\n {\n name: \"element\",\n type: Type.IFC_ELEMENT_REF,\n documentation: {\n key: \"builtin.$element.summary\",\n fallback: \"$element: IFC element from the evaluation context\",\n },\n members: standardIfcElementMembers(standardIfcObjectTypes),\n createReferenceExpr: () => new ElemObjectReferenceExpr(),\n },\n {\n name: \"property\",\n type: Type.IFC_PROPERTY_REF,\n documentation: {\n key: \"builtin.$property.summary\",\n fallback: \"$property: IFC property from the evaluation context\",\n },\n members: standardIfcPropertyMembers(standardIfcObjectTypes),\n createReferenceExpr: () => new PropObjectReferenceExpr(),\n },\n ]);\n\n private readonly builtinVariables: Map<\n string,\n RegisteredBuiltinVariableDefinition\n >;\n\n constructor(definitions: Array<BuiltinVariableDefinition> = []) {\n this.builtinVariables = new Map();\n definitions.forEach((definition) => this.register(definition));\n }\n\n public static getDefaultRegistry() {\n return this.defaultRegistry;\n }\n\n public static normalizeName(name: string): string {\n return normalizeBuiltinName(name);\n }\n\n public static isBuiltinVariable(name: string): boolean {\n return this.defaultRegistry.isBuiltinVariable(name);\n }\n\n public static isReservedName(name: string): boolean {\n return this.defaultRegistry.isReservedName(name);\n }\n\n public static getDefinition(\n name: string\n ): RegisteredBuiltinVariableDefinition | undefined {\n return this.defaultRegistry.getDefinition(name);\n }\n\n public isBuiltinVariable(name: string): boolean {\n return this.builtinVariables.has(\n BuiltinVariableRegistry.normalizeName(name)\n );\n }\n\n public isReservedName(name: string): boolean {\n return this.isBuiltinVariable(name);\n }\n\n public getDefinition(\n name: string\n ): RegisteredBuiltinVariableDefinition | undefined {\n return this.builtinVariables.get(\n BuiltinVariableRegistry.normalizeName(name)\n );\n }\n\n public getDefinitions(): Array<RegisteredBuiltinVariableDefinition> {\n return [...this.builtinVariables.values()];\n }\n\n private register(definition: BuiltinVariableDefinition) {\n const normalizedName = BuiltinVariableRegistry.normalizeName(\n definition.name\n );\n if (this.builtinVariables.has(normalizedName)) {\n throw new IfcExpressionBuiltinConfigException(\n `cannot register builtin variable with name '${definition.name}': name already in use`\n );\n }\n const members = this.registerMembers(definition);\n const baseType =\n definition.type ??\n (members.size > 0 ? Type.CONTEXT_OBJECT_REF : Type.ANY);\n const resolvedType =\n members.size > 0\n ? new ContextObjectType(definition.name, baseType, members)\n : baseType;\n const createReferenceExpr =\n definition.createReferenceExpr ??\n (() => new BuiltinRootReferenceExpr(definition.name, resolvedType));\n this.builtinVariables.set(normalizedName, {\n name: definition.name,\n type: resolvedType,\n documentation: definition.documentation,\n members,\n createReferenceExpr,\n });\n }\n\n private registerMembers(definition: BuiltinVariableDefinition) {\n const members = new Map<string, BuiltinMemberDefinition>();\n definition.members?.forEach((member) => {\n const normalizedMemberName = BuiltinVariableRegistry.normalizeName(\n member.name\n );\n if (members.has(normalizedMemberName)) {\n throw new IfcExpressionBuiltinConfigException(\n `cannot register member '${member.name}' for builtin '${definition.name}': name already in use`\n );\n }\n members.set(normalizedMemberName, member);\n });\n return members;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import IfcExpressionVisitor from "../gen/parser/IfcExpressionVisitor.js";
|
|
1
|
+
import { IfcExpressionVisitor } from "../gen/parser/IfcExpressionVisitor.js";
|
|
2
2
|
import { NumericLiteralExpr } from "../expression/numeric/NumericLiteralExpr.js";
|
|
3
3
|
import { isNullish, isPresent } from "../util/IfcExpressionUtils.js";
|
|
4
4
|
import Decimal from "decimal.js";
|
|
@@ -6,8 +6,6 @@ import { PlusExpr } from "../expression/numeric/PlusExpr.js";
|
|
|
6
6
|
import { MinusExpr } from "../expression/numeric/MinusExpr.js";
|
|
7
7
|
import { MultiplyExpr } from "../expression/numeric/MultiplyExpr.js";
|
|
8
8
|
import { DivideExpr } from "../expression/numeric/DivideExpr.js";
|
|
9
|
-
import { PropObjectReferenceExpr } from "../expression/reference/PropObjectReferenceExpr.js";
|
|
10
|
-
import { ElemObjectReferenceExpr } from "../expression/reference/ElemObjectReferenceExpr.js";
|
|
11
9
|
import { StringLiteralExpr } from "../expression/string/StringLiteralExpr.js";
|
|
12
10
|
import { ArrayExpr } from "../expression/structure/ArrayExpr.js";
|
|
13
11
|
import { FunctionExpr } from "../expression/function/FunctionExpr.js";
|
|
@@ -32,19 +30,24 @@ import { LessThanOrEqual } from "../expression/comparison/LessThanOrEqual.js";
|
|
|
32
30
|
import { ExprManager } from "./ExprManager.js";
|
|
33
31
|
import { LogicalValue } from "../value/LogicalValue.js";
|
|
34
32
|
import { LogicalLiteralExpr } from "../expression/boolean/LogicalLiteralExpr.js";
|
|
33
|
+
import { BuiltinVariableRegistry, isBuiltinFunctionDefinition, isBuiltinPropertyDefinition, } from "../builtin/BuiltinVariableRegistry.js";
|
|
34
|
+
import { ContextObjectType } from "../type/ContextObjectType.js";
|
|
35
|
+
import { BuiltinPropertyAccessExpr } from "../expression/reference/BuiltinPropertyAccessExpr.js";
|
|
36
|
+
import { BuiltinFunctionCallExpr } from "../expression/reference/BuiltinFunctionCallExpr.js";
|
|
35
37
|
export class ExprCompiler extends IfcExpressionVisitor {
|
|
36
|
-
|
|
38
|
+
defaultResult() {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
constructor(typeManager, builtinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()) {
|
|
37
42
|
super();
|
|
38
43
|
this.methodCallTargetStack = [];
|
|
39
44
|
this.visitExpr = (ctx) => {
|
|
40
45
|
return this.visit(ctx.singleExpr());
|
|
41
46
|
};
|
|
42
47
|
this.visitVariableRef = (ctx) => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
else if (ctx.IDENTIFIER().getText().toUpperCase() === "ELEMENT") {
|
|
47
|
-
return this.associateContextAndReturn(new ElemObjectReferenceExpr(), ctx);
|
|
48
|
+
const builtin = this.builtinVariableRegistry.getDefinition(ctx.IDENTIFIER().getText());
|
|
49
|
+
if (!isNullish(builtin)) {
|
|
50
|
+
return this.associateContextAndReturn(builtin.createReferenceExpr(), ctx);
|
|
48
51
|
}
|
|
49
52
|
throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);
|
|
50
53
|
};
|
|
@@ -88,21 +91,39 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
88
91
|
this.visitSEParenthesis = (ctx) => {
|
|
89
92
|
return this.associateContextAndReturn(new ParenthesisExpr(this.visit(ctx._sub)), ctx);
|
|
90
93
|
};
|
|
91
|
-
/*================================================
|
|
92
|
-
* MethodCallChain
|
|
93
|
-
*==============================================*/
|
|
94
94
|
this.visitMethodCallChainInner = (ctx) => {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.associateContextAndReturn(functionExpr, ctx.functionCall());
|
|
99
|
-
this.methodCallTargetStack.push(functionExpr);
|
|
100
|
-
return this.visit(ctx.methodCallChain());
|
|
95
|
+
const accessExpr = this.visit(ctx._target);
|
|
96
|
+
this.methodCallTargetStack.push(accessExpr);
|
|
97
|
+
return this.visit(ctx._call);
|
|
101
98
|
};
|
|
102
99
|
this.visitMethodCallChainEnd = (ctx) => {
|
|
103
|
-
return this.
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
return this.visit(ctx._call);
|
|
101
|
+
};
|
|
102
|
+
this.visitMethodFunctionCall = (ctx) => {
|
|
103
|
+
const targetExpr = this.methodCallTargetStack.pop();
|
|
104
|
+
const functionName = ctx.functionCall().IDENTIFIER().getText();
|
|
105
|
+
const args = isNullish(ctx.functionCall().exprList())
|
|
106
|
+
? []
|
|
107
|
+
: this.collectFunctionArguments(ctx.functionCall().exprList());
|
|
108
|
+
const targetType = targetExpr.getType();
|
|
109
|
+
if (targetType instanceof ContextObjectType) {
|
|
110
|
+
const member = targetType.getMemberDefinition(functionName);
|
|
111
|
+
if (isBuiltinFunctionDefinition(member)) {
|
|
112
|
+
return this.associateContextAndReturn(new BuiltinFunctionCallExpr(targetExpr, member.name, args, member.returnType, targetType.getName()), ctx);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return this.associateContextAndReturn(new FunctionExpr(functionName, [targetExpr, ...args]), ctx.functionCall());
|
|
116
|
+
};
|
|
117
|
+
this.visitMethodPropertyAccess = (ctx) => {
|
|
118
|
+
const targetExpr = this.methodCallTargetStack.pop();
|
|
119
|
+
const targetType = targetExpr.getType();
|
|
120
|
+
if (targetType instanceof ContextObjectType) {
|
|
121
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
122
|
+
if (isBuiltinPropertyDefinition(member)) {
|
|
123
|
+
return this.associateContextAndReturn(new BuiltinPropertyAccessExpr(targetExpr, member.name, member.valueType, targetType.getName()), ctx);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
throw new Error(`Parsing error: No property '${ctx.getText()}' found for type '${targetType.getName()}'`);
|
|
106
127
|
};
|
|
107
128
|
this.visitSEAddSub = (ctx) => {
|
|
108
129
|
this.typeManager.requireTypesOverlap(ctx._left, ctx._right);
|
|
@@ -125,17 +146,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
125
146
|
ExprCompiler.failNode(ctx);
|
|
126
147
|
}
|
|
127
148
|
};
|
|
128
|
-
/*================================================
|
|
129
|
-
* StringExpr
|
|
130
|
-
*===============================================*/
|
|
131
149
|
this.visitStringLiteral = (ctx) => {
|
|
132
150
|
const quotedString = ctx.QUOTED_STRING().getText();
|
|
133
151
|
const text = quotedString.substring(1, quotedString.length - 1);
|
|
134
152
|
return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);
|
|
135
153
|
};
|
|
136
|
-
/*================================================
|
|
137
|
-
* NumExpr
|
|
138
|
-
*===============================================*/
|
|
139
154
|
this.visitNumLiteral = (ctx) => {
|
|
140
155
|
let val = ctx.INT();
|
|
141
156
|
if (isPresent(val)) {
|
|
@@ -156,9 +171,6 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
156
171
|
this.visitSEUnaryMinus = (ctx) => {
|
|
157
172
|
return this.associateContextAndReturn(new UnaryMinusExpr(this.visit(ctx.singleExpr())), ctx);
|
|
158
173
|
};
|
|
159
|
-
/*================================================
|
|
160
|
-
* BooleanExpr
|
|
161
|
-
*===============================================*/
|
|
162
174
|
this.visitSEBooleanBinaryOp = (ctx) => {
|
|
163
175
|
switch (ctx._op.text) {
|
|
164
176
|
case "&&":
|
|
@@ -174,15 +186,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
174
186
|
return this.associateContextAndReturn(new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === "TRUE"), ctx);
|
|
175
187
|
};
|
|
176
188
|
this.visitLogicalLiteral = (ctx) => {
|
|
177
|
-
// the only literal we recognize is 'UNKNOWN' (true and false are boolean literals)
|
|
178
189
|
return this.associateContextAndReturn(new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE), ctx);
|
|
179
190
|
};
|
|
180
191
|
this.visitSENot = (ctx) => {
|
|
181
192
|
return this.associateContextAndReturn(new NotExpr(this.visit(ctx.singleExpr())), ctx);
|
|
182
193
|
};
|
|
183
|
-
/*================================================
|
|
184
|
-
* ArrayExpr
|
|
185
|
-
*===============================================*/
|
|
186
194
|
this.visitArrayExpr = (ctx) => {
|
|
187
195
|
return this.associateContextAndReturn(new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())), ctx);
|
|
188
196
|
};
|
|
@@ -199,9 +207,6 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
199
207
|
}
|
|
200
208
|
return [];
|
|
201
209
|
};
|
|
202
|
-
/*================================================
|
|
203
|
-
* FuncExpr
|
|
204
|
-
*===============================================*/
|
|
205
210
|
this.visitFunctionCall = (ctx) => {
|
|
206
211
|
const args = isNullish(ctx.exprList())
|
|
207
212
|
? []
|
|
@@ -226,13 +231,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
|
|
|
226
231
|
};
|
|
227
232
|
this.typeManager = typeManager;
|
|
228
233
|
this.exprManager = new ExprManager();
|
|
234
|
+
this.builtinVariableRegistry = builtinVariableRegistry;
|
|
229
235
|
}
|
|
230
236
|
getExprManager() {
|
|
231
237
|
return this.exprManager;
|
|
232
238
|
}
|
|
233
|
-
/*================================================
|
|
234
|
-
* VariableRef
|
|
235
|
-
*==============================================*/
|
|
236
239
|
associateContextAndReturn(expr, ctx) {
|
|
237
240
|
this.exprManager.registerExprWithContext(expr, ctx);
|
|
238
241
|
return expr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["compiler/ExprCompiler.ts"],"names":[],"mappings":"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","file":"compiler/ExprCompiler.js","sourcesContent":["import IfcExpressionVisitor from \"../gen/parser/IfcExpressionVisitor.js\";\nimport { NumericLiteralExpr } from \"../expression/numeric/NumericLiteralExpr.js\";\nimport {\n ArrayElementListContext,\n ArrayExprContext,\n BooleanLiteralContext,\n ExprContext,\n ExprListContext,\n FunctionCallContext,\n LiteralContext,\n LogicalLiteralContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n NumLiteralContext,\n SEAddSubContext,\n SEArrayExprContext,\n SEBooleanBinaryOpContext,\n SEComparisonContext,\n SEFunctionCallContext,\n SELiteralContext,\n SEMethodCallContext,\n SEMulDivContext,\n SENotContext,\n SEParenthesisContext,\n SEPowerContext,\n SEUnaryMinusContext,\n SEUnaryMultipleMinusContext,\n SEVariableRefContext,\n StringLiteralContext,\n VariableRefContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { isNullish, isPresent } from \"../util/IfcExpressionUtils.js\";\nimport Decimal from \"decimal.js\";\nimport { PlusExpr } from \"../expression/numeric/PlusExpr.js\";\nimport { MinusExpr } from \"../expression/numeric/MinusExpr.js\";\nimport { ParserRuleContext } from \"antlr4\";\nimport { MultiplyExpr } from \"../expression/numeric/MultiplyExpr.js\";\nimport { DivideExpr } from \"../expression/numeric/DivideExpr.js\";\nimport { PropObjectReferenceExpr } from \"../expression/reference/PropObjectReferenceExpr.js\";\nimport { ElemObjectReferenceExpr } from \"../expression/reference/ElemObjectReferenceExpr.js\";\nimport { StringLiteralExpr } from \"../expression/string/StringLiteralExpr.js\";\nimport { ArrayExpr } from \"../expression/structure/ArrayExpr.js\";\nimport { FunctionExpr } from \"../expression/function/FunctionExpr.js\";\nimport { PowerExpr } from \"../expression/numeric/PowerExpr.js\";\nimport { UnaryMinusExpr } from \"../expression/numeric/UnaryMinusExpr.js\";\nimport { AndExpr } from \"../expression/boolean/AndExpr.js\";\nimport { BooleanLiteralExpr } from \"../expression/boolean/BooleanLiteralExpr.js\";\nimport { OrExpr } from \"../expression/boolean/OrExpr.js\";\nimport { XorExpr } from \"../expression/boolean/XorExpr.js\";\nimport { SyntaxErrorException } from \"../error/SyntaxErrorException.js\";\nimport { NotExpr } from \"../expression/boolean/NotExpr.js\";\nimport { ParenthesisExpr } from \"../expression/structure/ParenthesisExpr.js\";\nimport { EqualsExpr } from \"../expression/comparison/EqualsExpr.js\";\nimport { NotEqualsExpr } from \"../expression/comparison/NotEqualsExpr.js\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { StringConcatExpr } from \"../expression/string/StringConcatExpr.js\";\nimport { PlusOrConcatExpr } from \"../expression/poly/PlusOrConcatExpr.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { GreaterThan } from \"../expression/comparison/GreaterThan.js\";\nimport { GreaterThanOrEqual } from \"../expression/comparison/GreaterThanOrEqual.js\";\nimport { LessThan } from \"../expression/comparison/LessThan.js\";\nimport { LessThanOrEqual } from \"../expression/comparison/LessThanOrEqual.js\";\nimport { ExprManager } from \"./ExprManager.js\";\nimport { LogicalValue } from \"../value/LogicalValue.js\";\nimport { LogicalLiteralExpr } from \"../expression/boolean/LogicalLiteralExpr.js\";\n\nexport class ExprCompiler extends IfcExpressionVisitor<Expr<any>> {\n private readonly methodCallTargetStack = [];\n private readonly typeManager: TypeManager;\n private readonly exprManager: ExprManager;\n\n constructor(typeManager: TypeManager) {\n super();\n this.typeManager = typeManager;\n this.exprManager = new ExprManager();\n }\n\n public getExprManager(): ExprManager {\n return this.exprManager;\n }\n\n visitExpr: (ctx: ExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.singleExpr());\n };\n\n /*================================================\n * VariableRef\n *==============================================*/\n\n private associateContextAndReturn(expr: Expr<any>, ctx: ParserRuleContext) {\n this.exprManager.registerExprWithContext(expr, ctx);\n return expr;\n }\n\n visitVariableRef: (ctx: VariableRefContext) => Expr<any> = (ctx) => {\n if (ctx.IDENTIFIER().getText().toUpperCase() === \"PROPERTY\") {\n return this.associateContextAndReturn(new PropObjectReferenceExpr(), ctx);\n } else if (ctx.IDENTIFIER().getText().toUpperCase() === \"ELEMENT\") {\n return this.associateContextAndReturn(new ElemObjectReferenceExpr(), ctx);\n }\n throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);\n };\n\n visitSEComparison: (ctx: SEComparisonContext) => Expr<any> = (ctx) => {\n const left = this.visit(ctx.singleExpr(0));\n const right = this.visit(ctx.singleExpr(1));\n switch (ctx.CMP_OP().getText()) {\n case \"==\":\n return this.associateContextAndReturn(new EqualsExpr(left, right), ctx);\n case \"!=\":\n return this.associateContextAndReturn(\n new NotEqualsExpr(left, right),\n ctx\n );\n case \">\":\n return this.associateContextAndReturn(\n new GreaterThan(left, right),\n ctx\n );\n case \">=\":\n return this.associateContextAndReturn(\n new GreaterThanOrEqual(left, right),\n ctx\n );\n case \"<\":\n return this.associateContextAndReturn(new LessThan(left, right), ctx);\n case \"<=\":\n return this.associateContextAndReturn(\n new LessThanOrEqual(left, right),\n ctx\n );\n }\n throw new Error(\n `Parsing error: comparison operator '${ctx\n .CMP_OP()\n .getText()}' not supported`\n );\n };\n\n visitSEMethodCall: (ctx: SEMethodCallContext) => Expr<any> = (ctx) => {\n this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));\n return this.visit(ctx.methodCallChain());\n };\n\n visitSELiteral: (ctx: SELiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.literal());\n };\n\n visitSEVariableRef: (ctx: SEVariableRefContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.variableRef());\n };\n visitSEArrayExpr: (ctx: SEArrayExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.arrayExpr());\n };\n visitSEFunctionCall: (ctx: SEFunctionCallContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.functionCall());\n };\n visitSEParenthesis: (ctx: SEParenthesisContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ParenthesisExpr(this.visit(ctx._sub)),\n ctx\n );\n };\n\n /*================================================\n * MethodCallChain\n *==============================================*/\n\n visitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => Expr<any> = (\n ctx\n ) => {\n const functionExpr = new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n );\n this.associateContextAndReturn(functionExpr, ctx.functionCall());\n this.methodCallTargetStack.push(functionExpr);\n return this.visit(ctx.methodCallChain());\n };\n\n visitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => Expr<any> = (\n ctx\n ) => {\n return this.associateContextAndReturn(\n new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n ),\n ctx.functionCall()\n );\n };\n\n visitSEAddSub: (ctx: SEAddSubContext) => Expr<any> = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n switch (ctx._op.text) {\n case \"+\":\n return this.makePlusExpr(ctx);\n case \"-\":\n return this.associateContextAndReturn(\n new MinusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n private makePlusExpr(ctx: SEAddSubContext) {\n if (this.typeManager.isNumeric(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new PlusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (this.typeManager.isString(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (\n this.typeManager.overlapsWithString(ctx._left, ctx._right) ||\n this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)\n ) {\n return this.associateContextAndReturn(\n new PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n throw new ExpressionTypeError(\n \"Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.\",\n ctx\n );\n }\n\n visitSEMulDiv: (ctx: SEMulDivContext) => Expr<any> = (ctx) => {\n switch (ctx._op.text) {\n case \"*\":\n return this.associateContextAndReturn(\n new MultiplyExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n case \"/\":\n return this.associateContextAndReturn(\n new DivideExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n /*================================================\n * StringExpr\n *===============================================*/\n\n visitStringLiteral: (ctx: StringLiteralContext) => Expr<any> = (ctx) => {\n const quotedString = ctx.QUOTED_STRING().getText();\n const text = quotedString.substring(1, quotedString.length - 1);\n return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);\n };\n\n /*================================================\n * NumExpr\n *===============================================*/\n\n visitNumLiteral: (ctx: NumLiteralContext) => Expr<any> = (ctx) => {\n let val = ctx.INT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n val = ctx.FLOAT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n ExprCompiler.failNode(ctx);\n };\n\n visitSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx.singleExpr());\n };\n visitSEPower: (ctx: SEPowerContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new PowerExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n };\n visitSEUnaryMinus: (ctx: SEUnaryMinusContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new UnaryMinusExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * BooleanExpr\n *===============================================*/\n\n visitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => Expr<any> = (\n ctx\n ) => {\n switch (ctx._op.text) {\n case \"&&\":\n return this.associateContextAndReturn(\n new AndExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"||\":\n return this.associateContextAndReturn(\n new OrExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"><\":\n return this.associateContextAndReturn(\n new XorExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n }\n throw new SyntaxErrorException(\n ctx._op.text,\n ctx._op.line,\n ctx._op.column,\n `Unknown boolean operator ${ctx._op.text}`\n );\n };\n\n visitBooleanLiteral: (ctx: BooleanLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === \"TRUE\"),\n ctx\n );\n };\n\n visitLogicalLiteral: (ctx: LogicalLiteralContext) => Expr<any> = (ctx) => {\n // the only literal we recognize is 'UNKNOWN' (true and false are boolean literals)\n return this.associateContextAndReturn(\n new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE),\n ctx\n );\n };\n\n visitSENot: (ctx: SENotContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new NotExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * ArrayExpr\n *===============================================*/\n\n visitArrayExpr: (ctx: ArrayExprContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())),\n ctx\n );\n };\n\n collectArrayElements: (ctx: ArrayElementListContext) => Array<Expr<any>> = (\n ctx\n ) => {\n if (!isNullish(ctx)) {\n const first = this.visit(ctx.singleExpr());\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n const arr = this.collectArrayElements(rest);\n arr.unshift(first);\n return arr;\n }\n return [first];\n }\n return [];\n };\n\n /*================================================\n * FuncExpr\n *===============================================*/\n\n visitFunctionCall: (ctx: FunctionCallContext) => Expr<any> = (ctx) => {\n const args = isNullish(ctx.exprList())\n ? []\n : this.collectFunctionArguments(ctx.exprList());\n return this.associateContextAndReturn(\n new FunctionExpr(ctx.IDENTIFIER().getText(), args),\n ctx\n );\n };\n\n collectFunctionArguments: (\n ctx: ExprListContext,\n resultSoFar?: Array<Expr<any>>\n ) => Array<Expr<any>> = (ctx, resultSoFar?: Array<Expr<any>>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.visit(ctx.singleExpr()));\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectFunctionArguments(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n private static failNode(ctx: ParserRuleContext) {\n throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);\n }\n\n visitLiteral: (ctx: LiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.getChild(0));\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["compiler/ExprCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAiCjF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAE7F,MAAM,OAAO,YAAa,SAAQ,oBAA+B;IACrD,aAAa;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,YACE,WAAwB,EACxB,0BAAmD,uBAAuB,CAAC,kBAAkB,EAAE;QAE/F,KAAK,EAAE,CAAC;QATO,0BAAqB,GAAqB,EAAE,CAAC;QAmB9D,cAAS,GAAoC,CAAC,GAAG,EAAE,EAAE;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC;QAOF,qBAAgB,GAA2C,CAAC,GAAG,EAAE,EAAE;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CACxD,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAC3B,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;aAC3E;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,sBAAiB,GAA4C,CAAC,GAAG,EAAE,EAAE;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC9B,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC1E,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,EAC9B,GAAG,CACJ,CAAC;gBACJ,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAC5B,GAAG,CACJ,CAAC;gBACJ,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EACnC,GAAG,CACJ,CAAC;gBACJ,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBACxE,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,EAChC,GAAG,CACJ,CAAC;aACL;YACD,MAAM,IAAI,KAAK,CACb,uCAAuC,GAAG;iBACvC,MAAM,EAAE;iBACR,OAAO,EAAE,iBAAiB,CAC9B,CAAC;QACJ,CAAC,CAAC;QAEF,sBAAiB,GAA4C,CAAC,GAAG,EAAE,EAAE;YACnE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,mBAAc,GAAyC,CAAC,GAAG,EAAE,EAAE;YAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,uBAAkB,GAA6C,CAAC,GAAG,EAAE,EAAE;YACrE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,qBAAgB,GAA2C,CAAC,GAAG,EAAE,EAAE;YACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,wBAAmB,GAA8C,CAAC,GAAG,EAAE,EAAE;YACvE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,uBAAkB,GAA6C,CAAC,GAAG,EAAE,EAAE;YACrE,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EACzC,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,8BAAyB,GAAoD,CAC3E,GAAG,EACH,EAAE;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,4BAAuB,GAAkD,CACvE,GAAG,EACH,EAAE;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,4BAAuB,GAAkD,CACvE,GAAG,EACH,EAAE;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACnD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,UAAU,YAAY,iBAAiB,EAAE;gBAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAC5D,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE;oBACvC,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,uBAAuB,CACzB,UAAU,EACV,MAAM,CAAC,IAAI,EACX,IAAI,EACJ,MAAM,CAAC,UAAU,EACjB,UAAU,CAAC,OAAO,EAAE,CACrB,EACD,GAAG,CACJ,CAAC;iBACH;aACF;YACD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,EACrD,GAAG,CAAC,YAAY,EAAE,CACnB,CAAC;QACJ,CAAC,CAAC;QAEF,8BAAyB,GAAoD,CAC3E,GAAG,EACH,EAAE;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC;YACpD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,UAAU,YAAY,iBAAiB,EAAE;gBAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE;oBACvC,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,yBAAyB,CAC3B,UAAU,EACV,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,SAAS,EAChB,UAAU,CAAC,OAAO,EAAE,CACrB,EACD,GAAG,CACJ,CAAC;iBACH;aACF;YACD,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,CAAC,OAAO,EAAE,qBAAqB,UAAU,CAAC,OAAO,EAAE,GAAG,CACzF,CAAC;QACJ,CAAC,CAAC;QAEF,kBAAa,GAAwC,CAAC,GAAG,EAAE,EAAE;YAC3D,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBACpB,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAChC,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC5D,GAAG,CACJ,CAAC;gBACJ;oBACE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC9B;QACH,CAAC,CAAC;QA8BF,kBAAa,GAAwC,CAAC,GAAG,EAAE,EAAE;YAC3D,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBACpB,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,YAAY,CACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC5B,EACD,GAAG,CACJ,CAAC;gBACJ,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,UAAU,CACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC5B,EACD,GAAG,CACJ,CAAC;gBACJ;oBACE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC9B;QACH,CAAC,CAAC;QAEF,uBAAkB,GAA6C,CAAC,GAAG,EAAE,EAAE;YACrE,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1E,CAAC,CAAC;QAEF,oBAAe,GAA0C,CAAC,GAAG,EAAE,EAAE;YAC/D,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;YACpB,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;gBAClB,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAClD,GAAG,CACJ,CAAC;aACH;YACD,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;gBAClB,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAClD,GAAG,CACJ,CAAC;aACH;YACD,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,8BAAyB,GAAoD,CAC3E,GAAG,EACH,EAAE;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,iBAAY,GAAuC,CAAC,GAAG,EAAE,EAAE;YACzD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC5D,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QACF,sBAAiB,GAA4C,CAAC,GAAG,EAAE,EAAE;YACnE,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAChD,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,2BAAsB,GAAiD,CACrE,GAAG,EACH,EAAE;YACF,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBACpB,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,OAAO,CACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAC9B,EACD,GAAG,CACJ,CAAC;gBACJ,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,MAAM,CACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAC9B,EACD,GAAG,CACJ,CAAC;gBACJ,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,OAAO,CACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAC9B,EACD,GAAG,CACJ,CAAC;aACL;YACD,MAAM,IAAI,oBAAoB,CAC5B,GAAG,CAAC,GAAG,CAAC,IAAI,EACZ,GAAG,CAAC,GAAG,CAAC,IAAI,EACZ,GAAG,CAAC,GAAG,CAAC,MAAM,EACd,4BAA4B,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAC3C,CAAC;QACJ,CAAC,CAAC;QAEF,wBAAmB,GAA8C,CAAC,GAAG,EAAE,EAAE;YACvE,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EACxE,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,wBAAmB,GAA8C,CAAC,GAAG,EAAE,EAAE;YACvE,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,kBAAkB,CAAC,YAAY,CAAC,aAAa,CAAC,EAClD,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,eAAU,GAAqC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EACzC,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,mBAAc,GAAyC,CAAC,GAAG,EAAE,EAAE;YAC7D,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAChE,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,yBAAoB,GAAuD,CACzE,GAAG,EACH,EAAE;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;oBACpB,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBAC5C,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnB,OAAO,GAAG,CAAC;iBACZ;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,sBAAiB,GAA4C,CAAC,GAAG,EAAE,EAAE;YACnE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACpC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,EAClD,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,6BAAwB,GAGA,CAAC,GAAG,EAAE,WAA8B,EAAE,EAAE;YAC9D,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE;gBAC1B,WAAW,GAAG,EAAE,CAAC;aAClB;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;oBACpB,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;iBACzD;aACF;YACD,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAMF,iBAAY,GAAuC,CAAC,GAAG,EAAE,EAAE;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC;QA3XA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;IACzD,CAAC;IAEM,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAMO,yBAAyB,CAAC,IAAe,EAAE,GAAsB;QACvE,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IA4JO,YAAY,CAAC,GAAoB;QACvC,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;YACrD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC3D,GAAG,CACJ,CAAC;SACH;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;YACpD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACnE,GAAG,CACJ,CAAC;SACH;QACD,IACE,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAC3D;YACA,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACnE,GAAG,CACJ,CAAC;SACH;QACD,MAAM,IAAI,mBAAmB,CAC3B,gHAAgH,EAChH,GAAG,CACJ,CAAC;IACJ,CAAC;IA+KO,MAAM,CAAC,QAAQ,CAAC,GAAsB;QAC5C,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;CAKF","file":"compiler/ExprCompiler.js","sourcesContent":["import { IfcExpressionVisitor } from \"../gen/parser/IfcExpressionVisitor.js\";\nimport { NumericLiteralExpr } from \"../expression/numeric/NumericLiteralExpr.js\";\nimport {\n ArrayElementListContext,\n ArrayExprContext,\n BooleanLiteralContext,\n ExprContext,\n ExprListContext,\n FunctionCallContext,\n LiteralContext,\n LogicalLiteralContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n MethodFunctionCallContext,\n MethodPropertyAccessContext,\n NumLiteralContext,\n SEAddSubContext,\n SEArrayExprContext,\n SEBooleanBinaryOpContext,\n SEComparisonContext,\n SEFunctionCallContext,\n SELiteralContext,\n SEMethodCallContext,\n SEMulDivContext,\n SENotContext,\n SEParenthesisContext,\n SEPowerContext,\n SEUnaryMinusContext,\n SEUnaryMultipleMinusContext,\n SEVariableRefContext,\n StringLiteralContext,\n VariableRefContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { isNullish, isPresent } from \"../util/IfcExpressionUtils.js\";\nimport Decimal from \"decimal.js\";\nimport { PlusExpr } from \"../expression/numeric/PlusExpr.js\";\nimport { MinusExpr } from \"../expression/numeric/MinusExpr.js\";\nimport { ParserRuleContext } from \"antlr4ng\";\nimport { MultiplyExpr } from \"../expression/numeric/MultiplyExpr.js\";\nimport { DivideExpr } from \"../expression/numeric/DivideExpr.js\";\nimport { StringLiteralExpr } from \"../expression/string/StringLiteralExpr.js\";\nimport { ArrayExpr } from \"../expression/structure/ArrayExpr.js\";\nimport { FunctionExpr } from \"../expression/function/FunctionExpr.js\";\nimport { PowerExpr } from \"../expression/numeric/PowerExpr.js\";\nimport { UnaryMinusExpr } from \"../expression/numeric/UnaryMinusExpr.js\";\nimport { AndExpr } from \"../expression/boolean/AndExpr.js\";\nimport { BooleanLiteralExpr } from \"../expression/boolean/BooleanLiteralExpr.js\";\nimport { OrExpr } from \"../expression/boolean/OrExpr.js\";\nimport { XorExpr } from \"../expression/boolean/XorExpr.js\";\nimport { SyntaxErrorException } from \"../error/SyntaxErrorException.js\";\nimport { NotExpr } from \"../expression/boolean/NotExpr.js\";\nimport { ParenthesisExpr } from \"../expression/structure/ParenthesisExpr.js\";\nimport { EqualsExpr } from \"../expression/comparison/EqualsExpr.js\";\nimport { NotEqualsExpr } from \"../expression/comparison/NotEqualsExpr.js\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { StringConcatExpr } from \"../expression/string/StringConcatExpr.js\";\nimport { PlusOrConcatExpr } from \"../expression/poly/PlusOrConcatExpr.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { GreaterThan } from \"../expression/comparison/GreaterThan.js\";\nimport { GreaterThanOrEqual } from \"../expression/comparison/GreaterThanOrEqual.js\";\nimport { LessThan } from \"../expression/comparison/LessThan.js\";\nimport { LessThanOrEqual } from \"../expression/comparison/LessThanOrEqual.js\";\nimport { ExprManager } from \"./ExprManager.js\";\nimport { LogicalValue } from \"../value/LogicalValue.js\";\nimport { LogicalLiteralExpr } from \"../expression/boolean/LogicalLiteralExpr.js\";\nimport {\n BuiltinVariableRegistry,\n isBuiltinFunctionDefinition,\n isBuiltinPropertyDefinition,\n} from \"../builtin/BuiltinVariableRegistry.js\";\nimport { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { BuiltinPropertyAccessExpr } from \"../expression/reference/BuiltinPropertyAccessExpr.js\";\nimport { BuiltinFunctionCallExpr } from \"../expression/reference/BuiltinFunctionCallExpr.js\";\n\nexport class ExprCompiler extends IfcExpressionVisitor<Expr<any>> {\n protected defaultResult(): Expr<any> | null {\n return null;\n }\n private readonly methodCallTargetStack: Array<Expr<any>> = [];\n private readonly typeManager: TypeManager;\n private readonly exprManager: ExprManager;\n private readonly builtinVariableRegistry: BuiltinVariableRegistry;\n\n constructor(\n typeManager: TypeManager,\n builtinVariableRegistry: BuiltinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()\n ) {\n super();\n this.typeManager = typeManager;\n this.exprManager = new ExprManager();\n this.builtinVariableRegistry = builtinVariableRegistry;\n }\n\n public getExprManager(): ExprManager {\n return this.exprManager;\n }\n\n visitExpr: (ctx: ExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.singleExpr());\n };\n\n private associateContextAndReturn(expr: Expr<any>, ctx: ParserRuleContext) {\n this.exprManager.registerExprWithContext(expr, ctx);\n return expr;\n }\n\n visitVariableRef: (ctx: VariableRefContext) => Expr<any> = (ctx) => {\n const builtin = this.builtinVariableRegistry.getDefinition(\n ctx.IDENTIFIER().getText()\n );\n if (!isNullish(builtin)) {\n return this.associateContextAndReturn(builtin.createReferenceExpr(), ctx);\n }\n throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);\n };\n\n visitSEComparison: (ctx: SEComparisonContext) => Expr<any> = (ctx) => {\n const left = this.visit(ctx.singleExpr(0));\n const right = this.visit(ctx.singleExpr(1));\n switch (ctx.CMP_OP().getText()) {\n case \"==\":\n return this.associateContextAndReturn(new EqualsExpr(left, right), ctx);\n case \"!=\":\n return this.associateContextAndReturn(\n new NotEqualsExpr(left, right),\n ctx\n );\n case \">\":\n return this.associateContextAndReturn(\n new GreaterThan(left, right),\n ctx\n );\n case \">=\":\n return this.associateContextAndReturn(\n new GreaterThanOrEqual(left, right),\n ctx\n );\n case \"<\":\n return this.associateContextAndReturn(new LessThan(left, right), ctx);\n case \"<=\":\n return this.associateContextAndReturn(\n new LessThanOrEqual(left, right),\n ctx\n );\n }\n throw new Error(\n `Parsing error: comparison operator '${ctx\n .CMP_OP()\n .getText()}' not supported`\n );\n };\n\n visitSEMethodCall: (ctx: SEMethodCallContext) => Expr<any> = (ctx) => {\n this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));\n return this.visit(ctx.methodCallChain());\n };\n\n visitSELiteral: (ctx: SELiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.literal());\n };\n\n visitSEVariableRef: (ctx: SEVariableRefContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.variableRef());\n };\n visitSEArrayExpr: (ctx: SEArrayExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.arrayExpr());\n };\n visitSEFunctionCall: (ctx: SEFunctionCallContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.functionCall());\n };\n visitSEParenthesis: (ctx: SEParenthesisContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ParenthesisExpr(this.visit(ctx._sub)),\n ctx\n );\n };\n\n visitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => Expr<any> = (\n ctx\n ) => {\n const accessExpr = this.visit(ctx._target);\n this.methodCallTargetStack.push(accessExpr);\n return this.visit(ctx._call);\n };\n\n visitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx._call);\n };\n\n visitMethodFunctionCall: (ctx: MethodFunctionCallContext) => Expr<any> = (\n ctx\n ) => {\n const targetExpr = this.methodCallTargetStack.pop();\n const functionName = ctx.functionCall().IDENTIFIER().getText();\n const args = isNullish(ctx.functionCall().exprList())\n ? []\n : this.collectFunctionArguments(ctx.functionCall().exprList());\n const targetType = targetExpr.getType();\n if (targetType instanceof ContextObjectType) {\n const member = targetType.getMemberDefinition(functionName);\n if (isBuiltinFunctionDefinition(member)) {\n return this.associateContextAndReturn(\n new BuiltinFunctionCallExpr(\n targetExpr,\n member.name,\n args,\n member.returnType,\n targetType.getName()\n ),\n ctx\n );\n }\n }\n return this.associateContextAndReturn(\n new FunctionExpr(functionName, [targetExpr, ...args]),\n ctx.functionCall()\n );\n };\n\n visitMethodPropertyAccess: (ctx: MethodPropertyAccessContext) => Expr<any> = (\n ctx\n ) => {\n const targetExpr = this.methodCallTargetStack.pop();\n const targetType = targetExpr.getType();\n if (targetType instanceof ContextObjectType) {\n const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());\n if (isBuiltinPropertyDefinition(member)) {\n return this.associateContextAndReturn(\n new BuiltinPropertyAccessExpr(\n targetExpr,\n member.name,\n member.valueType,\n targetType.getName()\n ),\n ctx\n );\n }\n }\n throw new Error(\n `Parsing error: No property '${ctx.getText()}' found for type '${targetType.getName()}'`\n );\n };\n\n visitSEAddSub: (ctx: SEAddSubContext) => Expr<any> = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n switch (ctx._op.text) {\n case \"+\":\n return this.makePlusExpr(ctx);\n case \"-\":\n return this.associateContextAndReturn(\n new MinusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n private makePlusExpr(ctx: SEAddSubContext) {\n if (this.typeManager.isNumeric(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new PlusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (this.typeManager.isString(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (\n this.typeManager.overlapsWithString(ctx._left, ctx._right) ||\n this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)\n ) {\n return this.associateContextAndReturn(\n new PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n throw new ExpressionTypeError(\n \"Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.\",\n ctx\n );\n }\n\n visitSEMulDiv: (ctx: SEMulDivContext) => Expr<any> = (ctx) => {\n switch (ctx._op.text) {\n case \"*\":\n return this.associateContextAndReturn(\n new MultiplyExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n case \"/\":\n return this.associateContextAndReturn(\n new DivideExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n visitStringLiteral: (ctx: StringLiteralContext) => Expr<any> = (ctx) => {\n const quotedString = ctx.QUOTED_STRING().getText();\n const text = quotedString.substring(1, quotedString.length - 1);\n return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);\n };\n\n visitNumLiteral: (ctx: NumLiteralContext) => Expr<any> = (ctx) => {\n let val = ctx.INT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n val = ctx.FLOAT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n ExprCompiler.failNode(ctx);\n };\n\n visitSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx.singleExpr());\n };\n visitSEPower: (ctx: SEPowerContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new PowerExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n };\n visitSEUnaryMinus: (ctx: SEUnaryMinusContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new UnaryMinusExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n visitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => Expr<any> = (\n ctx\n ) => {\n switch (ctx._op.text) {\n case \"&&\":\n return this.associateContextAndReturn(\n new AndExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"||\":\n return this.associateContextAndReturn(\n new OrExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"><\":\n return this.associateContextAndReturn(\n new XorExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n }\n throw new SyntaxErrorException(\n ctx._op.text,\n ctx._op.line,\n ctx._op.column,\n `Unknown boolean operator ${ctx._op.text}`\n );\n };\n\n visitBooleanLiteral: (ctx: BooleanLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === \"TRUE\"),\n ctx\n );\n };\n\n visitLogicalLiteral: (ctx: LogicalLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE),\n ctx\n );\n };\n\n visitSENot: (ctx: SENotContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new NotExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n visitArrayExpr: (ctx: ArrayExprContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())),\n ctx\n );\n };\n\n collectArrayElements: (ctx: ArrayElementListContext) => Array<Expr<any>> = (\n ctx\n ) => {\n if (!isNullish(ctx)) {\n const first = this.visit(ctx.singleExpr());\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n const arr = this.collectArrayElements(rest);\n arr.unshift(first);\n return arr;\n }\n return [first];\n }\n return [];\n };\n\n visitFunctionCall: (ctx: FunctionCallContext) => Expr<any> = (ctx) => {\n const args = isNullish(ctx.exprList())\n ? []\n : this.collectFunctionArguments(ctx.exprList());\n return this.associateContextAndReturn(\n new FunctionExpr(ctx.IDENTIFIER().getText(), args),\n ctx\n );\n };\n\n collectFunctionArguments: (\n ctx: ExprListContext,\n resultSoFar?: Array<Expr<any>>\n ) => Array<Expr<any>> = (ctx, resultSoFar?: Array<Expr<any>>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.visit(ctx.singleExpr()));\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectFunctionArguments(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n private static failNode(ctx: ParserRuleContext): never {\n throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);\n }\n\n visitLiteral: (ctx: LiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.getChild(0));\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["compiler/ExprManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,OAAO,WAAW;IAGtB;QAFiB,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,CAAC;IAET,uBAAuB,CAAC,IAAe,EAAE,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,2DAA2D,QAAQ,CAAC,WAAW,CAAC,IAAI,2CAA2C,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAC1R,GAAG,CACJ,CAAC;SACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"
|
|
1
|
+
{"version":3,"sources":["compiler/ExprManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,OAAO,WAAW;IAGtB;QAFiB,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,CAAC;IAET,uBAAuB,CAAC,IAAe,EAAE,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,2DAA2D,QAAQ,CAAC,WAAW,CAAC,IAAI,2CAA2C,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAC1R,GAAG,CACJ,CAAC;SACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"antlr4ng\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { ValidationException } from \"../error/ValidationException.js\";\nimport { isNullish } from \"../util/IfcExpressionUtils.js\";\n\nexport class ExprManager {\n private readonly contextToExpr = new Map<Expr<any>, ParserRuleContext>();\n\n constructor() {}\n\n public registerExprWithContext(expr: Expr<any>, ctx) {\n const otherCtx = this.contextToExpr.get(expr);\n if (!isNullish(otherCtx) && otherCtx !== ctx) {\n throw new ValidationException(\n `Expression (of kind '${expr.getKind}') at line ${ctx.start.line}, column ${ctx.start.start} is already associated with a ParserRuleContext of type ${otherCtx.constructor.name}' cannot associate it with another one (${ctx.constructor.name} at ${ctx.start.line}:${ctx.start.start}')`,\n ctx\n );\n }\n this.contextToExpr.set(expr, ctx);\n }\n\n getContext(expr: Expr<any>) {\n return this.contextToExpr.get(expr);\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import IfcExpressionListener from "../gen/parser/IfcExpressionListener.js";
|
|
2
|
-
import { MethodCallChainEndContext, MethodCallChainInnerContext,
|
|
1
|
+
import { IfcExpressionListener } from "../gen/parser/IfcExpressionListener.js";
|
|
2
|
+
import { MethodCallChainEndContext, MethodCallChainInnerContext, MethodFunctionCallContext, } from "../gen/parser/IfcExpressionParser.js";
|
|
3
3
|
import { IfcExpressionFunctions } from "../expression/function/IfcExpressionFunctions.js";
|
|
4
4
|
import { NoSuchFunctionException } from "../error/NoSuchFunctionException.js";
|
|
5
5
|
import { InvalidSyntaxException } from "../error/InvalidSyntaxException.js";
|
|
@@ -8,13 +8,27 @@ import { TypeManager } from "./TypeManager.js";
|
|
|
8
8
|
import { ExpressionTypeError } from "../error/ExpressionTypeError.js";
|
|
9
9
|
import { isNullish } from "../util/IfcExpressionUtils.js";
|
|
10
10
|
import { ValidationException } from "../error/ValidationException.js";
|
|
11
|
+
import { BuiltinVariableRegistry, isBuiltinFunctionDefinition, isBuiltinPropertyDefinition, } from "../builtin/BuiltinVariableRegistry.js";
|
|
12
|
+
import { ContextObjectType } from "../type/ContextObjectType.js";
|
|
13
|
+
import { NoSuchMemberException } from "../error/NoSuchMemberException.js";
|
|
14
|
+
import { NoSuchMethodException } from "../error/NoSuchMethodException.js";
|
|
15
|
+
import { WrongFunctionArgumentTypeException } from "../error/WrongFunctionArgumentTypeException.js";
|
|
16
|
+
import { MissingFunctionArgumentException } from "../error/MissingFunctionArgumentException.js";
|
|
17
|
+
import { SpuriousFunctionArgumentException } from "../error/SpuriousFunctionArgumentException.js";
|
|
11
18
|
export class IfcExpressionValidationListener extends IfcExpressionListener {
|
|
12
|
-
constructor() {
|
|
19
|
+
constructor(builtinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()) {
|
|
13
20
|
super();
|
|
14
21
|
this.methodCallTargetStack = [];
|
|
15
22
|
this.enterFunctionCall = (ctx) => {
|
|
16
23
|
if (!IfcExpressionFunctions.isBuiltinFunction(ctx.IDENTIFIER().getText())) {
|
|
17
|
-
|
|
24
|
+
const parent = ctx.parent;
|
|
25
|
+
const grandParent = parent?.parent;
|
|
26
|
+
const isMethodAccessor = parent instanceof MethodFunctionCallContext &&
|
|
27
|
+
(grandParent instanceof MethodCallChainInnerContext ||
|
|
28
|
+
grandParent instanceof MethodCallChainEndContext);
|
|
29
|
+
if (!isMethodAccessor) {
|
|
30
|
+
throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
|
|
31
|
+
}
|
|
18
32
|
}
|
|
19
33
|
};
|
|
20
34
|
this.enterSEUnaryMultipleMinus = (ctx) => {
|
|
@@ -74,15 +88,12 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
|
|
|
74
88
|
this.typeManager.setType(ctx, Types.boolean());
|
|
75
89
|
};
|
|
76
90
|
this.exitSEVariableRef = (ctx) => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
case "element":
|
|
82
|
-
this.typeManager.setType(ctx, Type.IFC_ELEMENT_REF);
|
|
83
|
-
return;
|
|
91
|
+
const builtin = this.builtinVariableRegistry.getDefinition(ctx._sub.IDENTIFIER().getText());
|
|
92
|
+
if (builtin) {
|
|
93
|
+
this.typeManager.setType(ctx, builtin.type);
|
|
94
|
+
return;
|
|
84
95
|
}
|
|
85
|
-
throw new ValidationException(`Encountered Variable ref that was neither
|
|
96
|
+
throw new ValidationException(`Encountered Variable ref that was neither a built-in variable nor a configured client builtin`, ctx);
|
|
86
97
|
};
|
|
87
98
|
this.exitSEUnaryMinus = (ctx) => {
|
|
88
99
|
this.typeManager.requireNumeric(ctx._sub);
|
|
@@ -116,16 +127,45 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
|
|
|
116
127
|
this.pushMethodCallTarget(ctx);
|
|
117
128
|
};
|
|
118
129
|
this.exitMethodCallChainEnd = (ctx) => {
|
|
130
|
+
this.typeManager.copyTypeFrom(ctx, ctx._call);
|
|
131
|
+
};
|
|
132
|
+
this.exitMethodFunctionCall = (ctx) => {
|
|
119
133
|
this.typeManager.copyTypeFrom(ctx, ctx.functionCall());
|
|
120
134
|
};
|
|
135
|
+
this.exitMethodPropertyAccess = (ctx) => {
|
|
136
|
+
const [_, targetType] = this.popMethodCallTarget(ctx);
|
|
137
|
+
if (!(targetType instanceof ContextObjectType)) {
|
|
138
|
+
throw new NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
139
|
+
}
|
|
140
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
141
|
+
if (!isBuiltinPropertyDefinition(member)) {
|
|
142
|
+
throw new NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
143
|
+
}
|
|
144
|
+
this.typeManager.setType(ctx, member.valueType);
|
|
145
|
+
};
|
|
121
146
|
this.exitFunctionCall = (ctx) => {
|
|
122
|
-
const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
|
|
123
147
|
const argumentTypes = this.collectArgumentTypes(ctx.exprList());
|
|
124
|
-
const parent = ctx.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
148
|
+
const parent = ctx.parent;
|
|
149
|
+
const grandParent = parent?.parent;
|
|
150
|
+
const isMethodAccessor = parent instanceof MethodFunctionCallContext &&
|
|
151
|
+
(grandParent instanceof MethodCallChainInnerContext ||
|
|
152
|
+
grandParent instanceof MethodCallChainEndContext);
|
|
153
|
+
if (isMethodAccessor) {
|
|
154
|
+
const [targetCtx, targetType] = this.popMethodCallTarget(ctx);
|
|
155
|
+
if (targetType instanceof ContextObjectType) {
|
|
156
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
157
|
+
if (!isBuiltinFunctionDefinition(member)) {
|
|
158
|
+
throw new NoSuchMethodException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
159
|
+
}
|
|
160
|
+
this.checkBuiltinFunctionArguments(ctx.IDENTIFIER().getText(), member.argumentTypes, argumentTypes, ctx);
|
|
161
|
+
this.typeManager.setType(ctx, member.returnType);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
argumentTypes.unshift([targetCtx, targetType]);
|
|
165
|
+
}
|
|
166
|
+
const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
|
|
167
|
+
if (isNullish(func)) {
|
|
168
|
+
throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
|
|
129
169
|
}
|
|
130
170
|
const returnType = func.checkArgumentsAndGetReturnType(argumentTypes, ctx);
|
|
131
171
|
this.typeManager.setType(ctx, returnType);
|
|
@@ -163,21 +203,44 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
|
|
|
163
203
|
return resultSoFar;
|
|
164
204
|
};
|
|
165
205
|
this.exitVariableRef = (ctx) => {
|
|
166
|
-
|
|
206
|
+
const builtinTypes = [Type.IFC_PROPERTY_REF, Type.IFC_ELEMENT_REF];
|
|
207
|
+
const otherBuiltinDefinitions = ["property", "element"]
|
|
208
|
+
.map((name) => this.builtinVariableRegistry.getDefinition(name)?.type)
|
|
209
|
+
.filter((type) => !isNullish(type));
|
|
210
|
+
this.typeManager.setType(ctx, Types.or(...builtinTypes, ...otherBuiltinDefinitions));
|
|
167
211
|
};
|
|
168
212
|
this.typeManager = new TypeManager();
|
|
213
|
+
this.builtinVariableRegistry = builtinVariableRegistry;
|
|
169
214
|
}
|
|
170
215
|
getTypeManager() {
|
|
171
216
|
return this.typeManager;
|
|
172
217
|
}
|
|
173
218
|
pushMethodCallTarget(ctx) {
|
|
174
|
-
if (ctx.
|
|
175
|
-
const targetType = this.typeManager.getType(ctx.
|
|
176
|
-
this.methodCallTargetStack.push([ctx, targetType]);
|
|
219
|
+
if (ctx.parent["_target"]) {
|
|
220
|
+
const targetType = this.typeManager.getType(ctx.parent["_target"]);
|
|
221
|
+
this.methodCallTargetStack.push([ctx.parent["_target"], targetType]);
|
|
177
222
|
}
|
|
178
223
|
else {
|
|
179
224
|
throw new ValidationException("Did not find expected context attribute 'target' in parent rule context", ctx);
|
|
180
225
|
}
|
|
181
226
|
}
|
|
227
|
+
checkBuiltinFunctionArguments(functionName, expectedArgumentTypes, providedArgumentTypes, ctx) {
|
|
228
|
+
if (providedArgumentTypes.length > expectedArgumentTypes.length) {
|
|
229
|
+
throw new SpuriousFunctionArgumentException(functionName, "[unexpected argument]", expectedArgumentTypes.length, ctx, `Function expects (at most) ${expectedArgumentTypes.length} arguments`);
|
|
230
|
+
}
|
|
231
|
+
for (let i = 0; i < expectedArgumentTypes.length; i++) {
|
|
232
|
+
if (providedArgumentTypes.length <= i) {
|
|
233
|
+
throw new MissingFunctionArgumentException(functionName, `[arg${i}]`, i, ctx);
|
|
234
|
+
}
|
|
235
|
+
Types.requireWeakIsAssignableFrom(expectedArgumentTypes[i], providedArgumentTypes[i][1], () => new WrongFunctionArgumentTypeException(functionName, `[arg${i}]`, expectedArgumentTypes[i], providedArgumentTypes[i][1], i, providedArgumentTypes[i][0]));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
popMethodCallTarget(ctx) {
|
|
239
|
+
const target = this.methodCallTargetStack.pop();
|
|
240
|
+
if (isNullish(target)) {
|
|
241
|
+
throw new ValidationException("Did not find expected method call target on stack", ctx);
|
|
242
|
+
}
|
|
243
|
+
return target;
|
|
244
|
+
}
|
|
182
245
|
}
|
|
183
246
|
//# sourceMappingURL=IfcExpressionValidationListener.js.map
|