ifc-expressions 2.3.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +255 -30
  2. package/dist/IfcExpression.d.ts +24 -26
  3. package/dist/IfcExpressionErrorListener.d.ts +3 -3
  4. package/dist/IfcExpressionOptions.d.ts +4 -0
  5. package/dist/autocomplete/CompletionItem.d.ts +24 -0
  6. package/dist/autocomplete/IfcExpressionAutocomplete.d.ts +11 -0
  7. package/dist/builtin/BuiltinRuntimeValueConverter.d.ts +7 -0
  8. package/dist/builtin/BuiltinVariableRegistry.d.ts +50 -0
  9. package/dist/cjs/IfcExpression.js +112 -37
  10. package/dist/cjs/IfcExpression.js.map +1 -1
  11. package/dist/cjs/IfcExpressionErrorListener.js +3 -8
  12. package/dist/cjs/IfcExpressionErrorListener.js.map +1 -1
  13. package/dist/cjs/IfcExpressionOptions.js +3 -0
  14. package/dist/cjs/IfcExpressionOptions.js.map +1 -0
  15. package/dist/cjs/autocomplete/CompletionItem.js +3 -0
  16. package/dist/cjs/autocomplete/CompletionItem.js.map +1 -0
  17. package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js +654 -0
  18. package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
  19. package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js +124 -0
  20. package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
  21. package/dist/cjs/builtin/BuiltinVariableRegistry.js +405 -0
  22. package/dist/cjs/builtin/BuiltinVariableRegistry.js.map +1 -0
  23. package/dist/cjs/compiler/ExprCompiler.js +44 -41
  24. package/dist/cjs/compiler/ExprCompiler.js.map +1 -1
  25. package/dist/cjs/compiler/ExprManager.js.map +1 -1
  26. package/dist/cjs/compiler/IfcExpressionValidationListener.js +85 -25
  27. package/dist/cjs/compiler/IfcExpressionValidationListener.js.map +1 -1
  28. package/dist/cjs/compiler/TypeManager.js.map +1 -1
  29. package/dist/cjs/context/IfcExpressionContext.js.map +1 -1
  30. package/dist/cjs/context/NopContext.js +3 -0
  31. package/dist/cjs/context/NopContext.js.map +1 -1
  32. package/dist/cjs/documentation/Documentation.js +11 -0
  33. package/dist/cjs/documentation/Documentation.js.map +1 -0
  34. package/dist/cjs/error/ExpressionTypeError.js.map +1 -1
  35. package/dist/cjs/error/IfcExpressionBuiltinConfigException.js +10 -0
  36. package/dist/cjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
  37. package/dist/cjs/error/InvalidSyntaxException.js.map +1 -1
  38. package/dist/cjs/error/NoSuchFunctionException.js.map +1 -1
  39. package/dist/cjs/error/NoSuchMemberException.js +13 -0
  40. package/dist/cjs/error/NoSuchMemberException.js.map +1 -0
  41. package/dist/cjs/error/ValidationException.js.map +1 -1
  42. package/dist/cjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
  43. package/dist/cjs/expression/ExprKind.js +3 -0
  44. package/dist/cjs/expression/ExprKind.js.map +1 -1
  45. package/dist/cjs/expression/function/Func.js +18 -14
  46. package/dist/cjs/expression/function/Func.js.map +1 -1
  47. package/dist/cjs/expression/function/FuncArg.js +11 -5
  48. package/dist/cjs/expression/function/FuncArg.js.map +1 -1
  49. package/dist/cjs/expression/function/IfcExpressionFunctions.js +198 -42
  50. package/dist/cjs/expression/function/IfcExpressionFunctions.js.map +1 -1
  51. package/dist/cjs/expression/function/impl/CHOOSE.js.map +1 -1
  52. package/dist/cjs/expression/function/impl/IF.js.map +1 -1
  53. package/dist/cjs/expression/function/impl/MAP.js.map +1 -1
  54. package/dist/cjs/expression/function/impl/ReplacePattern.js +20 -2
  55. package/dist/cjs/expression/function/impl/ReplacePattern.js.map +1 -1
  56. package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js +59 -0
  57. package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
  58. package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js +34 -0
  59. package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
  60. package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js +29 -0
  61. package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
  62. package/dist/cjs/gen/parser/IfcExpressionLexer.js +126 -104
  63. package/dist/cjs/gen/parser/IfcExpressionLexer.js.map +1 -1
  64. package/dist/cjs/gen/parser/IfcExpressionListener.js +7 -4
  65. package/dist/cjs/gen/parser/IfcExpressionListener.js.map +1 -1
  66. package/dist/cjs/gen/parser/IfcExpressionParser.js +739 -682
  67. package/dist/cjs/gen/parser/IfcExpressionParser.js.map +1 -1
  68. package/dist/cjs/gen/parser/IfcExpressionVisitor.js +4 -4
  69. package/dist/cjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
  70. package/dist/cjs/index.js +4 -1
  71. package/dist/cjs/index.js.map +1 -1
  72. package/dist/cjs/type/ContextObjectType.js +45 -0
  73. package/dist/cjs/type/ContextObjectType.js.map +1 -0
  74. package/dist/cjs/type/Types.js +4 -6
  75. package/dist/cjs/type/Types.js.map +1 -1
  76. package/dist/cjs/value/ContextObjectValue.js +23 -0
  77. package/dist/cjs/value/ContextObjectValue.js.map +1 -0
  78. package/dist/cjs/value/ExpressionValue.js.map +1 -1
  79. package/dist/cjs/value/Value.js.map +1 -1
  80. package/dist/compiler/ExprCompiler.d.ts +8 -3
  81. package/dist/compiler/ExprManager.d.ts +1 -1
  82. package/dist/compiler/IfcExpressionValidationListener.d.ts +9 -3
  83. package/dist/compiler/TypeManager.d.ts +1 -1
  84. package/dist/context/IfcExpressionContext.d.ts +3 -4
  85. package/dist/context/NopContext.d.ts +1 -0
  86. package/dist/documentation/Documentation.d.ts +12 -0
  87. package/dist/error/ExpressionTypeError.d.ts +1 -1
  88. package/dist/error/IfcExpressionBuiltinConfigException.d.ts +3 -0
  89. package/dist/error/InvalidSyntaxException.d.ts +1 -1
  90. package/dist/error/NoSuchFunctionException.d.ts +1 -1
  91. package/dist/error/NoSuchMemberException.d.ts +6 -0
  92. package/dist/error/ValidationException.d.ts +1 -1
  93. package/dist/error/WrongFunctionArgumentTypeException.d.ts +1 -1
  94. package/dist/expression/ExprKind.d.ts +3 -0
  95. package/dist/expression/function/Func.d.ts +7 -21
  96. package/dist/expression/function/FuncArg.d.ts +6 -5
  97. package/dist/expression/function/IfcExpressionFunctions.d.ts +1 -0
  98. package/dist/expression/function/impl/CHOOSE.d.ts +1 -1
  99. package/dist/expression/function/impl/IF.d.ts +1 -1
  100. package/dist/expression/function/impl/MAP.d.ts +1 -1
  101. package/dist/expression/reference/BuiltinFunctionCallExpr.d.ts +19 -0
  102. package/dist/expression/reference/BuiltinPropertyAccessExpr.d.ts +15 -0
  103. package/dist/expression/reference/BuiltinRootReferenceExpr.d.ts +14 -0
  104. package/dist/gen/parser/IfcExpressionLexer.d.ts +9 -8
  105. package/dist/gen/parser/IfcExpressionListener.d.ts +89 -59
  106. package/dist/gen/parser/IfcExpressionParser.d.ts +192 -169
  107. package/dist/gen/parser/IfcExpressionVisitor.d.ts +51 -35
  108. package/dist/index.d.ts +2 -2
  109. package/dist/mjs/IfcExpression.js +104 -32
  110. package/dist/mjs/IfcExpression.js.map +1 -1
  111. package/dist/mjs/IfcExpressionErrorListener.js +3 -8
  112. package/dist/mjs/IfcExpressionErrorListener.js.map +1 -1
  113. package/dist/mjs/IfcExpressionOptions.js +2 -0
  114. package/dist/mjs/IfcExpressionOptions.js.map +1 -0
  115. package/dist/mjs/autocomplete/CompletionItem.js +2 -0
  116. package/dist/mjs/autocomplete/CompletionItem.js.map +1 -0
  117. package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js +650 -0
  118. package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
  119. package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js +117 -0
  120. package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
  121. package/dist/mjs/builtin/BuiltinVariableRegistry.js +399 -0
  122. package/dist/mjs/builtin/BuiltinVariableRegistry.js.map +1 -0
  123. package/dist/mjs/compiler/ExprCompiler.js +43 -40
  124. package/dist/mjs/compiler/ExprCompiler.js.map +1 -1
  125. package/dist/mjs/compiler/ExprManager.js.map +1 -1
  126. package/dist/mjs/compiler/IfcExpressionValidationListener.js +85 -22
  127. package/dist/mjs/compiler/IfcExpressionValidationListener.js.map +1 -1
  128. package/dist/mjs/compiler/TypeManager.js.map +1 -1
  129. package/dist/mjs/context/IfcExpressionContext.js.map +1 -1
  130. package/dist/mjs/context/NopContext.js +3 -0
  131. package/dist/mjs/context/NopContext.js.map +1 -1
  132. package/dist/mjs/documentation/Documentation.js +7 -0
  133. package/dist/mjs/documentation/Documentation.js.map +1 -0
  134. package/dist/mjs/error/ExpressionTypeError.js.map +1 -1
  135. package/dist/mjs/error/IfcExpressionBuiltinConfigException.js +6 -0
  136. package/dist/mjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
  137. package/dist/mjs/error/InvalidSyntaxException.js.map +1 -1
  138. package/dist/mjs/error/NoSuchFunctionException.js.map +1 -1
  139. package/dist/mjs/error/NoSuchMemberException.js +9 -0
  140. package/dist/mjs/error/NoSuchMemberException.js.map +1 -0
  141. package/dist/mjs/error/ValidationException.js.map +1 -1
  142. package/dist/mjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
  143. package/dist/mjs/expression/ExprKind.js +3 -0
  144. package/dist/mjs/expression/ExprKind.js.map +1 -1
  145. package/dist/mjs/expression/function/Func.js +18 -14
  146. package/dist/mjs/expression/function/Func.js.map +1 -1
  147. package/dist/mjs/expression/function/FuncArg.js +11 -5
  148. package/dist/mjs/expression/function/FuncArg.js.map +1 -1
  149. package/dist/mjs/expression/function/IfcExpressionFunctions.js +198 -42
  150. package/dist/mjs/expression/function/IfcExpressionFunctions.js.map +1 -1
  151. package/dist/mjs/expression/function/impl/CHOOSE.js.map +1 -1
  152. package/dist/mjs/expression/function/impl/IF.js.map +1 -1
  153. package/dist/mjs/expression/function/impl/MAP.js.map +1 -1
  154. package/dist/mjs/expression/function/impl/ReplacePattern.js +20 -2
  155. package/dist/mjs/expression/function/impl/ReplacePattern.js.map +1 -1
  156. package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js +55 -0
  157. package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
  158. package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js +30 -0
  159. package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
  160. package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js +25 -0
  161. package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
  162. package/dist/mjs/gen/parser/IfcExpressionLexer.js +101 -104
  163. package/dist/mjs/gen/parser/IfcExpressionLexer.js.map +1 -1
  164. package/dist/mjs/gen/parser/IfcExpressionListener.js +5 -3
  165. package/dist/mjs/gen/parser/IfcExpressionListener.js.map +1 -1
  166. package/dist/mjs/gen/parser/IfcExpressionParser.js +700 -670
  167. package/dist/mjs/gen/parser/IfcExpressionParser.js.map +1 -1
  168. package/dist/mjs/gen/parser/IfcExpressionVisitor.js +2 -3
  169. package/dist/mjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
  170. package/dist/mjs/index.js +1 -1
  171. package/dist/mjs/index.js.map +1 -1
  172. package/dist/mjs/type/ContextObjectType.js +41 -0
  173. package/dist/mjs/type/ContextObjectType.js.map +1 -0
  174. package/dist/mjs/type/Types.js +4 -6
  175. package/dist/mjs/type/Types.js.map +1 -1
  176. package/dist/mjs/value/ContextObjectValue.js +19 -0
  177. package/dist/mjs/value/ContextObjectValue.js.map +1 -0
  178. package/dist/mjs/value/ExpressionValue.js.map +1 -1
  179. package/dist/mjs/value/Value.js.map +1 -1
  180. package/dist/type/ContextObjectType.d.ts +17 -0
  181. package/dist/type/Types.d.ts +2 -6
  182. package/dist/value/ContextObjectValue.d.ts +11 -0
  183. package/dist/value/ExpressionValue.d.ts +2 -1
  184. package/dist/value/Value.d.ts +1 -1
  185. 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 antlr4_1 = require("antlr4");
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 = __importDefault(require("./gen/parser/IfcExpressionParser.js"));
39
- const IfcExpressionVisitor_js_1 = __importDefault(require("./gen/parser/IfcExpressionVisitor.js"));
40
- exports.IfcExpressionVisitor = IfcExpressionVisitor_js_1.default;
41
- const IfcExpressionLexer_js_1 = __importDefault(require("./gen/parser/IfcExpressionLexer.js"));
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
- * Parses the input and returns a parse result, which contains the parse tree, the type information per parse tree node, and the input.
96
- * @param input
97
- * @param errorListener
98
- * @return the parse result, which can subequently be compiled into an Expr using compile().
99
- */
100
- static parse(input, errorListener) {
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 antlr4_1.ParseTreeWalker();
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":";;;;;;AAAA,uCAOkB;AAClB,4DAAiC;AACjC,gEAA0D;AAuFxD,6FAvFO,8BAAY,OAuFP;AAtFd,mFAA6E;AAyF3E,2GAzFO,0DAA0B,OAyFP;AAxF5B,sGAAgG;AAEhG,wEAAoE;AAyFlE,0FAzFO,iCAAS,OAyFP;AADT,0FAxFkB,iCAAS,OAwFlB;AApFX,2EAAqE;AA0DnE,mGA1DO,0CAAkB,OA0DP;AAxDpB,2DAAqD;AA2DnD,4FA3DO,4BAAW,OA2DP;AA1Db,6DAAuD;AA6DrD,6FA7DO,8BAAY,OA6DP;AA5Dd,6DAAuD;AA0DrD,6FA1DO,8BAAY,OA0DP;AAzDd,6DAAuD;AA0DrD,6FA1DO,8BAAY,OA0DP;AAzDd,iEAA2D;AA4DzD,+FA5DO,kCAAc,OA4DP;AA3DhB,mFAA6E;AAiE3E,uGAjEO,kDAAsB,OAiEP;AAhExB,6EAAuE;AAiErE,oGAjEO,4CAAmB,OAiEP;AAhErB,iFAA2E;AAiEzE,sGAjEO,gDAAqB,OAiEP;AAhEvB,iFAA2E;AAiEzE,sGAjEO,gDAAqB,OAiEP;AAhEvB,6EAAuE;AAiErE,oGAjEO,4CAAmB,OAiEP;AAhErB,gFAA0E;AAC1E,kFAA4E;AAsE1E,qGAtEO,8CAAoB,OAsEP;AArEtB,8EAAwE;AAExE,0GAAoG;AAiElG,iHAjEO,sEAAgC,OAiEP;AA9DlC,yDAAmD;AACnD,yEAAmE;AACnE,sEAKwC;AA8DtC,gGAhEA,mCAAe,OAgEA;AACf,kGAhEA,qCAAiB,OAgEA;AA9DnB,0DAAoD;AAqDlD,yFArDO,sBAAQ,OAqDP;AApDV,2EAAqE;AAErE,iGAAyE;AACzE,2DAAqD;AACrD,kFAA4E;AA0D1E,sGA1DO,gDAAqB,OA0DP;AAxDvB,8DAAwD;AAyDtD,2FAzDO,0BAAU,OAyDP;AAxDZ,qEAA+D;AAmC7D,iGAnCO,sCAAgB,OAmCP;AAlClB,6DAAuD;AA+BrD,6FA/BO,8BAAY,OA+BP;AA9Bd,qEAA+D;AA+B7D,iGA/BO,sCAAgB,OA+BP;AA9BlB,6DAAuD;AA+BrD,6FA/BO,8BAAY,OA+BP;AA9Bd,uEAAiE;AAgC/D,kGAhCO,wCAAiB,OAgCP;AA/BnB,sDAAgD;AAoD9C,0FApDO,wBAAS,OAoDP;AAlDX,wDAAkD;AAoDhD,2FApDO,0BAAU,OAoDP;AAnDZ,sDAAgD;AAoD9C,0FApDO,wBAAS,OAoDP;AAnDX,kEAA4D;AAoD1D,gGApDO,oCAAe,OAoDP;AAnDjB,8CAAwC;AAoDtC,sFApDO,gBAAK,OAoDP;AAnDP,sEAAgE;AAoD9D,kGApDO,wCAAiB,OAoDP;AAnDnB,qFAA+E;AAoD7E,wGApDO,oDAAuB,OAoDP;AAlDzB,8FAAwF;AAmDtF,0GAnDO,wDAAyB,OAmDP;AA7C3B,2EAAqE;AAgErE,MAAa,wBAAwB;IAMnC,YACE,KAAa,EACb,WAAwB,EACxB,WAAW,EACX,uBAAgD;QAEhD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,uBAAuB;QACzB,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;CACF;AAjCD,4DAiCC;AAED,MAAa,aAAa;IACjB,MAAM,CAAC,KAAK,CACjB,KAAa,EACb,aAAkC,EAClC,UAAgC,EAAE;QAElC,MAAM,uBAAuB,GAC3B,OAAO,CAAC,uBAAuB;YAC/B,oDAAuB,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,qBAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,0CAAkB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,4BAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,4CAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACzD,IAAI,IAAA,iCAAS,EAAC,aAAa,CAAC,EAAE;YAC5B,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;SACxC;QACD,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC;QACT,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,kBAAkB,GAAG,IAAI,oEAA+B,CAC5D,uBAAuB,CACxB,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,0BAAe,EAAE,CAAC;YACrC,IAAI;gBACF,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACvC;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,YAAY,4CAAmB,EAAE;oBACpC,IAAI,aAAa,YAAY,0DAA0B,EAAE;wBACvD,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;qBACtC;oBACD,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;iBACxC;aACF;SACF;QACD,OAAO,IAAI,wBAAwB,CACjC,KAAK,EACL,kBAAkB,CAAC,cAAc,EAAE,EACnC,IAAI,EACJ,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,OAAO,CACnB,WAAqC;QAErC,MAAM,QAAQ,GAAG,IAAI,8BAAY,CAC/B,WAAW,CAAC,WAAW,EACvB,WAAW,CAAC,uBAAuB,CACpC,CAAC;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACnD,gDAAqB,CAAC,qBAAqB,CACzC,WAAW,CAAC,KAAK,EACjB,IAAI,EACJ,QAAQ,CAAC,cAAc,EAAE,CAC1B,CAAC;QACF,OAAO,IAAI,0BAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,QAAQ,CACpB,UAAkB,EAClB,UAAgC,IAAI,0BAAU,EAAE,EAChD,UAAgC,EAAE;QAElC,MAAM,aAAa,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACvD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,aAAa,CAAC,eAAe,EAAE,EAAE;YACnC,OAAO,IAAA,gDAAY,EAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;SACnD;QACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,KAAoB;QAC3D,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAA,iCAAS,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE;YACjC,MAAM,IAAI,GAAa,KAAK,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,SAAS,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACnE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1D;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,MAAM,CAAC,MAAM,CAAC,CAAS,EAAE,EAAU;QACzC,OAAO,CAAC;aACL,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;aACpC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAC9B,IAAiC,EACjC,UAAgC,IAAI,0BAAU,EAAE;QAEhD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,KAAsB;QAC9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,KAAc;QAC9C,IAAI,KAAK,YAAY,4BAAW,IAAI,KAAK,YAAY,8BAAY,EAAE;YACjE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzB;QACD,IAAI,KAAK,YAAY,8BAAY,EAAE;YACjC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzB;QACD,IAAI,KAAK,YAAY,8BAAY,EAAE;YACjC,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzD;QACD,IAAI,KAAK,YAAY,kCAAc,EAAE;YACnC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzB;QACD,IAAI,KAAK,YAAY,wCAAiB,EAAE;YACtC,OAAO,KAAK,CAAC,mBAAmB,EAAE,CAAC;SACpC;QACD,IACE,KAAK,YAAY,8BAAY;YAC7B,KAAK,YAAY,sCAAgB;YACjC,KAAK,YAAY,8BAAY;YAC7B,KAAK,YAAY,sCAAgB,EACjC;YACA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;SACzB;QACD,IAAI,KAAK,YAAY,0BAAU,EAAE;YAC/B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;SACxE;QACD,IAAI,KAAK,YAAY,4CAAmB,EAAE;YACxC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SACpD;QACD,IAAI,KAAK,YAAY,0CAAkB,EAAE;YACvC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;SACjD;QACD,IAAI,oBAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC5B,OAAO,KAAK,CAAC;SACd;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,8BAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC1C;QACD,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,SAAS;YAC1B,OAAO,KAAK,KAAK,WAAW,EAC5B;YACA,OAAO,KAAK,CAAC;SACd;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7D;QACD,IAAI,KAAK,YAAY,IAAI,EAAE;YACzB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;SAC5B;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SACtC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,cAA8B;QAGhE,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,KAAK,MAAM,aAAa,IAAI,cAAc,CAAC,cAAc,EAAE,EAAE;YAC3D,MAAM,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAClE,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;gBACzC,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;aACjE;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,KAA8B;QAG7D,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;SACpD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,aAAa,CAC1B,KAAc;QAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAClD,CAAC;IACJ,CAAC;CACF;AAxMD,sCAwMC","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 antlr4_1 = require("antlr4");
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 antlr4_1.ErrorListener {
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
- if (typeof offendingSymbol === "number") {
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,mCAAgF;AAChF,wEAAoE;AACpE,6EAAuE;AAGvE,MAAa,0BAA2B,SAAQ,sBAA6B;IAG3E,mBAAmB,CAAC,mBAAwC;QAC1D,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACvC,CAAC;IAED,WAAW,CACT,UAAsC,EACtC,eAA+B,EAC/B,IAAY,EACZ,MAAc,EACd,GAAW,EACX,CAAmC;QAEnC,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YACvC,IAAI,CAAC,SAAS,GAAG,IAAI,8CAAoB,CACvC,eAAe,EACf,IAAI,EACJ,MAAM,EACN,GAAG,CACJ,CAAC;SACH;aAAM;YACL,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;SACH;IACH,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;AAvCD,gEAuCC","file":"IfcExpressionErrorListener.js","sourcesContent":["import { ErrorListener, RecognitionException, Recognizer, Token } from \"antlr4\";\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { SyntaxErrorException } from \"./error/SyntaxErrorException.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\n\nexport class IfcExpressionErrorListener extends ErrorListener<Token | number> {\n private exception: SyntaxErrorException | ValidationException;\n\n validationException(validationException: ValidationException) {\n this.exception = validationException;\n }\n\n syntaxError(\n recognizer: Recognizer<Token | number>,\n offendingSymbol: Token | number,\n line: number,\n column: number,\n msg: string,\n e: RecognitionException | undefined\n ) {\n if (typeof offendingSymbol === \"number\") {\n this.exception = new SyntaxErrorException(\n offendingSymbol,\n line,\n column,\n msg\n );\n } else {\n this.exception = new SyntaxErrorException(\n isNullish(offendingSymbol) ? \"[no symbol]\" : offendingSymbol.text,\n line,\n column,\n msg\n );\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"]}
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IfcExpressionOptions.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=CompletionItem.js.map
@@ -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"]}