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
|
@@ -3,8 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.IfcExpression = exports.IfcExpressionParseResult = exports.Types = exports.TypeDisjunction = exports.TupleType = exports.SimpleType = exports.ArrayType = exports.ExprFacade = exports.ExprToTextInputLinker = exports.isExprEvalSuccess = exports.isExprEvalError = exports.isNullish = exports.isPresent = exports.IfcExpressionVisitor = exports.IfcExpressionErrorListener = exports.IfcExpressionEvaluationException = exports.ExprKind = exports.ExprCompiler = exports.NamedObjectAccessor = exports.IfcTypeObjectAccessor = exports.IfcRootObjectAccessor = exports.IfcPropertyAccessor = exports.IfcPropertySetAccessor = exports.IfcTimeStampValue = exports.IfcDurationValue = exports.IfcTimeValue = exports.IfcDateTimeValue = exports.IfcDateValue = exports.ReferenceValue = exports.NumericValue = exports.LogicalValue = exports.BooleanValue = exports.StringValue = exports.IfcElementAccessor = void 0;
|
|
7
|
-
const
|
|
6
|
+
exports.IfcExpression = exports.IfcExpressionParseResult = exports.IfcExpressionAutocomplete = exports.BuiltinVariableRegistry = exports.ContextObjectType = exports.Types = exports.TypeDisjunction = exports.TupleType = exports.SimpleType = exports.ArrayType = exports.ExprFacade = exports.ExprToTextInputLinker = exports.isExprEvalSuccess = exports.isExprEvalError = exports.isNullish = exports.isPresent = exports.IfcExpressionVisitor = exports.IfcExpressionErrorListener = exports.IfcExpressionEvaluationException = exports.ExprKind = exports.ExprCompiler = exports.NamedObjectAccessor = exports.IfcTypeObjectAccessor = exports.IfcRootObjectAccessor = exports.IfcPropertyAccessor = exports.IfcPropertySetAccessor = exports.IfcTimeStampValue = exports.IfcDurationValue = exports.IfcTimeValue = exports.IfcDateTimeValue = exports.IfcDateValue = exports.ReferenceValue = exports.NumericValue = exports.LogicalValue = exports.BooleanValue = exports.StringValue = exports.IfcElementAccessor = void 0;
|
|
7
|
+
const antlr4ng_1 = require("antlr4ng");
|
|
8
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
8
9
|
const ExprCompiler_js_1 = require("./compiler/ExprCompiler.js");
|
|
9
10
|
Object.defineProperty(exports, "ExprCompiler", { enumerable: true, get: function () { return ExprCompiler_js_1.ExprCompiler; } });
|
|
10
11
|
const IfcExpressionErrorListener_js_1 = require("./IfcExpressionErrorListener.js");
|
|
@@ -35,12 +36,14 @@ const IfcTypeObjectAccessor_js_1 = require("./context/IfcTypeObjectAccessor.js")
|
|
|
35
36
|
Object.defineProperty(exports, "IfcTypeObjectAccessor", { enumerable: true, get: function () { return IfcTypeObjectAccessor_js_1.IfcTypeObjectAccessor; } });
|
|
36
37
|
const NamedObjectAccessor_js_1 = require("./context/NamedObjectAccessor.js");
|
|
37
38
|
Object.defineProperty(exports, "NamedObjectAccessor", { enumerable: true, get: function () { return NamedObjectAccessor_js_1.NamedObjectAccessor; } });
|
|
38
|
-
const IfcExpressionParser_js_1 =
|
|
39
|
-
const IfcExpressionVisitor_js_1 =
|
|
40
|
-
exports
|
|
41
|
-
const IfcExpressionLexer_js_1 =
|
|
39
|
+
const IfcExpressionParser_js_1 = require("./gen/parser/IfcExpressionParser.js");
|
|
40
|
+
const IfcExpressionVisitor_js_1 = require("./gen/parser/IfcExpressionVisitor.js");
|
|
41
|
+
Object.defineProperty(exports, "IfcExpressionVisitor", { enumerable: true, get: function () { return IfcExpressionVisitor_js_1.IfcExpressionVisitor; } });
|
|
42
|
+
const IfcExpressionLexer_js_1 = require("./gen/parser/IfcExpressionLexer.js");
|
|
42
43
|
const IfcExpressionEvaluationException_js_1 = require("./expression/IfcExpressionEvaluationException.js");
|
|
43
44
|
Object.defineProperty(exports, "IfcExpressionEvaluationException", { enumerable: true, get: function () { return IfcExpressionEvaluationException_js_1.IfcExpressionEvaluationException; } });
|
|
45
|
+
const ArrayValue_js_1 = require("./value/ArrayValue.js");
|
|
46
|
+
const ContextObjectValue_js_1 = require("./value/ContextObjectValue.js");
|
|
44
47
|
const ExprEvalResult_js_1 = require("./expression/ExprEvalResult.js");
|
|
45
48
|
Object.defineProperty(exports, "isExprEvalError", { enumerable: true, get: function () { return ExprEvalResult_js_1.isExprEvalError; } });
|
|
46
49
|
Object.defineProperty(exports, "isExprEvalSuccess", { enumerable: true, get: function () { return ExprEvalResult_js_1.isExprEvalSuccess; } });
|
|
@@ -73,11 +76,19 @@ const TypeDisjunction_js_1 = require("./type/TypeDisjunction.js");
|
|
|
73
76
|
Object.defineProperty(exports, "TypeDisjunction", { enumerable: true, get: function () { return TypeDisjunction_js_1.TypeDisjunction; } });
|
|
74
77
|
const Types_js_1 = require("./type/Types.js");
|
|
75
78
|
Object.defineProperty(exports, "Types", { enumerable: true, get: function () { return Types_js_1.Types; } });
|
|
79
|
+
const ContextObjectType_js_1 = require("./type/ContextObjectType.js");
|
|
80
|
+
Object.defineProperty(exports, "ContextObjectType", { enumerable: true, get: function () { return ContextObjectType_js_1.ContextObjectType; } });
|
|
81
|
+
const BuiltinVariableRegistry_js_1 = require("./builtin/BuiltinVariableRegistry.js");
|
|
82
|
+
Object.defineProperty(exports, "BuiltinVariableRegistry", { enumerable: true, get: function () { return BuiltinVariableRegistry_js_1.BuiltinVariableRegistry; } });
|
|
83
|
+
const IfcExpressionAutocomplete_js_1 = require("./autocomplete/IfcExpressionAutocomplete.js");
|
|
84
|
+
Object.defineProperty(exports, "IfcExpressionAutocomplete", { enumerable: true, get: function () { return IfcExpressionAutocomplete_js_1.IfcExpressionAutocomplete; } });
|
|
85
|
+
const ObjectAccessorValue_js_1 = require("./value/ObjectAccessorValue.js");
|
|
76
86
|
class IfcExpressionParseResult {
|
|
77
|
-
constructor(input, typeManager, exprContext) {
|
|
87
|
+
constructor(input, typeManager, exprContext, builtinVariableRegistry) {
|
|
78
88
|
this._typeManager = typeManager;
|
|
79
89
|
this._parseTree = exprContext;
|
|
80
90
|
this._input = input;
|
|
91
|
+
this._builtinVariableRegistry = builtinVariableRegistry;
|
|
81
92
|
}
|
|
82
93
|
get typeManager() {
|
|
83
94
|
return this._typeManager;
|
|
@@ -88,20 +99,19 @@ class IfcExpressionParseResult {
|
|
|
88
99
|
get input() {
|
|
89
100
|
return this._input;
|
|
90
101
|
}
|
|
102
|
+
get builtinVariableRegistry() {
|
|
103
|
+
return this._builtinVariableRegistry;
|
|
104
|
+
}
|
|
91
105
|
}
|
|
92
106
|
exports.IfcExpressionParseResult = IfcExpressionParseResult;
|
|
93
107
|
class IfcExpression {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const chars = new antlr4_1.CharStream(input); // replace this with a FileStream as required
|
|
102
|
-
const lexer = new IfcExpressionLexer_js_1.default(chars);
|
|
103
|
-
const tokens = new antlr4_1.CommonTokenStream(lexer);
|
|
104
|
-
const parser = new IfcExpressionParser_js_1.default(tokens);
|
|
108
|
+
static parse(input, errorListener, options = {}) {
|
|
109
|
+
const builtinVariableRegistry = options.builtinVariableRegistry ??
|
|
110
|
+
BuiltinVariableRegistry_js_1.BuiltinVariableRegistry.getDefaultRegistry();
|
|
111
|
+
const chars = antlr4ng_1.CharStream.fromString(input);
|
|
112
|
+
const lexer = new IfcExpressionLexer_js_1.IfcExpressionLexer(chars);
|
|
113
|
+
const tokens = new antlr4ng_1.CommonTokenStream(lexer);
|
|
114
|
+
const parser = new IfcExpressionParser_js_1.IfcExpressionParser(tokens);
|
|
105
115
|
lexer.removeErrorListeners();
|
|
106
116
|
parser.removeErrorListeners();
|
|
107
117
|
const myErrorListener = new IfcExpressionErrorListener_js_1.IfcExpressionErrorListener();
|
|
@@ -113,9 +123,9 @@ class IfcExpression {
|
|
|
113
123
|
parser.addErrorListener(myErrorListener);
|
|
114
124
|
let expr;
|
|
115
125
|
expr = parser.expr();
|
|
116
|
-
const validationListener = new IfcExpressionValidationListener_js_1.IfcExpressionValidationListener();
|
|
126
|
+
const validationListener = new IfcExpressionValidationListener_js_1.IfcExpressionValidationListener(builtinVariableRegistry);
|
|
117
127
|
if (!myErrorListener.isErrorOccurred()) {
|
|
118
|
-
const walker = new
|
|
128
|
+
const walker = new antlr4ng_1.ParseTreeWalker();
|
|
119
129
|
try {
|
|
120
130
|
walker.walk(validationListener, expr);
|
|
121
131
|
}
|
|
@@ -128,30 +138,17 @@ class IfcExpression {
|
|
|
128
138
|
}
|
|
129
139
|
}
|
|
130
140
|
}
|
|
131
|
-
return new IfcExpressionParseResult(input, validationListener.getTypeManager(), expr);
|
|
141
|
+
return new IfcExpressionParseResult(input, validationListener.getTypeManager(), expr, builtinVariableRegistry);
|
|
132
142
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Compiles the specified parseResult into an Expr.
|
|
135
|
-
* @param parseResult
|
|
136
|
-
* @return the Expression (Expr), which can be evaluated to obtain its result.
|
|
137
|
-
*/
|
|
138
143
|
static compile(parseResult) {
|
|
139
|
-
const compiler = new ExprCompiler_js_1.ExprCompiler(parseResult.typeManager);
|
|
144
|
+
const compiler = new ExprCompiler_js_1.ExprCompiler(parseResult.typeManager, parseResult.builtinVariableRegistry);
|
|
140
145
|
const expr = compiler.visit(parseResult.parseTree);
|
|
141
146
|
ExprToTextInputLinker_js_1.ExprToTextInputLinker.linkTextToExpressions(parseResult.input, expr, compiler.getExprManager());
|
|
142
147
|
return new ExprFacade_js_1.ExprFacade(expr);
|
|
143
148
|
}
|
|
144
|
-
|
|
145
|
-
* Evaluates the specified input expression and returns the evaluation result. The parse
|
|
146
|
-
* and compile steps are done internally.
|
|
147
|
-
*
|
|
148
|
-
* @param expression: the input expression
|
|
149
|
-
* @param context: the context required for accessing the IFC model
|
|
150
|
-
* @return the result (or an error object).
|
|
151
|
-
*/
|
|
152
|
-
static evaluate(expression, context = new NopContext_js_1.NopContext()) {
|
|
149
|
+
static evaluate(expression, context = new NopContext_js_1.NopContext(), options = {}) {
|
|
153
150
|
const errorListener = new IfcExpressionErrorListener_js_1.IfcExpressionErrorListener();
|
|
154
|
-
const parseResult = IfcExpression.parse(expression, errorListener);
|
|
151
|
+
const parseResult = IfcExpression.parse(expression, errorListener, options);
|
|
155
152
|
if (errorListener.isErrorOccurred()) {
|
|
156
153
|
return (0, ExceptionToExprEvalErrorMapper_js_1.mapException)(errorListener.getException());
|
|
157
154
|
}
|
|
@@ -180,6 +177,84 @@ class IfcExpression {
|
|
|
180
177
|
static evaluateExpression(expr, context = new NopContext_js_1.NopContext()) {
|
|
181
178
|
return expr.evaluate(context);
|
|
182
179
|
}
|
|
180
|
+
static unwrapValue(value) {
|
|
181
|
+
return this.unwrapUnknownValue(value);
|
|
182
|
+
}
|
|
183
|
+
static unwrapUnknownValue(value) {
|
|
184
|
+
if (value instanceof StringValue_js_1.StringValue || value instanceof BooleanValue_js_1.BooleanValue) {
|
|
185
|
+
return value.getValue();
|
|
186
|
+
}
|
|
187
|
+
if (value instanceof NumericValue_js_1.NumericValue) {
|
|
188
|
+
return value.getValue();
|
|
189
|
+
}
|
|
190
|
+
if (value instanceof LogicalValue_js_1.LogicalValue) {
|
|
191
|
+
return value.isUnknown() ? undefined : value.getValue();
|
|
192
|
+
}
|
|
193
|
+
if (value instanceof ReferenceValue_js_1.ReferenceValue) {
|
|
194
|
+
return value.getValue();
|
|
195
|
+
}
|
|
196
|
+
if (value instanceof IfcTimeStampValue_js_1.IfcTimeStampValue) {
|
|
197
|
+
return value.getTimeStampSeconds();
|
|
198
|
+
}
|
|
199
|
+
if (value instanceof IfcDateValue_js_1.IfcDateValue ||
|
|
200
|
+
value instanceof IfcDateTimeValue_js_1.IfcDateTimeValue ||
|
|
201
|
+
value instanceof IfcTimeValue_js_1.IfcTimeValue ||
|
|
202
|
+
value instanceof IfcDurationValue_js_1.IfcDurationValue) {
|
|
203
|
+
return value.toString();
|
|
204
|
+
}
|
|
205
|
+
if (value instanceof ArrayValue_js_1.ArrayValue) {
|
|
206
|
+
return value.getValue().map((entry) => this.unwrapUnknownValue(entry));
|
|
207
|
+
}
|
|
208
|
+
if (value instanceof ObjectAccessorValue_js_1.ObjectAccessorValue) {
|
|
209
|
+
return this.unwrapObjectAccessor(value.getValue());
|
|
210
|
+
}
|
|
211
|
+
if (value instanceof ContextObjectValue_js_1.ContextObjectValue) {
|
|
212
|
+
return this.unwrapPlainObject(value.getValue());
|
|
213
|
+
}
|
|
214
|
+
if (decimal_js_1.default.isDecimal(value)) {
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
if (typeof value === "number") {
|
|
218
|
+
return NumericValue_js_1.NumericValue.of(value).getValue();
|
|
219
|
+
}
|
|
220
|
+
if (typeof value === "string" ||
|
|
221
|
+
typeof value === "boolean" ||
|
|
222
|
+
typeof value === "undefined") {
|
|
223
|
+
return value;
|
|
224
|
+
}
|
|
225
|
+
if (Array.isArray(value)) {
|
|
226
|
+
return value.map((entry) => this.unwrapUnknownValue(entry));
|
|
227
|
+
}
|
|
228
|
+
if (value instanceof Date) {
|
|
229
|
+
return value.toISOString();
|
|
230
|
+
}
|
|
231
|
+
if (this.isPlainObject(value)) {
|
|
232
|
+
return this.unwrapPlainObject(value);
|
|
233
|
+
}
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
static unwrapObjectAccessor(objectAccessor) {
|
|
237
|
+
const result = {};
|
|
238
|
+
for (const attributeName of objectAccessor.listAttributes()) {
|
|
239
|
+
const attributeValue = objectAccessor.getAttribute(attributeName);
|
|
240
|
+
if (typeof attributeValue !== "undefined") {
|
|
241
|
+
result[attributeName] = this.unwrapUnknownValue(attributeValue);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
static unwrapPlainObject(value) {
|
|
247
|
+
const result = {};
|
|
248
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
249
|
+
result[key] = this.unwrapUnknownValue(nestedValue);
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
static isPlainObject(value) {
|
|
254
|
+
return (typeof value === "object" &&
|
|
255
|
+
value !== null &&
|
|
256
|
+
Object.getPrototypeOf(value) === Object.prototype);
|
|
257
|
+
}
|
|
183
258
|
}
|
|
184
259
|
exports.IfcExpression = IfcExpression;
|
|
185
260
|
//# sourceMappingURL=IfcExpression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/IfcExpression.ts"],"names":[],"mappings":"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","file":"IfcExpression.js","sourcesContent":["import {\n CharStream,\n CommonTokenStream,\n ErrorListener,\n ParserRuleContext,\n ParseTreeWalker,\n Token,\n} from \"antlr4\";\nimport { ExprCompiler } from \"./compiler/ExprCompiler.js\";\nimport { IfcExpressionErrorListener } from \"./IfcExpressionErrorListener.js\";\nimport { IfcExpressionValidationListener } from \"./compiler/IfcExpressionValidationListener.js\";\n\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { IfcExpressionContext } from \"./context/IfcExpressionContext.js\";\nimport { Expr } from \"./expression/Expr.js\";\n\nimport { IfcElementAccessor } from \"./context/IfcElementAccessor.js\";\nimport { Value } from \"./value/Value.js\";\nimport { StringValue } from \"./value/StringValue.js\";\nimport { NumericValue } from \"./value/NumericValue.js\";\nimport { BooleanValue } from \"./value/BooleanValue.js\";\nimport { LogicalValue } from \"./value/LogicalValue.js\";\nimport { ReferenceValue } from \"./value/ReferenceValue.js\";\nimport { IfcPropertySetAccessor } from \"./context/IfcPropertySetAccessor.js\";\nimport { IfcPropertyAccessor } from \"./context/IfcPropertyAccessor.js\";\nimport { IfcRootObjectAccessor } from \"./context/IfcRootObjectAccessor.js\";\nimport { IfcTypeObjectAccessor } from \"./context/IfcTypeObjectAccessor.js\";\nimport { NamedObjectAccessor } from \"./context/NamedObjectAccessor.js\";\nimport IfcExpressionParser from \"./gen/parser/IfcExpressionParser.js\";\nimport IfcExpressionVisitor from \"./gen/parser/IfcExpressionVisitor.js\";\nimport IfcExpressionLexer from \"./gen/parser/IfcExpressionLexer.js\";\nimport { ObjectAccessor } from \"./context/ObjectAccessor.js\";\nimport { IfcExpressionEvaluationException } from \"./expression/IfcExpressionEvaluationException.js\";\nimport type { ExpressionValue } from \"./value/ExpressionValue.js\";\nimport type { BoxedValueTypes } from \"./value/BoxedValueTypes.js\";\nimport {\n ExprEvalError,\n ExprEvalResult,\n isExprEvalError,\n isExprEvalSuccess,\n} from \"./expression/ExprEvalResult.js\";\nimport { ExprKind } from \"./expression/ExprKind.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\nimport { TypeManager } from \"./compiler/TypeManager.js\";\nimport { mapException } from \"./error/ExceptionToExprEvalErrorMapper.js\";\nimport { NopContext } from \"./context/NopContext.js\";\nimport { ExprToTextInputLinker } from \"./compiler/ExprToTextInputLinker.js\";\nimport { TextSpan } from \"./util/TextSpan.js\";\nimport { ExprFacade } from \"./expression/ExprFacade.js\";\nimport { IfcDurationValue } from \"./value/IfcDurationValue\";\nimport { IfcDateValue } from \"./value/IfcDateValue.js\";\nimport { IfcDateTimeValue } from \"./value/IfcDateTimeValue.js\";\nimport { IfcTimeValue } from \"./value/IfcTimeValue.js\";\nimport { IfcTimeStampValue } from \"./value/IfcTimeStampValue.js\";\nimport { ArrayType } from \"./type/ArrayType.js\";\nimport { ExprType } from \"./type/ExprType.js\";\nimport { SimpleType } from \"./type/SimpleType.js\";\nimport { TupleType } from \"./type/TupleType.js\";\nimport { TypeDisjunction } from \"./type/TypeDisjunction.js\";\nimport { Types } from \"./type/Types.js\";\n\nexport {\n IfcElementAccessor,\n IfcExpressionContext,\n Value,\n StringValue,\n BooleanValue,\n LogicalValue,\n NumericValue,\n ExpressionValue,\n ReferenceValue,\n IfcDateValue,\n IfcDateTimeValue,\n IfcTimeValue,\n IfcDurationValue,\n IfcTimeStampValue,\n IfcPropertySetAccessor,\n IfcPropertyAccessor,\n IfcRootObjectAccessor,\n IfcTypeObjectAccessor,\n NamedObjectAccessor,\n ObjectAccessor,\n Expr,\n ExprCompiler,\n ExprKind,\n IfcExpressionEvaluationException,\n IfcExpressionErrorListener,\n IfcExpressionVisitor,\n isPresent,\n isNullish,\n ExprEvalResult,\n ExprEvalError,\n isExprEvalError,\n isExprEvalSuccess,\n ExprToTextInputLinker,\n ExprFacade,\n ArrayType,\n ExprType,\n SimpleType,\n TupleType,\n TypeDisjunction,\n Types,\n};\n\nexport type { BoxedValueTypes };\n\nexport class IfcExpressionParseResult {\n private readonly _input: string;\n private readonly _typeManager: TypeManager;\n private readonly _parseTree: ParserRuleContext;\n\n constructor(input: string, typeManager: TypeManager, exprContext) {\n this._typeManager = typeManager;\n this._parseTree = exprContext;\n this._input = input;\n }\n\n get typeManager(): TypeManager {\n return this._typeManager;\n }\n\n get parseTree(): ParserRuleContext {\n return this._parseTree;\n }\n\n get input(): string {\n return this._input;\n }\n}\n\nexport class IfcExpression {\n /**\n * Parses the input and returns a parse result, which contains the parse tree, the type information per parse tree node, and the input.\n * @param input\n * @param errorListener\n * @return the parse result, which can subequently be compiled into an Expr using compile().\n */\n public static parse(\n input: string,\n errorListener?: ErrorListener<Token | number>\n ): IfcExpressionParseResult {\n const chars = new CharStream(input); // replace this with a FileStream as required\n const lexer = new IfcExpressionLexer(chars);\n const tokens = new CommonTokenStream(lexer);\n const parser = new IfcExpressionParser(tokens);\n lexer.removeErrorListeners();\n parser.removeErrorListeners();\n const myErrorListener = new IfcExpressionErrorListener();\n if (isPresent(errorListener)) {\n lexer.addErrorListener(errorListener);\n parser.addErrorListener(errorListener);\n }\n lexer.addErrorListener(myErrorListener);\n parser.addErrorListener(myErrorListener);\n let expr;\n expr = parser.expr();\n const validationListener = new IfcExpressionValidationListener();\n if (!myErrorListener.isErrorOccurred()) {\n const walker = new ParseTreeWalker();\n try {\n walker.walk(validationListener, expr);\n } catch (e) {\n if (e instanceof ValidationException) {\n if (errorListener instanceof IfcExpressionErrorListener) {\n errorListener.validationException(e);\n }\n myErrorListener.validationException(e);\n }\n }\n }\n return new IfcExpressionParseResult(\n input,\n validationListener.getTypeManager(),\n expr\n );\n }\n\n /**\n * Compiles the specified parseResult into an Expr.\n * @param parseResult\n * @return the Expression (Expr), which can be evaluated to obtain its result.\n */\n public static compile(\n parseResult: IfcExpressionParseResult\n ): ExprFacade<ExpressionValue> {\n const compiler = new ExprCompiler(parseResult.typeManager);\n const expr = compiler.visit(parseResult.parseTree);\n ExprToTextInputLinker.linkTextToExpressions(\n parseResult.input,\n expr,\n compiler.getExprManager()\n );\n return new ExprFacade(expr);\n }\n\n /**\n * Evaluates the specified input expression and returns the evaluation result. The parse\n * and compile steps are done internally.\n *\n * @param expression: the input expression\n * @param context: the context required for accessing the IFC model\n * @return the result (or an error object).\n */\n public static evaluate(\n expression: string,\n context: IfcExpressionContext = new NopContext()\n ): ExprEvalResult<ExpressionValue> {\n const errorListener = new IfcExpressionErrorListener();\n const parseResult = IfcExpression.parse(expression, errorListener);\n if (errorListener.isErrorOccurred()) {\n return mapException(errorListener.getException());\n }\n const compiledExpression = this.compile(parseResult);\n return compiledExpression.evaluate(context);\n }\n\n public static formatError(input: string, error: ExprEvalError) {\n const lines = [\"** Error **\"];\n if (!isNullish(error[\"textSpan\"])) {\n const span: TextSpan = error[\"textSpan\"];\n const underlined = span.underline(input, \"^\");\n const startString = \"Input: \";\n const indented = this.indent(underlined, startString.length);\n const replaced = startString + indented.substr(startString.length);\n replaced.split(\"\\n\").forEach((line) => lines.push(line));\n }\n lines.push(\"Problem: \" + error.message);\n return lines.join(\"\\n\");\n }\n\n private static indent(s: string, by: number) {\n return s\n .split(\"\\n\")\n .map((line) => \" \".repeat(by) + line)\n .join(\"\\n\");\n }\n\n public static evaluateExpression(\n expr: ExprFacade<ExpressionValue>,\n context: IfcExpressionContext = new NopContext()\n ) {\n return expr.evaluate(context);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/IfcExpression.ts"],"names":[],"mappings":"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","file":"IfcExpression.js","sourcesContent":["import {\n ANTLRErrorListener,\n CharStream,\n CommonTokenStream,\n ParserRuleContext,\n ParseTreeWalker,\n Token,\n} from \"antlr4ng\";\nimport Decimal from \"decimal.js\";\nimport { ExprCompiler } from \"./compiler/ExprCompiler.js\";\nimport { IfcExpressionErrorListener } from \"./IfcExpressionErrorListener.js\";\nimport { IfcExpressionValidationListener } from \"./compiler/IfcExpressionValidationListener.js\";\n\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { IfcExpressionContext } from \"./context/IfcExpressionContext.js\";\nimport { Expr } from \"./expression/Expr.js\";\n\nimport { IfcElementAccessor } from \"./context/IfcElementAccessor.js\";\nimport { Value } from \"./value/Value.js\";\nimport { StringValue } from \"./value/StringValue.js\";\nimport { NumericValue } from \"./value/NumericValue.js\";\nimport { BooleanValue } from \"./value/BooleanValue.js\";\nimport { LogicalValue } from \"./value/LogicalValue.js\";\nimport { ReferenceValue } from \"./value/ReferenceValue.js\";\nimport { IfcPropertySetAccessor } from \"./context/IfcPropertySetAccessor.js\";\nimport { IfcPropertyAccessor } from \"./context/IfcPropertyAccessor.js\";\nimport { IfcRootObjectAccessor } from \"./context/IfcRootObjectAccessor.js\";\nimport { IfcTypeObjectAccessor } from \"./context/IfcTypeObjectAccessor.js\";\nimport { NamedObjectAccessor } from \"./context/NamedObjectAccessor.js\";\nimport { IfcExpressionParser } from \"./gen/parser/IfcExpressionParser.js\";\nimport { IfcExpressionVisitor } from \"./gen/parser/IfcExpressionVisitor.js\";\nimport { IfcExpressionLexer } from \"./gen/parser/IfcExpressionLexer.js\";\nimport { ObjectAccessor } from \"./context/ObjectAccessor.js\";\nimport { IfcExpressionEvaluationException } from \"./expression/IfcExpressionEvaluationException.js\";\nimport type { ExpressionValue } from \"./value/ExpressionValue.js\";\nimport type { BoxedValueTypes } from \"./value/BoxedValueTypes.js\";\nimport { ArrayValue } from \"./value/ArrayValue.js\";\nimport { ContextObjectValue } from \"./value/ContextObjectValue.js\";\nimport {\n ExprEvalError,\n ExprEvalResult,\n isExprEvalError,\n isExprEvalSuccess,\n} from \"./expression/ExprEvalResult.js\";\nimport { ExprKind } from \"./expression/ExprKind.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\nimport { TypeManager } from \"./compiler/TypeManager.js\";\nimport { mapException } from \"./error/ExceptionToExprEvalErrorMapper.js\";\nimport { NopContext } from \"./context/NopContext.js\";\nimport { ExprToTextInputLinker } from \"./compiler/ExprToTextInputLinker.js\";\nimport { TextSpan } from \"./util/TextSpan.js\";\nimport { ExprFacade } from \"./expression/ExprFacade.js\";\nimport { IfcDurationValue } from \"./value/IfcDurationValue\";\nimport { IfcDateValue } from \"./value/IfcDateValue.js\";\nimport { IfcDateTimeValue } from \"./value/IfcDateTimeValue.js\";\nimport { IfcTimeValue } from \"./value/IfcTimeValue.js\";\nimport { IfcTimeStampValue } from \"./value/IfcTimeStampValue.js\";\nimport { ArrayType } from \"./type/ArrayType.js\";\nimport { ExprType } from \"./type/ExprType.js\";\nimport { SimpleType } from \"./type/SimpleType.js\";\nimport { TupleType } from \"./type/TupleType.js\";\nimport { TypeDisjunction } from \"./type/TypeDisjunction.js\";\nimport { Types } from \"./type/Types.js\";\nimport { ContextObjectType } from \"./type/ContextObjectType.js\";\nimport { BuiltinVariableRegistry } from \"./builtin/BuiltinVariableRegistry.js\";\nimport { IfcExpressionOptions } from \"./IfcExpressionOptions.js\";\nimport { IfcExpressionAutocomplete } from \"./autocomplete/IfcExpressionAutocomplete.js\";\nimport type {\n CompletionItem,\n CompletionResult,\n} from \"./autocomplete/CompletionItem.js\";\nimport type { IfcExpressionAutocompleteOptions } from \"./autocomplete/IfcExpressionAutocomplete.js\";\nimport { ObjectAccessorValue } from \"./value/ObjectAccessorValue.js\";\n\nexport {\n IfcElementAccessor,\n IfcExpressionContext,\n Value,\n StringValue,\n BooleanValue,\n LogicalValue,\n NumericValue,\n ExpressionValue,\n ReferenceValue,\n IfcDateValue,\n IfcDateTimeValue,\n IfcTimeValue,\n IfcDurationValue,\n IfcTimeStampValue,\n IfcPropertySetAccessor,\n IfcPropertyAccessor,\n IfcRootObjectAccessor,\n IfcTypeObjectAccessor,\n NamedObjectAccessor,\n ObjectAccessor,\n Expr,\n ExprCompiler,\n ExprKind,\n IfcExpressionEvaluationException,\n IfcExpressionErrorListener,\n IfcExpressionVisitor,\n isPresent,\n isNullish,\n ExprEvalResult,\n ExprEvalError,\n isExprEvalError,\n isExprEvalSuccess,\n ExprToTextInputLinker,\n ExprFacade,\n ArrayType,\n ExprType,\n SimpleType,\n TupleType,\n TypeDisjunction,\n Types,\n ContextObjectType,\n BuiltinVariableRegistry,\n IfcExpressionAutocomplete,\n};\n\nexport type {\n BoxedValueTypes,\n IfcExpressionOptions,\n CompletionItem,\n CompletionResult,\n IfcExpressionAutocompleteOptions,\n};\n\nexport type UnwrappedExpressionValue =\n | string\n | boolean\n | Decimal\n | undefined\n | UnwrappedExpressionValue[]\n | { [key: string]: UnwrappedExpressionValue };\n\nexport class IfcExpressionParseResult {\n private readonly _input: string;\n private readonly _typeManager: TypeManager;\n private readonly _parseTree: ParserRuleContext;\n private readonly _builtinVariableRegistry: BuiltinVariableRegistry;\n\n constructor(\n input: string,\n typeManager: TypeManager,\n exprContext,\n builtinVariableRegistry: BuiltinVariableRegistry\n ) {\n this._typeManager = typeManager;\n this._parseTree = exprContext;\n this._input = input;\n this._builtinVariableRegistry = builtinVariableRegistry;\n }\n\n get typeManager(): TypeManager {\n return this._typeManager;\n }\n\n get parseTree(): ParserRuleContext {\n return this._parseTree;\n }\n\n get input(): string {\n return this._input;\n }\n\n get builtinVariableRegistry(): BuiltinVariableRegistry {\n return this._builtinVariableRegistry;\n }\n}\n\nexport class IfcExpression {\n public static parse(\n input: string,\n errorListener?: ANTLRErrorListener,\n options: IfcExpressionOptions = {}\n ): IfcExpressionParseResult {\n const builtinVariableRegistry =\n options.builtinVariableRegistry ??\n BuiltinVariableRegistry.getDefaultRegistry();\n const chars = CharStream.fromString(input);\n const lexer = new IfcExpressionLexer(chars);\n const tokens = new CommonTokenStream(lexer);\n const parser = new IfcExpressionParser(tokens);\n lexer.removeErrorListeners();\n parser.removeErrorListeners();\n const myErrorListener = new IfcExpressionErrorListener();\n if (isPresent(errorListener)) {\n lexer.addErrorListener(errorListener);\n parser.addErrorListener(errorListener);\n }\n lexer.addErrorListener(myErrorListener);\n parser.addErrorListener(myErrorListener);\n let expr;\n expr = parser.expr();\n const validationListener = new IfcExpressionValidationListener(\n builtinVariableRegistry\n );\n if (!myErrorListener.isErrorOccurred()) {\n const walker = new ParseTreeWalker();\n try {\n walker.walk(validationListener, expr);\n } catch (e) {\n if (e instanceof ValidationException) {\n if (errorListener instanceof IfcExpressionErrorListener) {\n errorListener.validationException(e);\n }\n myErrorListener.validationException(e);\n }\n }\n }\n return new IfcExpressionParseResult(\n input,\n validationListener.getTypeManager(),\n expr,\n builtinVariableRegistry\n );\n }\n\n public static compile(\n parseResult: IfcExpressionParseResult\n ): ExprFacade<ExpressionValue> {\n const compiler = new ExprCompiler(\n parseResult.typeManager,\n parseResult.builtinVariableRegistry\n );\n const expr = compiler.visit(parseResult.parseTree);\n ExprToTextInputLinker.linkTextToExpressions(\n parseResult.input,\n expr,\n compiler.getExprManager()\n );\n return new ExprFacade(expr);\n }\n\n public static evaluate(\n expression: string,\n context: IfcExpressionContext = new NopContext(),\n options: IfcExpressionOptions = {}\n ): ExprEvalResult<ExpressionValue> {\n const errorListener = new IfcExpressionErrorListener();\n const parseResult = IfcExpression.parse(expression, errorListener, options);\n if (errorListener.isErrorOccurred()) {\n return mapException(errorListener.getException());\n }\n const compiledExpression = this.compile(parseResult);\n return compiledExpression.evaluate(context);\n }\n\n public static formatError(input: string, error: ExprEvalError) {\n const lines = [\"** Error **\"];\n if (!isNullish(error[\"textSpan\"])) {\n const span: TextSpan = error[\"textSpan\"];\n const underlined = span.underline(input, \"^\");\n const startString = \"Input: \";\n const indented = this.indent(underlined, startString.length);\n const replaced = startString + indented.substr(startString.length);\n replaced.split(\"\\n\").forEach((line) => lines.push(line));\n }\n lines.push(\"Problem: \" + error.message);\n return lines.join(\"\\n\");\n }\n\n private static indent(s: string, by: number) {\n return s\n .split(\"\\n\")\n .map((line) => \" \".repeat(by) + line)\n .join(\"\\n\");\n }\n\n public static evaluateExpression(\n expr: ExprFacade<ExpressionValue>,\n context: IfcExpressionContext = new NopContext()\n ) {\n return expr.evaluate(context);\n }\n\n public static unwrapValue(value: ExpressionValue): UnwrappedExpressionValue {\n return this.unwrapUnknownValue(value);\n }\n\n private static unwrapUnknownValue(value: unknown): UnwrappedExpressionValue {\n if (value instanceof StringValue || value instanceof BooleanValue) {\n return value.getValue();\n }\n if (value instanceof NumericValue) {\n return value.getValue();\n }\n if (value instanceof LogicalValue) {\n return value.isUnknown() ? undefined : value.getValue();\n }\n if (value instanceof ReferenceValue) {\n return value.getValue();\n }\n if (value instanceof IfcTimeStampValue) {\n return value.getTimeStampSeconds();\n }\n if (\n value instanceof IfcDateValue ||\n value instanceof IfcDateTimeValue ||\n value instanceof IfcTimeValue ||\n value instanceof IfcDurationValue\n ) {\n return value.toString();\n }\n if (value instanceof ArrayValue) {\n return value.getValue().map((entry) => this.unwrapUnknownValue(entry));\n }\n if (value instanceof ObjectAccessorValue) {\n return this.unwrapObjectAccessor(value.getValue());\n }\n if (value instanceof ContextObjectValue) {\n return this.unwrapPlainObject(value.getValue());\n }\n if (Decimal.isDecimal(value)) {\n return value;\n }\n if (typeof value === \"number\") {\n return NumericValue.of(value).getValue();\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n typeof value === \"undefined\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => this.unwrapUnknownValue(entry));\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (this.isPlainObject(value)) {\n return this.unwrapPlainObject(value);\n }\n return undefined;\n }\n\n private static unwrapObjectAccessor(objectAccessor: ObjectAccessor): {\n [key: string]: UnwrappedExpressionValue;\n } {\n const result: { [key: string]: UnwrappedExpressionValue } = {};\n for (const attributeName of objectAccessor.listAttributes()) {\n const attributeValue = objectAccessor.getAttribute(attributeName);\n if (typeof attributeValue !== \"undefined\") {\n result[attributeName] = this.unwrapUnknownValue(attributeValue);\n }\n }\n return result;\n }\n\n private static unwrapPlainObject(value: Record<string, unknown>): {\n [key: string]: UnwrappedExpressionValue;\n } {\n const result: { [key: string]: UnwrappedExpressionValue } = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n result[key] = this.unwrapUnknownValue(nestedValue);\n }\n return result;\n }\n\n private static isPlainObject(\n value: unknown\n ): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n }\n}\n"]}
|
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IfcExpressionErrorListener = void 0;
|
|
4
|
-
const
|
|
4
|
+
const antlr4ng_1 = require("antlr4ng");
|
|
5
5
|
const IfcExpressionUtils_js_1 = require("./util/IfcExpressionUtils.js");
|
|
6
6
|
const SyntaxErrorException_js_1 = require("./error/SyntaxErrorException.js");
|
|
7
|
-
class IfcExpressionErrorListener extends
|
|
7
|
+
class IfcExpressionErrorListener extends antlr4ng_1.BaseErrorListener {
|
|
8
8
|
validationException(validationException) {
|
|
9
9
|
this.exception = validationException;
|
|
10
10
|
}
|
|
11
11
|
syntaxError(recognizer, offendingSymbol, line, column, msg, e) {
|
|
12
|
-
|
|
13
|
-
this.exception = new SyntaxErrorException_js_1.SyntaxErrorException(offendingSymbol, line, column, msg);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
this.exception = new SyntaxErrorException_js_1.SyntaxErrorException((0, IfcExpressionUtils_js_1.isNullish)(offendingSymbol) ? "[no symbol]" : offendingSymbol.text, line, column, msg);
|
|
17
|
-
}
|
|
12
|
+
this.exception = new SyntaxErrorException_js_1.SyntaxErrorException((0, IfcExpressionUtils_js_1.isNullish)(offendingSymbol) ? "[no symbol]" : offendingSymbol.text, line, column, msg);
|
|
18
13
|
}
|
|
19
14
|
isErrorOccurred() {
|
|
20
15
|
return (0, IfcExpressionUtils_js_1.isPresent)(this.exception);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/IfcExpressionErrorListener.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/IfcExpressionErrorListener.ts"],"names":[],"mappings":";;;AAAA,uCAKkB;AAClB,wEAAoE;AACpE,6EAAuE;AAGvE,MAAa,0BAA2B,SAAQ,4BAAiB;IAG/D,mBAAmB,CAAC,mBAAwC;QAC1D,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACvC,CAAC;IAEQ,WAAW,CAIlB,UAAyB,EACzB,eAAyB,EACzB,IAAY,EACZ,MAAc,EACd,GAAW,EACX,CAA8B;QAE9B,IAAI,CAAC,SAAS,GAAG,IAAI,8CAAoB,CACvC,IAAA,iCAAS,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EACjE,IAAI,EACJ,MAAM,EACN,GAAG,CACJ,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAA,iCAAS,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAjCD,gEAiCC","file":"IfcExpressionErrorListener.js","sourcesContent":["import {\n BaseErrorListener,\n RecognitionException,\n Recognizer,\n Token,\n} from \"antlr4ng\";\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { SyntaxErrorException } from \"./error/SyntaxErrorException.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\n\nexport class IfcExpressionErrorListener extends BaseErrorListener {\n private exception: SyntaxErrorException | ValidationException;\n\n validationException(validationException: ValidationException) {\n this.exception = validationException;\n }\n\n override syntaxError<\n S extends Token,\n T extends import(\"antlr4ng\").ATNSimulator\n >(\n recognizer: Recognizer<T>,\n offendingSymbol: S | null,\n line: number,\n column: number,\n msg: string,\n e: RecognitionException | null\n ) {\n this.exception = new SyntaxErrorException(\n isNullish(offendingSymbol) ? \"[no symbol]\" : offendingSymbol.text,\n line,\n column,\n msg\n );\n }\n\n public isErrorOccurred(): boolean {\n return isPresent(this.exception);\n }\n\n public getException(): SyntaxErrorException | ValidationException {\n return this.exception;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/IfcExpressionOptions.ts"],"names":[],"mappings":"","file":"IfcExpressionOptions.js","sourcesContent":["import { BuiltinVariableRegistry } from \"./builtin/BuiltinVariableRegistry.js\";\n\nexport interface IfcExpressionOptions {\n builtinVariableRegistry?: BuiltinVariableRegistry;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/autocomplete/CompletionItem.ts"],"names":[],"mappings":"","file":"autocomplete/CompletionItem.js","sourcesContent":["export type CompletionItemKind =\n | \"builtinRoot\"\n | \"builtinFunction\"\n | \"builtinMemberProperty\"\n | \"builtinMemberFunction\";\n\nexport type CompletionItem = {\n kind: CompletionItemKind;\n label: string;\n insertText?: string;\n cursorOffset?: number;\n argumentTypeNames?: Array<string>;\n returnTypeName?: string;\n chainable?: boolean;\n documentation?: string;\n};\n\nexport type ActiveHelp = {\n label: string;\n documentation: string;\n activeParameterIndex?: number;\n activeParameterLabel?: string;\n activeParameterDocumentation?: string;\n};\n\nexport type CompletionResult = {\n items: Array<CompletionItem>;\n replaceFrom: number;\n replaceTo: number;\n activeHelp?: ActiveHelp;\n};\n"]}
|