ifc-expressions 2.3.0 → 3.0.0-beta.0
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 +242 -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 +10 -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 +532 -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 +528 -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
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ExprCompiler = void 0;
|
|
7
|
-
const IfcExpressionVisitor_js_1 =
|
|
7
|
+
const IfcExpressionVisitor_js_1 = require("../gen/parser/IfcExpressionVisitor.js");
|
|
8
8
|
const NumericLiteralExpr_js_1 = require("../expression/numeric/NumericLiteralExpr.js");
|
|
9
9
|
const IfcExpressionUtils_js_1 = require("../util/IfcExpressionUtils.js");
|
|
10
10
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
@@ -12,8 +12,6 @@ const PlusExpr_js_1 = require("../expression/numeric/PlusExpr.js");
|
|
|
12
12
|
const MinusExpr_js_1 = require("../expression/numeric/MinusExpr.js");
|
|
13
13
|
const MultiplyExpr_js_1 = require("../expression/numeric/MultiplyExpr.js");
|
|
14
14
|
const DivideExpr_js_1 = require("../expression/numeric/DivideExpr.js");
|
|
15
|
-
const PropObjectReferenceExpr_js_1 = require("../expression/reference/PropObjectReferenceExpr.js");
|
|
16
|
-
const ElemObjectReferenceExpr_js_1 = require("../expression/reference/ElemObjectReferenceExpr.js");
|
|
17
15
|
const StringLiteralExpr_js_1 = require("../expression/string/StringLiteralExpr.js");
|
|
18
16
|
const ArrayExpr_js_1 = require("../expression/structure/ArrayExpr.js");
|
|
19
17
|
const FunctionExpr_js_1 = require("../expression/function/FunctionExpr.js");
|
|
@@ -38,19 +36,24 @@ const LessThanOrEqual_js_1 = require("../expression/comparison/LessThanOrEqual.j
|
|
|
38
36
|
const ExprManager_js_1 = require("./ExprManager.js");
|
|
39
37
|
const LogicalValue_js_1 = require("../value/LogicalValue.js");
|
|
40
38
|
const LogicalLiteralExpr_js_1 = require("../expression/boolean/LogicalLiteralExpr.js");
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const BuiltinVariableRegistry_js_1 = require("../builtin/BuiltinVariableRegistry.js");
|
|
40
|
+
const ContextObjectType_js_1 = require("../type/ContextObjectType.js");
|
|
41
|
+
const BuiltinPropertyAccessExpr_js_1 = require("../expression/reference/BuiltinPropertyAccessExpr.js");
|
|
42
|
+
const BuiltinFunctionCallExpr_js_1 = require("../expression/reference/BuiltinFunctionCallExpr.js");
|
|
43
|
+
class ExprCompiler extends IfcExpressionVisitor_js_1.IfcExpressionVisitor {
|
|
44
|
+
defaultResult() {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
constructor(typeManager, builtinVariableRegistry = BuiltinVariableRegistry_js_1.BuiltinVariableRegistry.getDefaultRegistry()) {
|
|
43
48
|
super();
|
|
44
49
|
this.methodCallTargetStack = [];
|
|
45
50
|
this.visitExpr = (ctx) => {
|
|
46
51
|
return this.visit(ctx.singleExpr());
|
|
47
52
|
};
|
|
48
53
|
this.visitVariableRef = (ctx) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
else if (ctx.IDENTIFIER().getText().toUpperCase() === "ELEMENT") {
|
|
53
|
-
return this.associateContextAndReturn(new ElemObjectReferenceExpr_js_1.ElemObjectReferenceExpr(), ctx);
|
|
54
|
+
const builtin = this.builtinVariableRegistry.getDefinition(ctx.IDENTIFIER().getText());
|
|
55
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(builtin)) {
|
|
56
|
+
return this.associateContextAndReturn(builtin.createReferenceExpr(), ctx);
|
|
54
57
|
}
|
|
55
58
|
throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);
|
|
56
59
|
};
|
|
@@ -94,21 +97,39 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
94
97
|
this.visitSEParenthesis = (ctx) => {
|
|
95
98
|
return this.associateContextAndReturn(new ParenthesisExpr_js_1.ParenthesisExpr(this.visit(ctx._sub)), ctx);
|
|
96
99
|
};
|
|
97
|
-
/*================================================
|
|
98
|
-
* MethodCallChain
|
|
99
|
-
*==============================================*/
|
|
100
100
|
this.visitMethodCallChainInner = (ctx) => {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
this.associateContextAndReturn(functionExpr, ctx.functionCall());
|
|
105
|
-
this.methodCallTargetStack.push(functionExpr);
|
|
106
|
-
return this.visit(ctx.methodCallChain());
|
|
101
|
+
const accessExpr = this.visit(ctx._target);
|
|
102
|
+
this.methodCallTargetStack.push(accessExpr);
|
|
103
|
+
return this.visit(ctx._call);
|
|
107
104
|
};
|
|
108
105
|
this.visitMethodCallChainEnd = (ctx) => {
|
|
109
|
-
return this.
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
return this.visit(ctx._call);
|
|
107
|
+
};
|
|
108
|
+
this.visitMethodFunctionCall = (ctx) => {
|
|
109
|
+
const targetExpr = this.methodCallTargetStack.pop();
|
|
110
|
+
const functionName = ctx.functionCall().IDENTIFIER().getText();
|
|
111
|
+
const args = (0, IfcExpressionUtils_js_1.isNullish)(ctx.functionCall().exprList())
|
|
112
|
+
? []
|
|
113
|
+
: this.collectFunctionArguments(ctx.functionCall().exprList());
|
|
114
|
+
const targetType = targetExpr.getType();
|
|
115
|
+
if (targetType instanceof ContextObjectType_js_1.ContextObjectType) {
|
|
116
|
+
const member = targetType.getMemberDefinition(functionName);
|
|
117
|
+
if ((0, BuiltinVariableRegistry_js_1.isBuiltinFunctionDefinition)(member)) {
|
|
118
|
+
return this.associateContextAndReturn(new BuiltinFunctionCallExpr_js_1.BuiltinFunctionCallExpr(targetExpr, member.name, args, member.returnType, targetType.getName()), ctx);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return this.associateContextAndReturn(new FunctionExpr_js_1.FunctionExpr(functionName, [targetExpr, ...args]), ctx.functionCall());
|
|
122
|
+
};
|
|
123
|
+
this.visitMethodPropertyAccess = (ctx) => {
|
|
124
|
+
const targetExpr = this.methodCallTargetStack.pop();
|
|
125
|
+
const targetType = targetExpr.getType();
|
|
126
|
+
if (targetType instanceof ContextObjectType_js_1.ContextObjectType) {
|
|
127
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
128
|
+
if ((0, BuiltinVariableRegistry_js_1.isBuiltinPropertyDefinition)(member)) {
|
|
129
|
+
return this.associateContextAndReturn(new BuiltinPropertyAccessExpr_js_1.BuiltinPropertyAccessExpr(targetExpr, member.name, member.valueType, targetType.getName()), ctx);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`Parsing error: No property '${ctx.getText()}' found for type '${targetType.getName()}'`);
|
|
112
133
|
};
|
|
113
134
|
this.visitSEAddSub = (ctx) => {
|
|
114
135
|
this.typeManager.requireTypesOverlap(ctx._left, ctx._right);
|
|
@@ -131,17 +152,11 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
131
152
|
ExprCompiler.failNode(ctx);
|
|
132
153
|
}
|
|
133
154
|
};
|
|
134
|
-
/*================================================
|
|
135
|
-
* StringExpr
|
|
136
|
-
*===============================================*/
|
|
137
155
|
this.visitStringLiteral = (ctx) => {
|
|
138
156
|
const quotedString = ctx.QUOTED_STRING().getText();
|
|
139
157
|
const text = quotedString.substring(1, quotedString.length - 1);
|
|
140
158
|
return this.associateContextAndReturn(new StringLiteralExpr_js_1.StringLiteralExpr(text), ctx);
|
|
141
159
|
};
|
|
142
|
-
/*================================================
|
|
143
|
-
* NumExpr
|
|
144
|
-
*===============================================*/
|
|
145
160
|
this.visitNumLiteral = (ctx) => {
|
|
146
161
|
let val = ctx.INT();
|
|
147
162
|
if ((0, IfcExpressionUtils_js_1.isPresent)(val)) {
|
|
@@ -162,9 +177,6 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
162
177
|
this.visitSEUnaryMinus = (ctx) => {
|
|
163
178
|
return this.associateContextAndReturn(new UnaryMinusExpr_js_1.UnaryMinusExpr(this.visit(ctx.singleExpr())), ctx);
|
|
164
179
|
};
|
|
165
|
-
/*================================================
|
|
166
|
-
* BooleanExpr
|
|
167
|
-
*===============================================*/
|
|
168
180
|
this.visitSEBooleanBinaryOp = (ctx) => {
|
|
169
181
|
switch (ctx._op.text) {
|
|
170
182
|
case "&&":
|
|
@@ -180,15 +192,11 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
180
192
|
return this.associateContextAndReturn(new BooleanLiteralExpr_js_1.BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === "TRUE"), ctx);
|
|
181
193
|
};
|
|
182
194
|
this.visitLogicalLiteral = (ctx) => {
|
|
183
|
-
// the only literal we recognize is 'UNKNOWN' (true and false are boolean literals)
|
|
184
195
|
return this.associateContextAndReturn(new LogicalLiteralExpr_js_1.LogicalLiteralExpr(LogicalValue_js_1.LogicalValue.UNKNOWN_VALUE), ctx);
|
|
185
196
|
};
|
|
186
197
|
this.visitSENot = (ctx) => {
|
|
187
198
|
return this.associateContextAndReturn(new NotExpr_js_1.NotExpr(this.visit(ctx.singleExpr())), ctx);
|
|
188
199
|
};
|
|
189
|
-
/*================================================
|
|
190
|
-
* ArrayExpr
|
|
191
|
-
*===============================================*/
|
|
192
200
|
this.visitArrayExpr = (ctx) => {
|
|
193
201
|
return this.associateContextAndReturn(new ArrayExpr_js_1.ArrayExpr(this.collectArrayElements(ctx.arrayElementList())), ctx);
|
|
194
202
|
};
|
|
@@ -205,9 +213,6 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
205
213
|
}
|
|
206
214
|
return [];
|
|
207
215
|
};
|
|
208
|
-
/*================================================
|
|
209
|
-
* FuncExpr
|
|
210
|
-
*===============================================*/
|
|
211
216
|
this.visitFunctionCall = (ctx) => {
|
|
212
217
|
const args = (0, IfcExpressionUtils_js_1.isNullish)(ctx.exprList())
|
|
213
218
|
? []
|
|
@@ -232,13 +237,11 @@ class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
|
232
237
|
};
|
|
233
238
|
this.typeManager = typeManager;
|
|
234
239
|
this.exprManager = new ExprManager_js_1.ExprManager();
|
|
240
|
+
this.builtinVariableRegistry = builtinVariableRegistry;
|
|
235
241
|
}
|
|
236
242
|
getExprManager() {
|
|
237
243
|
return this.exprManager;
|
|
238
244
|
}
|
|
239
|
-
/*================================================
|
|
240
|
-
* VariableRef
|
|
241
|
-
*==============================================*/
|
|
242
245
|
associateContextAndReturn(expr, ctx) {
|
|
243
246
|
this.exprManager.registerExprWithContext(expr, ctx);
|
|
244
247
|
return expr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/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":["../../src/compiler/ExprCompiler.ts"],"names":[],"mappings":";;;;;;AAAA,mFAA6E;AAC7E,uFAAiF;AAiCjF,yEAAqE;AACrE,4DAAiC;AACjC,mEAA6D;AAC7D,qEAA+D;AAE/D,2EAAqE;AACrE,uEAAiE;AACjE,oFAA8E;AAC9E,uEAAiE;AACjE,4EAAsE;AACtE,qEAA+D;AAC/D,+EAAyE;AACzE,iEAA2D;AAC3D,uFAAiF;AACjF,+DAAyD;AACzD,iEAA2D;AAC3D,8EAAwE;AACxE,iEAA2D;AAC3D,mFAA6E;AAC7E,0EAAoE;AACpE,gFAA0E;AAE1E,kFAA4E;AAC5E,gFAA0E;AAC1E,4EAAsE;AACtE,4EAAsE;AACtE,0FAAoF;AACpF,sEAAgE;AAChE,oFAA8E;AAC9E,qDAA+C;AAC/C,8DAAwD;AACxD,uFAAiF;AACjF,sFAI+C;AAC/C,uEAAiE;AACjE,uGAAiG;AACjG,mGAA6F;AAE7F,MAAa,YAAa,SAAQ,8CAA+B;IACrD,aAAa;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,YACE,WAAwB,EACxB,0BAAmD,oDAAuB,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,IAAA,iCAAS,EAAC,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,0BAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC1E,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,gCAAa,CAAC,IAAI,EAAE,KAAK,CAAC,EAC9B,GAAG,CACJ,CAAC;gBACJ,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,4BAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAC5B,GAAG,CACJ,CAAC;gBACJ,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,0CAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EACnC,GAAG,CACJ,CAAC;gBACJ,KAAK,GAAG;oBACN,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,sBAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBACxE,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,oCAAe,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,oCAAe,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,IAAA,iCAAS,EAAC,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,wCAAiB,EAAE;gBAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAC5D,IAAI,IAAA,wDAA2B,EAAC,MAAM,CAAC,EAAE;oBACvC,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,oDAAuB,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,8BAAY,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,wCAAiB,EAAE;gBAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,IAAI,IAAA,wDAA2B,EAAC,MAAM,CAAC,EAAE;oBACvC,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,wDAAyB,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,wBAAS,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,8BAAY,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,0BAAU,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,wCAAiB,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,IAAA,iCAAS,EAAC,GAAG,CAAC,EAAE;gBAClB,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,0CAAkB,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAClD,GAAG,CACJ,CAAC;aACH;YACD,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,IAAA,iCAAS,EAAC,GAAG,CAAC,EAAE;gBAClB,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,0CAAkB,CAAC,IAAI,oBAAO,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,wBAAS,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,kCAAc,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,oBAAO,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,kBAAM,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,oBAAO,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,8CAAoB,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,0CAAkB,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,0CAAkB,CAAC,8BAAY,CAAC,aAAa,CAAC,EAClD,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,eAAU,GAAqC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,IAAI,CAAC,yBAAyB,CACnC,IAAI,oBAAO,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,wBAAS,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,IAAA,iCAAS,EAAC,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,IAAA,iCAAS,EAAC,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,IAAA,iCAAS,EAAC,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,8BAAY,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,IAAA,iCAAS,EAAC,WAAW,CAAC,EAAE;gBAC1B,WAAW,GAAG,EAAE,CAAC;aAClB;YACD,IAAI,CAAC,IAAA,iCAAS,EAAC,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,IAAA,iCAAS,EAAC,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,4BAAW,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,sBAAQ,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,sCAAgB,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,sCAAgB,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,4CAAmB,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;AA1YD,oCA0YC","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":["../../src/compiler/ExprManager.ts"],"names":[],"mappings":";;;AAEA,4EAAsE;AACtE,yEAA0D;AAE1D,MAAa,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,IAAA,iCAAS,EAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,4CAAmB,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;AAnBD,kCAmBC","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"
|
|
1
|
+
{"version":3,"sources":["../../src/compiler/ExprManager.ts"],"names":[],"mappings":";;;AAEA,4EAAsE;AACtE,yEAA0D;AAE1D,MAAa,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,IAAA,iCAAS,EAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,4CAAmB,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;AAnBD,kCAmBC","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,10 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.IfcExpressionValidationListener = void 0;
|
|
7
|
-
const IfcExpressionListener_js_1 =
|
|
4
|
+
const IfcExpressionListener_js_1 = require("../gen/parser/IfcExpressionListener.js");
|
|
8
5
|
const IfcExpressionParser_js_1 = require("../gen/parser/IfcExpressionParser.js");
|
|
9
6
|
const IfcExpressionFunctions_js_1 = require("../expression/function/IfcExpressionFunctions.js");
|
|
10
7
|
const NoSuchFunctionException_js_1 = require("../error/NoSuchFunctionException.js");
|
|
@@ -14,13 +11,27 @@ const TypeManager_js_1 = require("./TypeManager.js");
|
|
|
14
11
|
const ExpressionTypeError_js_1 = require("../error/ExpressionTypeError.js");
|
|
15
12
|
const IfcExpressionUtils_js_1 = require("../util/IfcExpressionUtils.js");
|
|
16
13
|
const ValidationException_js_1 = require("../error/ValidationException.js");
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
const BuiltinVariableRegistry_js_1 = require("../builtin/BuiltinVariableRegistry.js");
|
|
15
|
+
const ContextObjectType_js_1 = require("../type/ContextObjectType.js");
|
|
16
|
+
const NoSuchMemberException_js_1 = require("../error/NoSuchMemberException.js");
|
|
17
|
+
const NoSuchMethodException_js_1 = require("../error/NoSuchMethodException.js");
|
|
18
|
+
const WrongFunctionArgumentTypeException_js_1 = require("../error/WrongFunctionArgumentTypeException.js");
|
|
19
|
+
const MissingFunctionArgumentException_js_1 = require("../error/MissingFunctionArgumentException.js");
|
|
20
|
+
const SpuriousFunctionArgumentException_js_1 = require("../error/SpuriousFunctionArgumentException.js");
|
|
21
|
+
class IfcExpressionValidationListener extends IfcExpressionListener_js_1.IfcExpressionListener {
|
|
22
|
+
constructor(builtinVariableRegistry = BuiltinVariableRegistry_js_1.BuiltinVariableRegistry.getDefaultRegistry()) {
|
|
19
23
|
super();
|
|
20
24
|
this.methodCallTargetStack = [];
|
|
21
25
|
this.enterFunctionCall = (ctx) => {
|
|
22
26
|
if (!IfcExpressionFunctions_js_1.IfcExpressionFunctions.isBuiltinFunction(ctx.IDENTIFIER().getText())) {
|
|
23
|
-
|
|
27
|
+
const parent = ctx.parent;
|
|
28
|
+
const grandParent = parent?.parent;
|
|
29
|
+
const isMethodAccessor = parent instanceof IfcExpressionParser_js_1.MethodFunctionCallContext &&
|
|
30
|
+
(grandParent instanceof IfcExpressionParser_js_1.MethodCallChainInnerContext ||
|
|
31
|
+
grandParent instanceof IfcExpressionParser_js_1.MethodCallChainEndContext);
|
|
32
|
+
if (!isMethodAccessor) {
|
|
33
|
+
throw new NoSuchFunctionException_js_1.NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
|
|
34
|
+
}
|
|
24
35
|
}
|
|
25
36
|
};
|
|
26
37
|
this.enterSEUnaryMultipleMinus = (ctx) => {
|
|
@@ -80,15 +91,12 @@ class IfcExpressionValidationListener extends IfcExpressionListener_js_1.default
|
|
|
80
91
|
this.typeManager.setType(ctx, Types_js_1.Types.boolean());
|
|
81
92
|
};
|
|
82
93
|
this.exitSEVariableRef = (ctx) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
case "element":
|
|
88
|
-
this.typeManager.setType(ctx, Types_js_1.Type.IFC_ELEMENT_REF);
|
|
89
|
-
return;
|
|
94
|
+
const builtin = this.builtinVariableRegistry.getDefinition(ctx._sub.IDENTIFIER().getText());
|
|
95
|
+
if (builtin) {
|
|
96
|
+
this.typeManager.setType(ctx, builtin.type);
|
|
97
|
+
return;
|
|
90
98
|
}
|
|
91
|
-
throw new ValidationException_js_1.ValidationException(`Encountered Variable ref that was neither
|
|
99
|
+
throw new ValidationException_js_1.ValidationException(`Encountered Variable ref that was neither a built-in variable nor a configured client builtin`, ctx);
|
|
92
100
|
};
|
|
93
101
|
this.exitSEUnaryMinus = (ctx) => {
|
|
94
102
|
this.typeManager.requireNumeric(ctx._sub);
|
|
@@ -122,16 +130,45 @@ class IfcExpressionValidationListener extends IfcExpressionListener_js_1.default
|
|
|
122
130
|
this.pushMethodCallTarget(ctx);
|
|
123
131
|
};
|
|
124
132
|
this.exitMethodCallChainEnd = (ctx) => {
|
|
133
|
+
this.typeManager.copyTypeFrom(ctx, ctx._call);
|
|
134
|
+
};
|
|
135
|
+
this.exitMethodFunctionCall = (ctx) => {
|
|
125
136
|
this.typeManager.copyTypeFrom(ctx, ctx.functionCall());
|
|
126
137
|
};
|
|
138
|
+
this.exitMethodPropertyAccess = (ctx) => {
|
|
139
|
+
const [_, targetType] = this.popMethodCallTarget(ctx);
|
|
140
|
+
if (!(targetType instanceof ContextObjectType_js_1.ContextObjectType)) {
|
|
141
|
+
throw new NoSuchMemberException_js_1.NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
142
|
+
}
|
|
143
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
144
|
+
if (!(0, BuiltinVariableRegistry_js_1.isBuiltinPropertyDefinition)(member)) {
|
|
145
|
+
throw new NoSuchMemberException_js_1.NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
146
|
+
}
|
|
147
|
+
this.typeManager.setType(ctx, member.valueType);
|
|
148
|
+
};
|
|
127
149
|
this.exitFunctionCall = (ctx) => {
|
|
128
|
-
const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
|
|
129
150
|
const argumentTypes = this.collectArgumentTypes(ctx.exprList());
|
|
130
|
-
const parent = ctx.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
151
|
+
const parent = ctx.parent;
|
|
152
|
+
const grandParent = parent?.parent;
|
|
153
|
+
const isMethodAccessor = parent instanceof IfcExpressionParser_js_1.MethodFunctionCallContext &&
|
|
154
|
+
(grandParent instanceof IfcExpressionParser_js_1.MethodCallChainInnerContext ||
|
|
155
|
+
grandParent instanceof IfcExpressionParser_js_1.MethodCallChainEndContext);
|
|
156
|
+
if (isMethodAccessor) {
|
|
157
|
+
const [targetCtx, targetType] = this.popMethodCallTarget(ctx);
|
|
158
|
+
if (targetType instanceof ContextObjectType_js_1.ContextObjectType) {
|
|
159
|
+
const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
|
|
160
|
+
if (!(0, BuiltinVariableRegistry_js_1.isBuiltinFunctionDefinition)(member)) {
|
|
161
|
+
throw new NoSuchMethodException_js_1.NoSuchMethodException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
|
|
162
|
+
}
|
|
163
|
+
this.checkBuiltinFunctionArguments(ctx.IDENTIFIER().getText(), member.argumentTypes, argumentTypes, ctx);
|
|
164
|
+
this.typeManager.setType(ctx, member.returnType);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
argumentTypes.unshift([targetCtx, targetType]);
|
|
168
|
+
}
|
|
169
|
+
const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
|
|
170
|
+
if ((0, IfcExpressionUtils_js_1.isNullish)(func)) {
|
|
171
|
+
throw new NoSuchFunctionException_js_1.NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
|
|
135
172
|
}
|
|
136
173
|
const returnType = func.checkArgumentsAndGetReturnType(argumentTypes, ctx);
|
|
137
174
|
this.typeManager.setType(ctx, returnType);
|
|
@@ -169,22 +206,45 @@ class IfcExpressionValidationListener extends IfcExpressionListener_js_1.default
|
|
|
169
206
|
return resultSoFar;
|
|
170
207
|
};
|
|
171
208
|
this.exitVariableRef = (ctx) => {
|
|
172
|
-
|
|
209
|
+
const builtinTypes = [Types_js_1.Type.IFC_PROPERTY_REF, Types_js_1.Type.IFC_ELEMENT_REF];
|
|
210
|
+
const otherBuiltinDefinitions = ["property", "element"]
|
|
211
|
+
.map((name) => this.builtinVariableRegistry.getDefinition(name)?.type)
|
|
212
|
+
.filter((type) => !(0, IfcExpressionUtils_js_1.isNullish)(type));
|
|
213
|
+
this.typeManager.setType(ctx, Types_js_1.Types.or(...builtinTypes, ...otherBuiltinDefinitions));
|
|
173
214
|
};
|
|
174
215
|
this.typeManager = new TypeManager_js_1.TypeManager();
|
|
216
|
+
this.builtinVariableRegistry = builtinVariableRegistry;
|
|
175
217
|
}
|
|
176
218
|
getTypeManager() {
|
|
177
219
|
return this.typeManager;
|
|
178
220
|
}
|
|
179
221
|
pushMethodCallTarget(ctx) {
|
|
180
|
-
if (ctx.
|
|
181
|
-
const targetType = this.typeManager.getType(ctx.
|
|
182
|
-
this.methodCallTargetStack.push([ctx, targetType]);
|
|
222
|
+
if (ctx.parent["_target"]) {
|
|
223
|
+
const targetType = this.typeManager.getType(ctx.parent["_target"]);
|
|
224
|
+
this.methodCallTargetStack.push([ctx.parent["_target"], targetType]);
|
|
183
225
|
}
|
|
184
226
|
else {
|
|
185
227
|
throw new ValidationException_js_1.ValidationException("Did not find expected context attribute 'target' in parent rule context", ctx);
|
|
186
228
|
}
|
|
187
229
|
}
|
|
230
|
+
checkBuiltinFunctionArguments(functionName, expectedArgumentTypes, providedArgumentTypes, ctx) {
|
|
231
|
+
if (providedArgumentTypes.length > expectedArgumentTypes.length) {
|
|
232
|
+
throw new SpuriousFunctionArgumentException_js_1.SpuriousFunctionArgumentException(functionName, "[unexpected argument]", expectedArgumentTypes.length, ctx, `Function expects (at most) ${expectedArgumentTypes.length} arguments`);
|
|
233
|
+
}
|
|
234
|
+
for (let i = 0; i < expectedArgumentTypes.length; i++) {
|
|
235
|
+
if (providedArgumentTypes.length <= i) {
|
|
236
|
+
throw new MissingFunctionArgumentException_js_1.MissingFunctionArgumentException(functionName, `[arg${i}]`, i, ctx);
|
|
237
|
+
}
|
|
238
|
+
Types_js_1.Types.requireWeakIsAssignableFrom(expectedArgumentTypes[i], providedArgumentTypes[i][1], () => new WrongFunctionArgumentTypeException_js_1.WrongFunctionArgumentTypeException(functionName, `[arg${i}]`, expectedArgumentTypes[i], providedArgumentTypes[i][1], i, providedArgumentTypes[i][0]));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
popMethodCallTarget(ctx) {
|
|
242
|
+
const target = this.methodCallTargetStack.pop();
|
|
243
|
+
if ((0, IfcExpressionUtils_js_1.isNullish)(target)) {
|
|
244
|
+
throw new ValidationException_js_1.ValidationException("Did not find expected method call target on stack", ctx);
|
|
245
|
+
}
|
|
246
|
+
return target;
|
|
247
|
+
}
|
|
188
248
|
}
|
|
189
249
|
exports.IfcExpressionValidationListener = IfcExpressionValidationListener;
|
|
190
250
|
//# sourceMappingURL=IfcExpressionValidationListener.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/compiler/IfcExpressionValidationListener.ts"],"names":[],"mappings":"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","file":"compiler/IfcExpressionValidationListener.js","sourcesContent":["import IfcExpressionListener from \"../gen/parser/IfcExpressionListener.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 { IfcExpressionFunctions } from \"../expression/function/IfcExpressionFunctions.js\";\nimport { NoSuchFunctionException } from \"../error/NoSuchFunctionException.js\";\nimport { InvalidSyntaxException } from \"../error/InvalidSyntaxException.js\";\nimport { Type, Types } from \"../type/Types.js\";\nimport { ParserRuleContext } from \"antlr4\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { isNullish } from \"../util/IfcExpressionUtils.js\";\nimport { ValidationException } from \"../error/ValidationException.js\";\nimport { ExprType } from \"../type/ExprType.js\";\n\nexport class IfcExpressionValidationListener extends IfcExpressionListener {\n private readonly typeManager: TypeManager;\n private methodCallTargetStack = [];\n constructor() {\n super();\n this.typeManager = new TypeManager();\n }\n\n public getTypeManager(): TypeManager {\n return this.typeManager;\n }\n\n enterFunctionCall: (ctx: FunctionCallContext) => void = (ctx) => {\n if (!IfcExpressionFunctions.isBuiltinFunction(ctx.IDENTIFIER().getText())) {\n throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);\n }\n };\n\n enterSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => void = (\n ctx\n ) => {\n throw new InvalidSyntaxException(\"--\", ctx);\n };\n\n exitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => void = (ctx) => {\n this.typeManager.requireLogicalOrBoolean(ctx._left);\n this.typeManager.requireLogicalOrBoolean(ctx._right);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEComparison: (ctx: SEComparisonContext) => void = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEParenthesis: (ctx: SEParenthesisContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n\n exitSELiteral: (ctx: SELiteralContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n exitLiteral: (ctx: LiteralContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.getChild(0) as ParserRuleContext);\n };\n exitNumLiteral: (ctx: NumLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitStringLiteral: (ctx: StringLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.string());\n };\n\n exitBooleanLiteral: (ctx: BooleanLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitLogicalLiteral: (ctx: LogicalLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.logical());\n };\n\n exitExpr: (ctx: ExprContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.singleExpr());\n };\n\n exitSEMulDiv: (ctx: SEMulDivContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._left);\n this.typeManager.requireNumeric(ctx._right);\n this.typeManager.setType(ctx, Types.numeric());\n };\n\n exitSEPower: (ctx: SEPowerContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._left);\n this.typeManager.requireNumeric(ctx._right);\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitSEFunctionCall: (ctx: SEFunctionCallContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n exitSEArrayExpr: (ctx: SEArrayExprContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n\n exitSENot: (ctx: SENotContext) => void = (ctx) => {\n this.typeManager.requireLogicalOrBoolean(ctx._sub);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEVariableRef: (ctx: SEVariableRefContext) => void = (ctx) => {\n switch (ctx._sub.IDENTIFIER().getText()) {\n case \"property\":\n this.typeManager.setType(ctx, Type.IFC_PROPERTY_REF);\n return;\n case \"element\":\n this.typeManager.setType(ctx, Type.IFC_ELEMENT_REF);\n return;\n }\n throw new ValidationException(\n `Encountered Variable ref that was neither $property nor $element`,\n ctx\n );\n };\n\n exitSEUnaryMinus: (ctx: SEUnaryMinusContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._sub);\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitSEAddSub: (ctx: SEAddSubContext) => void = (ctx) => {\n if (this.typeManager.overlapsWithString(ctx._left, ctx._right)) {\n this.typeManager.setType(ctx, Types.string());\n } else if (this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)) {\n this.typeManager.setType(ctx, Types.numeric());\n } else {\n throw new ExpressionTypeError(\n `Operator '+' does not allow provided operand types ${this.typeManager\n .getType(ctx._left)\n .getName()}(left operand) and ${this.typeManager\n .getType(ctx._right)\n .getName()}(right operand). Operands must be both string or both numeric.`,\n ctx\n );\n }\n };\n\n exitSEMethodCall: (ctx: SEMethodCallContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._call);\n };\n\n enterMethodCallChainInner: (ctx: MethodCallChainInnerContext) => void = (\n ctx\n ) => {\n this.pushMethodCallTarget(ctx);\n };\n exitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => void = (\n ctx\n ) => {\n this.typeManager.copyTypeFrom(ctx, ctx._call);\n };\n\n enterMethodCallChainEnd: (ctx: MethodCallChainEndContext) => void = (ctx) => {\n this.pushMethodCallTarget(ctx);\n };\n\n private pushMethodCallTarget(ctx: ParserRuleContext) {\n if (ctx.parentCtx[\"_target\"]) {\n const targetType = this.typeManager.getType(ctx.parentCtx[\"_target\"]);\n this.methodCallTargetStack.push([ctx, targetType]);\n } else {\n throw new ValidationException(\n \"Did not find expected context attribute 'target' in parent rule context\",\n ctx\n );\n }\n }\n\n exitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.functionCall());\n };\n\n exitFunctionCall: (ctx: FunctionCallContext) => void = (ctx) => {\n const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());\n const argumentTypes = this.collectArgumentTypes(ctx.exprList());\n const parent = ctx.parentCtx;\n if (\n parent instanceof MethodCallChainInnerContext ||\n parent instanceof MethodCallChainEndContext ||\n parent instanceof SEMethodCallContext\n ) {\n argumentTypes.unshift(this.methodCallTargetStack.pop());\n }\n const returnType = func.checkArgumentsAndGetReturnType(argumentTypes, ctx);\n this.typeManager.setType(ctx, returnType);\n };\n\n private collectArgumentTypes: (\n ctx: ExprListContext,\n resultSoFar?: Array<[ParserRuleContext, ExprType]>\n ) => Array<[ParserRuleContext, ExprType]> = (\n ctx,\n resultSoFar?: Array<[ParserRuleContext, ExprType]>\n ) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push([\n ctx.singleExpr(),\n this.typeManager.getType(ctx.singleExpr()),\n ]);\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectArgumentTypes(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n exitExprList: (ctx: ExprListContext) => void;\n\n exitArrayExpr: (ctx: ArrayExprContext) => void = (ctx) => {\n this.typeManager.setType(\n ctx,\n Types.tuple(...this.collectArrayElementTypes(ctx.arrayElementList()))\n );\n };\n\n private collectArrayElementTypes: (\n ctx: ArrayElementListContext,\n resultSoFar?: Array<ExprType>\n ) => Array<ExprType> = (ctx, resultSoFar?: Array<ExprType>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.typeManager.getType(ctx.singleExpr()));\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n return this.collectArrayElementTypes(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n exitArrayElementList: (ctx: ArrayElementListContext) => void;\n exitVariableRef: (ctx: VariableRefContext) => void = (ctx) => {\n this.typeManager.setType(\n ctx,\n Types.or(Type.IFC_PROPERTY_REF, Type.IFC_ELEMENT_REF)\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/compiler/IfcExpressionValidationListener.ts"],"names":[],"mappings":"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","file":"compiler/IfcExpressionValidationListener.js","sourcesContent":["import { IfcExpressionListener } from \"../gen/parser/IfcExpressionListener.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 { IfcExpressionFunctions } from \"../expression/function/IfcExpressionFunctions.js\";\nimport { NoSuchFunctionException } from \"../error/NoSuchFunctionException.js\";\nimport { InvalidSyntaxException } from \"../error/InvalidSyntaxException.js\";\nimport { Type, Types } from \"../type/Types.js\";\nimport { ParserRuleContext } from \"antlr4ng\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { isNullish } from \"../util/IfcExpressionUtils.js\";\nimport { ValidationException } from \"../error/ValidationException.js\";\nimport { ExprType } from \"../type/ExprType.js\";\nimport {\n BuiltinVariableRegistry,\n isBuiltinFunctionDefinition,\n isBuiltinPropertyDefinition,\n} from \"../builtin/BuiltinVariableRegistry.js\";\nimport { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { NoSuchMemberException } from \"../error/NoSuchMemberException.js\";\nimport { NoSuchMethodException } from \"../error/NoSuchMethodException.js\";\nimport { WrongFunctionArgumentTypeException } from \"../error/WrongFunctionArgumentTypeException.js\";\nimport { MissingFunctionArgumentException } from \"../error/MissingFunctionArgumentException.js\";\nimport { SpuriousFunctionArgumentException } from \"../error/SpuriousFunctionArgumentException.js\";\n\nexport class IfcExpressionValidationListener extends IfcExpressionListener {\n private readonly typeManager: TypeManager;\n private methodCallTargetStack: Array<[ParserRuleContext, ExprType]> = [];\n private readonly builtinVariableRegistry: BuiltinVariableRegistry;\n\n constructor(\n builtinVariableRegistry: BuiltinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()\n ) {\n super();\n this.typeManager = new TypeManager();\n this.builtinVariableRegistry = builtinVariableRegistry;\n }\n\n public getTypeManager(): TypeManager {\n return this.typeManager;\n }\n\n enterFunctionCall: (ctx: FunctionCallContext) => void = (ctx) => {\n if (!IfcExpressionFunctions.isBuiltinFunction(ctx.IDENTIFIER().getText())) {\n const parent = ctx.parent;\n const grandParent = parent?.parent;\n const isMethodAccessor =\n parent instanceof MethodFunctionCallContext &&\n (grandParent instanceof MethodCallChainInnerContext ||\n grandParent instanceof MethodCallChainEndContext);\n if (!isMethodAccessor) {\n throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);\n }\n }\n };\n\n enterSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => void = (\n ctx\n ) => {\n throw new InvalidSyntaxException(\"--\", ctx);\n };\n\n exitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => void = (ctx) => {\n this.typeManager.requireLogicalOrBoolean(ctx._left);\n this.typeManager.requireLogicalOrBoolean(ctx._right);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEComparison: (ctx: SEComparisonContext) => void = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEParenthesis: (ctx: SEParenthesisContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n\n exitSELiteral: (ctx: SELiteralContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n exitLiteral: (ctx: LiteralContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.getChild(0) as ParserRuleContext);\n };\n exitNumLiteral: (ctx: NumLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitStringLiteral: (ctx: StringLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.string());\n };\n\n exitBooleanLiteral: (ctx: BooleanLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitLogicalLiteral: (ctx: LogicalLiteralContext) => void = (ctx) => {\n this.typeManager.setType(ctx, Types.logical());\n };\n\n exitExpr: (ctx: ExprContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.singleExpr());\n };\n\n exitSEMulDiv: (ctx: SEMulDivContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._left);\n this.typeManager.requireNumeric(ctx._right);\n this.typeManager.setType(ctx, Types.numeric());\n };\n\n exitSEPower: (ctx: SEPowerContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._left);\n this.typeManager.requireNumeric(ctx._right);\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitSEFunctionCall: (ctx: SEFunctionCallContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n exitSEArrayExpr: (ctx: SEArrayExprContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._sub);\n };\n\n exitSENot: (ctx: SENotContext) => void = (ctx) => {\n this.typeManager.requireLogicalOrBoolean(ctx._sub);\n this.typeManager.setType(ctx, Types.boolean());\n };\n\n exitSEVariableRef: (ctx: SEVariableRefContext) => void = (ctx) => {\n const builtin = this.builtinVariableRegistry.getDefinition(\n ctx._sub.IDENTIFIER().getText()\n );\n if (builtin) {\n this.typeManager.setType(ctx, builtin.type);\n return;\n }\n throw new ValidationException(\n `Encountered Variable ref that was neither a built-in variable nor a configured client builtin`,\n ctx\n );\n };\n\n exitSEUnaryMinus: (ctx: SEUnaryMinusContext) => void = (ctx) => {\n this.typeManager.requireNumeric(ctx._sub);\n this.typeManager.setType(ctx, Types.numeric());\n };\n exitSEAddSub: (ctx: SEAddSubContext) => void = (ctx) => {\n if (this.typeManager.overlapsWithString(ctx._left, ctx._right)) {\n this.typeManager.setType(ctx, Types.string());\n } else if (this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)) {\n this.typeManager.setType(ctx, Types.numeric());\n } else {\n throw new ExpressionTypeError(\n `Operator '+' does not allow provided operand types ${this.typeManager\n .getType(ctx._left)\n .getName()}(left operand) and ${this.typeManager\n .getType(ctx._right)\n .getName()}(right operand). Operands must be both string or both numeric.`,\n ctx\n );\n }\n };\n\n exitSEMethodCall: (ctx: SEMethodCallContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._call);\n };\n\n enterMethodCallChainInner: (ctx: MethodCallChainInnerContext) => void = (\n ctx\n ) => {\n this.pushMethodCallTarget(ctx);\n };\n exitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => void = (\n ctx\n ) => {\n this.typeManager.copyTypeFrom(ctx, ctx._call);\n };\n\n enterMethodCallChainEnd: (ctx: MethodCallChainEndContext) => void = (ctx) => {\n this.pushMethodCallTarget(ctx);\n };\n\n private pushMethodCallTarget(ctx: ParserRuleContext) {\n if (ctx.parent[\"_target\"]) {\n const targetType = this.typeManager.getType(ctx.parent[\"_target\"]);\n this.methodCallTargetStack.push([ctx.parent[\"_target\"], targetType]);\n } else {\n throw new ValidationException(\n \"Did not find expected context attribute 'target' in parent rule context\",\n ctx\n );\n }\n }\n\n exitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx._call);\n };\n\n exitMethodFunctionCall: (ctx: MethodFunctionCallContext) => void = (ctx) => {\n this.typeManager.copyTypeFrom(ctx, ctx.functionCall());\n };\n\n exitMethodPropertyAccess: (ctx: MethodPropertyAccessContext) => void = (\n ctx\n ) => {\n const [_, targetType] = this.popMethodCallTarget(ctx);\n if (!(targetType instanceof ContextObjectType)) {\n throw new NoSuchMemberException(\n ctx.IDENTIFIER().getText(),\n targetType.getName(),\n ctx\n );\n }\n const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());\n if (!isBuiltinPropertyDefinition(member)) {\n throw new NoSuchMemberException(\n ctx.IDENTIFIER().getText(),\n targetType.getName(),\n ctx\n );\n }\n this.typeManager.setType(ctx, member.valueType);\n };\n\n exitFunctionCall: (ctx: FunctionCallContext) => void = (ctx) => {\n const argumentTypes = this.collectArgumentTypes(ctx.exprList());\n const parent = ctx.parent;\n const grandParent = parent?.parent;\n const isMethodAccessor =\n parent instanceof MethodFunctionCallContext &&\n (grandParent instanceof MethodCallChainInnerContext ||\n grandParent instanceof MethodCallChainEndContext);\n\n if (isMethodAccessor) {\n const [targetCtx, targetType] = this.popMethodCallTarget(ctx);\n if (targetType instanceof ContextObjectType) {\n const member = targetType.getMemberDefinition(\n ctx.IDENTIFIER().getText()\n );\n if (!isBuiltinFunctionDefinition(member)) {\n throw new NoSuchMethodException(\n ctx.IDENTIFIER().getText(),\n targetType.getName(),\n ctx\n );\n }\n this.checkBuiltinFunctionArguments(\n ctx.IDENTIFIER().getText(),\n member.argumentTypes,\n argumentTypes,\n ctx\n );\n this.typeManager.setType(ctx, member.returnType);\n return;\n }\n argumentTypes.unshift([targetCtx, targetType]);\n }\n\n const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());\n if (isNullish(func)) {\n throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);\n }\n const returnType = func.checkArgumentsAndGetReturnType(argumentTypes, ctx);\n this.typeManager.setType(ctx, returnType);\n };\n\n private checkBuiltinFunctionArguments(\n functionName: string,\n expectedArgumentTypes: Array<ExprType>,\n providedArgumentTypes: Array<[ParserRuleContext, ExprType]>,\n ctx: ParserRuleContext\n ) {\n if (providedArgumentTypes.length > expectedArgumentTypes.length) {\n throw new SpuriousFunctionArgumentException(\n functionName,\n \"[unexpected argument]\",\n expectedArgumentTypes.length,\n ctx,\n `Function expects (at most) ${expectedArgumentTypes.length} arguments`\n );\n }\n for (let i = 0; i < expectedArgumentTypes.length; i++) {\n if (providedArgumentTypes.length <= i) {\n throw new MissingFunctionArgumentException(\n functionName,\n `[arg${i}]`,\n i,\n ctx\n );\n }\n Types.requireWeakIsAssignableFrom(\n expectedArgumentTypes[i],\n providedArgumentTypes[i][1],\n () =>\n new WrongFunctionArgumentTypeException(\n functionName,\n `[arg${i}]`,\n expectedArgumentTypes[i],\n providedArgumentTypes[i][1],\n i,\n providedArgumentTypes[i][0]\n )\n );\n }\n }\n\n private popMethodCallTarget(\n ctx: ParserRuleContext\n ): [ParserRuleContext, ExprType] {\n const target = this.methodCallTargetStack.pop();\n if (isNullish(target)) {\n throw new ValidationException(\n \"Did not find expected method call target on stack\",\n ctx\n );\n }\n return target;\n }\n\n private collectArgumentTypes: (\n ctx: ExprListContext,\n resultSoFar?: Array<[ParserRuleContext, ExprType]>\n ) => Array<[ParserRuleContext, ExprType]> = (\n ctx,\n resultSoFar?: Array<[ParserRuleContext, ExprType]>\n ) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push([\n ctx.singleExpr(),\n this.typeManager.getType(ctx.singleExpr()),\n ]);\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectArgumentTypes(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n exitExprList: (ctx: ExprListContext) => void;\n\n exitArrayExpr: (ctx: ArrayExprContext) => void = (ctx) => {\n this.typeManager.setType(\n ctx,\n Types.tuple(...this.collectArrayElementTypes(ctx.arrayElementList()))\n );\n };\n\n private collectArrayElementTypes: (\n ctx: ArrayElementListContext,\n resultSoFar?: Array<ExprType>\n ) => Array<ExprType> = (ctx, resultSoFar?: Array<ExprType>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.typeManager.getType(ctx.singleExpr()));\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n return this.collectArrayElementTypes(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n exitArrayElementList: (ctx: ArrayElementListContext) => void;\n exitVariableRef: (ctx: VariableRefContext) => void = (ctx) => {\n const builtinTypes = [Type.IFC_PROPERTY_REF, Type.IFC_ELEMENT_REF];\n const otherBuiltinDefinitions = [\"property\", \"element\"]\n .map((name) => this.builtinVariableRegistry.getDefinition(name)?.type)\n .filter((type) => !isNullish(type));\n this.typeManager.setType(\n ctx,\n Types.or(...builtinTypes, ...otherBuiltinDefinitions)\n );\n };\n}\n"]}
|