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.
Files changed (185) hide show
  1. package/README.md +242 -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 +10 -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 +532 -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 +528 -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
@@ -0,0 +1,532 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IfcExpressionAutocomplete = void 0;
4
+ const antlr4ng_1 = require("antlr4ng");
5
+ const antlr4_c3_1 = require("antlr4-c3");
6
+ const BuiltinVariableRegistry_js_1 = require("../builtin/BuiltinVariableRegistry.js");
7
+ const IfcExpressionLexer_js_1 = require("../gen/parser/IfcExpressionLexer.js");
8
+ const IfcExpressionParser_js_1 = require("../gen/parser/IfcExpressionParser.js");
9
+ const IfcExpressionFunctions_js_1 = require("../expression/function/IfcExpressionFunctions.js");
10
+ const ContextObjectType_js_1 = require("../type/ContextObjectType.js");
11
+ const Documentation_js_1 = require("../documentation/Documentation.js");
12
+ function isIdentifierChar(char) {
13
+ return typeof char === "string" && /[a-zA-Z0-9_\-$&]/.test(char);
14
+ }
15
+ function toBuiltinLabel(name) {
16
+ return name.startsWith("$") ? name : `$${name}`;
17
+ }
18
+ function normalizeForMatch(value) {
19
+ return value.toUpperCase();
20
+ }
21
+ function toCompletionTypeName(type) {
22
+ return type.getName().replace(/^\$/, "");
23
+ }
24
+ function isChainableType(type) {
25
+ return type instanceof ContextObjectType_js_1.ContextObjectType;
26
+ }
27
+ function isExtendableTokenType(tokenType) {
28
+ return tokenType === IfcExpressionParser_js_1.IfcExpressionParser.IDENTIFIER;
29
+ }
30
+ function findCaretTokenIndex(tokens, cursorOffset) {
31
+ if (tokens.length === 0) {
32
+ return 0;
33
+ }
34
+ const cursor = Math.max(0, cursorOffset);
35
+ for (let i = 0; i < tokens.length; i++) {
36
+ const token = tokens[i];
37
+ if (token.type === antlr4ng_1.Token.EOF) {
38
+ return token.tokenIndex;
39
+ }
40
+ if (cursor < token.start) {
41
+ return token.tokenIndex;
42
+ }
43
+ if (cursor <= token.stop) {
44
+ return token.tokenIndex;
45
+ }
46
+ if (cursor === token.stop + 1) {
47
+ if (isExtendableTokenType(token.type)) {
48
+ return token.tokenIndex;
49
+ }
50
+ const nextToken = tokens[i + 1];
51
+ return nextToken?.tokenIndex ?? token.tokenIndex;
52
+ }
53
+ }
54
+ return tokens[tokens.length - 1].tokenIndex;
55
+ }
56
+ function parseAutocompleteInput(input, cursorOffset) {
57
+ const chars = antlr4ng_1.CharStream.fromString(input);
58
+ const lexer = new IfcExpressionLexer_js_1.IfcExpressionLexer(chars);
59
+ const tokenStream = new antlr4ng_1.CommonTokenStream(lexer);
60
+ const parser = new IfcExpressionParser_js_1.IfcExpressionParser(tokenStream);
61
+ lexer.removeErrorListeners();
62
+ parser.removeErrorListeners();
63
+ const parseTree = parser.expr();
64
+ tokenStream.fill();
65
+ const tokens = tokenStream.getTokens();
66
+ return {
67
+ parser,
68
+ parseTree,
69
+ tokens,
70
+ caretTokenIndex: findCaretTokenIndex(tokens, cursorOffset),
71
+ };
72
+ }
73
+ function findBuiltinRootReplaceRange(input, cursorOffset) {
74
+ const cursor = Math.max(0, Math.min(cursorOffset, input.length));
75
+ let i = cursor - 1;
76
+ while (i >= 0 && isIdentifierChar(input[i]) && input[i] !== "$") {
77
+ i--;
78
+ }
79
+ if (i >= 0 && input[i] === "$") {
80
+ return { from: i, to: cursor };
81
+ }
82
+ return undefined;
83
+ }
84
+ function findIdentifierReplaceRange(input, cursorOffset) {
85
+ const cursor = Math.max(0, Math.min(cursorOffset, input.length));
86
+ let from = cursor;
87
+ while (from > 0 && isIdentifierChar(input[from - 1])) {
88
+ from--;
89
+ }
90
+ return {
91
+ from,
92
+ to: cursor,
93
+ };
94
+ }
95
+ function findMemberReplaceRange(input, cursorOffset) {
96
+ const range = findIdentifierReplaceRange(input, cursorOffset);
97
+ if (range.from === 0 || input[range.from - 1] !== ".") {
98
+ return undefined;
99
+ }
100
+ return range;
101
+ }
102
+ function findFunctionReplaceRange(input, cursorOffset) {
103
+ const range = findIdentifierReplaceRange(input, cursorOffset);
104
+ const prefixChar = range.from > 0 ? input[range.from - 1] : undefined;
105
+ const hasIdentifierFragment = range.from < range.to || isIdentifierChar(input[Math.max(0, range.to)]);
106
+ if (!hasIdentifierFragment || prefixChar === "." || prefixChar === "$") {
107
+ return undefined;
108
+ }
109
+ return range;
110
+ }
111
+ function countExprListArguments(exprList) {
112
+ if (!exprList) {
113
+ return 0;
114
+ }
115
+ const rest = exprList.exprList();
116
+ return 1 + (rest ? countExprListArguments(rest) : 0);
117
+ }
118
+ function toMethodAccessorStep(methodAccessor) {
119
+ if (methodAccessor instanceof IfcExpressionParser_js_1.MethodPropertyAccessContext) {
120
+ const identifier = methodAccessor.IDENTIFIER()?.getText();
121
+ if (!identifier) {
122
+ return undefined;
123
+ }
124
+ return {
125
+ name: identifier,
126
+ kind: "property",
127
+ startTokenIndex: methodAccessor.start?.tokenIndex ?? -1,
128
+ };
129
+ }
130
+ if (methodAccessor instanceof IfcExpressionParser_js_1.MethodFunctionCallContext) {
131
+ const functionCall = methodAccessor.functionCall();
132
+ const name = functionCall.IDENTIFIER()?.getText();
133
+ if (!name) {
134
+ return undefined;
135
+ }
136
+ return {
137
+ name,
138
+ kind: "function",
139
+ argumentCount: countExprListArguments(functionCall.exprList()),
140
+ startTokenIndex: functionCall.start?.tokenIndex ?? -1,
141
+ };
142
+ }
143
+ return undefined;
144
+ }
145
+ function collectMethodCallChainSteps(methodCallChain) {
146
+ if (methodCallChain instanceof IfcExpressionParser_js_1.MethodCallChainInnerContext) {
147
+ const current = toMethodAccessorStep(methodCallChain.methodAccessor());
148
+ const rest = collectMethodCallChainSteps(methodCallChain.methodCallChain());
149
+ if (!current || !rest) {
150
+ return undefined;
151
+ }
152
+ return [current, ...rest];
153
+ }
154
+ if (methodCallChain instanceof IfcExpressionParser_js_1.MethodCallChainEndContext) {
155
+ const current = toMethodAccessorStep(methodCallChain.methodAccessor());
156
+ return current ? [current] : undefined;
157
+ }
158
+ const dot = methodCallChain.getToken(IfcExpressionParser_js_1.IfcExpressionParser.DOT, 0);
159
+ if (dot) {
160
+ return [
161
+ {
162
+ kind: "incomplete",
163
+ startTokenIndex: dot.symbol.tokenIndex + 1,
164
+ },
165
+ ];
166
+ }
167
+ return [];
168
+ }
169
+ function getMemberResultType(definition) {
170
+ return definition.kind === "property"
171
+ ? definition.valueType
172
+ : definition.returnType;
173
+ }
174
+ function resolveCompletedAccessorStep(currentType, step) {
175
+ if (!(currentType instanceof ContextObjectType_js_1.ContextObjectType)) {
176
+ return undefined;
177
+ }
178
+ const memberDefinition = currentType.getMemberDefinition(step.name);
179
+ if (!memberDefinition) {
180
+ return undefined;
181
+ }
182
+ if (step.kind === "property") {
183
+ return memberDefinition.kind === "property"
184
+ ? memberDefinition.valueType
185
+ : undefined;
186
+ }
187
+ if (memberDefinition.kind !== "function") {
188
+ return undefined;
189
+ }
190
+ if (memberDefinition.argumentTypes.length !== step.argumentCount) {
191
+ return undefined;
192
+ }
193
+ return memberDefinition.returnType;
194
+ }
195
+ function resolveSingleExprType(singleExpr, builtinVariableRegistry) {
196
+ if (singleExpr instanceof IfcExpressionParser_js_1.SEVariableRefContext) {
197
+ const identifier = singleExpr.variableRef()?.IDENTIFIER()?.getText();
198
+ return identifier
199
+ ? builtinVariableRegistry.getDefinition(`$${identifier}`)?.type
200
+ : undefined;
201
+ }
202
+ if (singleExpr instanceof IfcExpressionParser_js_1.SEParenthesisContext) {
203
+ return resolveSingleExprType(singleExpr.singleExpr(), builtinVariableRegistry);
204
+ }
205
+ if (singleExpr instanceof IfcExpressionParser_js_1.SEMethodCallContext) {
206
+ const baseType = resolveSingleExprType(singleExpr.singleExpr(), builtinVariableRegistry);
207
+ const steps = collectMethodCallChainSteps(singleExpr.methodCallChain());
208
+ if (!baseType || !steps) {
209
+ return undefined;
210
+ }
211
+ let currentType = baseType;
212
+ for (const step of steps) {
213
+ if (step.kind === "incomplete") {
214
+ return undefined;
215
+ }
216
+ currentType = resolveCompletedAccessorStep(currentType, step);
217
+ if (!currentType) {
218
+ return undefined;
219
+ }
220
+ }
221
+ return currentType;
222
+ }
223
+ return undefined;
224
+ }
225
+ function findReceiverTypeForMemberSlot(node, startTokenIndex, builtinVariableRegistry) {
226
+ if (node instanceof IfcExpressionParser_js_1.SEMethodCallContext) {
227
+ const steps = collectMethodCallChainSteps(node.methodCallChain());
228
+ if (steps) {
229
+ const slotIndex = steps.findIndex((step) => step.startTokenIndex === startTokenIndex);
230
+ if (slotIndex >= 0) {
231
+ let currentType = resolveSingleExprType(node.singleExpr(), builtinVariableRegistry);
232
+ for (const step of steps.slice(0, slotIndex)) {
233
+ if (!currentType || step.kind === "incomplete") {
234
+ return undefined;
235
+ }
236
+ currentType = resolveCompletedAccessorStep(currentType, step);
237
+ }
238
+ return currentType;
239
+ }
240
+ }
241
+ }
242
+ for (let i = 0; i < node.getChildCount(); i++) {
243
+ const child = node.getChild(i);
244
+ if (child instanceof antlr4ng_1.ParserRuleContext) {
245
+ const receiverType = findReceiverTypeForMemberSlot(child, startTokenIndex, builtinVariableRegistry);
246
+ if (receiverType) {
247
+ return receiverType;
248
+ }
249
+ }
250
+ }
251
+ return undefined;
252
+ }
253
+ function toFunctionInsertText(name) {
254
+ return `${name}()`;
255
+ }
256
+ function buildSignatureLabel(name, argumentLabels) {
257
+ return `${name}(${argumentLabels.join(", ")})`;
258
+ }
259
+ function buildFunctionDocumentation(name, localizer) {
260
+ const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(name);
261
+ const documentation = func?.getDocumentation();
262
+ if (!func || !documentation) {
263
+ return undefined;
264
+ }
265
+ const fallback = `${func.getSignatureLabel(name)}: ${documentation.fallback}`;
266
+ return localizer ? localizer.t(documentation.key, fallback) : fallback;
267
+ }
268
+ function buildMemberDocumentation(definition, localizer) {
269
+ if (!definition.documentation) {
270
+ return undefined;
271
+ }
272
+ const fallback = definition.kind === "property"
273
+ ? `${definition.name}: ${definition.documentation.fallback}`
274
+ : `${buildSignatureLabel(definition.name, (definition.argumentDocumentation ?? []).map((argument, index) => argument.label.fallback ?? `arg${index}`))}: ${definition.documentation.fallback}`;
275
+ return localizer
276
+ ? localizer.t(definition.documentation.key, fallback)
277
+ : fallback;
278
+ }
279
+ function buildRootDocumentation(name, documentation, localizer) {
280
+ if (!documentation) {
281
+ return undefined;
282
+ }
283
+ const fallback = documentation.fallback;
284
+ return localizer ? localizer.t(documentation.key, fallback) : fallback;
285
+ }
286
+ function findActiveCallFrame(tokens, cursorOffset) {
287
+ const stack = [];
288
+ let previousSignificantToken;
289
+ for (const token of tokens) {
290
+ if (token.type === antlr4ng_1.Token.EOF || token.start >= cursorOffset) {
291
+ break;
292
+ }
293
+ if (token.type === IfcExpressionParser_js_1.IfcExpressionParser.WS ||
294
+ token.type === IfcExpressionParser_js_1.IfcExpressionParser.NEWLINE) {
295
+ continue;
296
+ }
297
+ if (token.type === IfcExpressionParser_js_1.IfcExpressionParser.T__1) {
298
+ stack.push(previousSignificantToken?.type === IfcExpressionParser_js_1.IfcExpressionParser.IDENTIFIER
299
+ ? {
300
+ kind: "function",
301
+ name: previousSignificantToken.text ?? undefined,
302
+ argumentIndex: 0,
303
+ startTokenIndex: previousSignificantToken.tokenIndex,
304
+ }
305
+ : { kind: "group", argumentIndex: 0 });
306
+ }
307
+ else if (token.type === IfcExpressionParser_js_1.IfcExpressionParser.T__10) {
308
+ stack.push({ kind: "array", argumentIndex: 0 });
309
+ }
310
+ else if (token.type === IfcExpressionParser_js_1.IfcExpressionParser.T__2 ||
311
+ token.type === IfcExpressionParser_js_1.IfcExpressionParser.T__11) {
312
+ stack.pop();
313
+ }
314
+ else if (token.type === IfcExpressionParser_js_1.IfcExpressionParser.T__9) {
315
+ const currentFrame = stack[stack.length - 1];
316
+ if (currentFrame?.kind === "function") {
317
+ currentFrame.argumentIndex += 1;
318
+ }
319
+ }
320
+ previousSignificantToken = token;
321
+ }
322
+ for (let i = stack.length - 1; i >= 0; i--) {
323
+ if (stack[i].kind === "function") {
324
+ return stack[i];
325
+ }
326
+ }
327
+ return undefined;
328
+ }
329
+ function buildMemberSignatureLabel(definition) {
330
+ return buildSignatureLabel(definition.name, (definition.argumentDocumentation ?? []).map((argument, index) => argument.label.fallback ?? `arg${index}`));
331
+ }
332
+ function buildActiveMemberHelp(parseTree, builtinVariableRegistry, activeFrame, localizer) {
333
+ if (activeFrame.startTokenIndex === undefined || !activeFrame.name) {
334
+ return undefined;
335
+ }
336
+ const receiverType = findReceiverTypeForMemberSlot(parseTree, activeFrame.startTokenIndex, builtinVariableRegistry);
337
+ if (!(receiverType instanceof ContextObjectType_js_1.ContextObjectType)) {
338
+ return undefined;
339
+ }
340
+ const memberDefinition = receiverType.getMemberDefinition(activeFrame.name);
341
+ if (memberDefinition?.kind !== "function" ||
342
+ !memberDefinition.documentation) {
343
+ return undefined;
344
+ }
345
+ const label = buildMemberSignatureLabel(memberDefinition);
346
+ const fallback = memberDefinition.documentation.fallback.startsWith(`${label}: `)
347
+ ? memberDefinition.documentation.fallback
348
+ : `${label}: ${memberDefinition.documentation.fallback}`;
349
+ const activeArgument = memberDefinition.argumentDocumentation?.[activeFrame.argumentIndex];
350
+ return {
351
+ label,
352
+ documentation: localizer
353
+ ? localizer.t(memberDefinition.documentation.key, fallback)
354
+ : fallback,
355
+ activeParameterIndex: activeFrame.argumentIndex,
356
+ activeParameterLabel: activeArgument
357
+ ? (0, Documentation_js_1.resolveLocalizedText)(activeArgument.label, localizer) ??
358
+ activeArgument.label.fallback
359
+ : undefined,
360
+ activeParameterDocumentation: activeArgument
361
+ ? (0, Documentation_js_1.resolveLocalizedText)(activeArgument.documentation, localizer)
362
+ : undefined,
363
+ };
364
+ }
365
+ function buildActiveHelp(parseTree, builtinVariableRegistry, tokens, cursorOffset, localizer) {
366
+ const activeFrame = findActiveCallFrame(tokens, cursorOffset);
367
+ if (!activeFrame?.name) {
368
+ return undefined;
369
+ }
370
+ const memberHelp = buildActiveMemberHelp(parseTree, builtinVariableRegistry, activeFrame, localizer);
371
+ if (memberHelp) {
372
+ return memberHelp;
373
+ }
374
+ const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(activeFrame.name);
375
+ const documentation = func?.getDocumentation();
376
+ if (!func || !documentation) {
377
+ return undefined;
378
+ }
379
+ const activeArgument = func.getFormalArguments()[activeFrame.argumentIndex];
380
+ const label = func.getSignatureLabel(activeFrame.name);
381
+ const fallback = `${label}: ${documentation.fallback}`;
382
+ return {
383
+ label,
384
+ documentation: localizer
385
+ ? localizer.t(documentation.key, fallback)
386
+ : fallback,
387
+ activeParameterIndex: activeFrame.argumentIndex,
388
+ activeParameterLabel: activeArgument
389
+ ? (0, Documentation_js_1.resolveLocalizedText)(activeArgument.displayLabel, localizer) ??
390
+ activeArgument.displayLabel?.fallback ??
391
+ activeArgument.name
392
+ : undefined,
393
+ activeParameterDocumentation: activeArgument
394
+ ? (0, Documentation_js_1.resolveLocalizedText)(activeArgument.documentation, localizer)
395
+ : undefined,
396
+ };
397
+ }
398
+ function toFunctionItem(name, localizer) {
399
+ const insertText = toFunctionInsertText(name);
400
+ return {
401
+ kind: "builtinFunction",
402
+ label: name,
403
+ insertText,
404
+ cursorOffset: insertText.length - 1,
405
+ documentation: buildFunctionDocumentation(name, localizer),
406
+ };
407
+ }
408
+ function toMemberItem(definition, localizer) {
409
+ if (definition.kind === "property") {
410
+ return {
411
+ kind: "builtinMemberProperty",
412
+ label: definition.name,
413
+ returnTypeName: toCompletionTypeName(definition.valueType),
414
+ chainable: isChainableType(definition.valueType),
415
+ documentation: buildMemberDocumentation(definition, localizer),
416
+ };
417
+ }
418
+ const insertText = toFunctionInsertText(definition.name);
419
+ return {
420
+ kind: "builtinMemberFunction",
421
+ label: definition.name,
422
+ insertText,
423
+ cursorOffset: insertText.length - 1,
424
+ argumentTypeNames: definition.argumentTypes.map((type) => type.getName()),
425
+ returnTypeName: toCompletionTypeName(definition.returnType),
426
+ chainable: isChainableType(definition.returnType),
427
+ documentation: buildMemberDocumentation(definition, localizer),
428
+ };
429
+ }
430
+ function collectRuleCandidates(parser, caretTokenIndex, parseTree) {
431
+ const completionCore = new antlr4_c3_1.CodeCompletionCore(parser);
432
+ completionCore.preferredRules = new Set([
433
+ IfcExpressionParser_js_1.IfcExpressionParser.RULE_variableRef,
434
+ IfcExpressionParser_js_1.IfcExpressionParser.RULE_methodAccessor,
435
+ ]);
436
+ return completionCore.collectCandidates(caretTokenIndex, parseTree);
437
+ }
438
+ function getMemberRuleCandidate(ruleCandidates) {
439
+ return ruleCandidates.get(IfcExpressionParser_js_1.IfcExpressionParser.RULE_methodAccessor);
440
+ }
441
+ function hasBuiltinRootRuleCandidate(ruleCandidates) {
442
+ return ruleCandidates.has(IfcExpressionParser_js_1.IfcExpressionParser.RULE_variableRef);
443
+ }
444
+ function hasIdentifierTokenCandidate(tokenCandidates) {
445
+ return tokenCandidates.has(IfcExpressionParser_js_1.IfcExpressionParser.IDENTIFIER);
446
+ }
447
+ class IfcExpressionAutocomplete {
448
+ static complete(input, cursorOffset, options = {}) {
449
+ const builtinVariableRegistry = options.builtinVariableRegistry ??
450
+ BuiltinVariableRegistry_js_1.BuiltinVariableRegistry.getDefaultRegistry();
451
+ const parsed = parseAutocompleteInput(input, cursorOffset);
452
+ const candidates = collectRuleCandidates(parsed.parser, parsed.caretTokenIndex, parsed.parseTree);
453
+ const ruleCandidates = candidates.rules;
454
+ const activeHelp = buildActiveHelp(parsed.parseTree, builtinVariableRegistry, parsed.tokens, cursorOffset, options.localizer);
455
+ const memberCandidate = getMemberRuleCandidate(ruleCandidates);
456
+ if (memberCandidate) {
457
+ const range = findMemberReplaceRange(input, cursorOffset);
458
+ if (!range) {
459
+ return {
460
+ items: [],
461
+ replaceFrom: cursorOffset,
462
+ replaceTo: cursorOffset,
463
+ activeHelp,
464
+ };
465
+ }
466
+ const receiverType = findReceiverTypeForMemberSlot(parsed.parseTree, memberCandidate.startTokenIndex, builtinVariableRegistry);
467
+ if (!(receiverType instanceof ContextObjectType_js_1.ContextObjectType)) {
468
+ return {
469
+ items: [],
470
+ replaceFrom: range.from,
471
+ replaceTo: range.to,
472
+ activeHelp,
473
+ };
474
+ }
475
+ const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));
476
+ const items = receiverType
477
+ .getMemberDefinitions()
478
+ .map((definition) => toMemberItem(definition, options.localizer))
479
+ .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))
480
+ .sort((left, right) => left.label.localeCompare(right.label));
481
+ return {
482
+ items,
483
+ replaceFrom: range.from,
484
+ replaceTo: range.to,
485
+ activeHelp,
486
+ };
487
+ }
488
+ const functionRange = findFunctionReplaceRange(input, cursorOffset);
489
+ if (functionRange && hasIdentifierTokenCandidate(candidates.tokens)) {
490
+ const typedPrefix = normalizeForMatch(input.slice(functionRange.from, functionRange.to));
491
+ const items = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getBuiltinFunctionNames()
492
+ .map((name) => toFunctionItem(name, options.localizer))
493
+ .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))
494
+ .sort((left, right) => left.label.localeCompare(right.label));
495
+ if (items.length > 0) {
496
+ return {
497
+ items,
498
+ replaceFrom: functionRange.from,
499
+ replaceTo: functionRange.to,
500
+ activeHelp,
501
+ };
502
+ }
503
+ }
504
+ const range = findBuiltinRootReplaceRange(input, cursorOffset);
505
+ if (!range || !hasBuiltinRootRuleCandidate(ruleCandidates)) {
506
+ return {
507
+ items: [],
508
+ replaceFrom: cursorOffset,
509
+ replaceTo: cursorOffset,
510
+ activeHelp,
511
+ };
512
+ }
513
+ const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));
514
+ const items = builtinVariableRegistry
515
+ .getDefinitions()
516
+ .map((definition) => ({
517
+ kind: "builtinRoot",
518
+ label: toBuiltinLabel(definition.name),
519
+ documentation: buildRootDocumentation(definition.name, definition.documentation, options.localizer),
520
+ }))
521
+ .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))
522
+ .sort((left, right) => left.label.localeCompare(right.label));
523
+ return {
524
+ items,
525
+ replaceFrom: range.from,
526
+ replaceTo: range.to,
527
+ activeHelp,
528
+ };
529
+ }
530
+ }
531
+ exports.IfcExpressionAutocomplete = IfcExpressionAutocomplete;
532
+ //# sourceMappingURL=IfcExpressionAutocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/autocomplete/IfcExpressionAutocomplete.ts"],"names":[],"mappings":"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","file":"autocomplete/IfcExpressionAutocomplete.js","sourcesContent":["import {\n CharStream,\n CommonTokenStream,\n ParserRuleContext,\n Token,\n} from \"antlr4ng\";\nimport {\n CandidatesCollection,\n CodeCompletionCore,\n ICandidateRule,\n} from \"antlr4-c3\";\nimport {\n BuiltinFunctionDefinition,\n BuiltinMemberDefinition,\n BuiltinVariableRegistry,\n} from \"../builtin/BuiltinVariableRegistry.js\";\nimport { IfcExpressionLexer } from \"../gen/parser/IfcExpressionLexer.js\";\nimport {\n ExprListContext,\n FunctionCallContext,\n IfcExpressionParser,\n MethodAccessorContext,\n MethodCallChainContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n MethodFunctionCallContext,\n MethodPropertyAccessContext,\n SEMethodCallContext,\n SEParenthesisContext,\n SEVariableRefContext,\n SingleExprContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { IfcExpressionFunctions } from \"../expression/function/IfcExpressionFunctions.js\";\nimport { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { ExprType } from \"../type/ExprType.js\";\nimport { CompletionItem, CompletionResult } from \"./CompletionItem.js\";\nimport {\n DocumentationLocalizer,\n resolveLocalizedText,\n} from \"../documentation/Documentation.js\";\n\nexport type IfcExpressionAutocompleteOptions = {\n builtinVariableRegistry?: BuiltinVariableRegistry;\n localizer?: DocumentationLocalizer;\n};\n\ntype CompletedAccessorStep =\n | {\n name: string;\n kind: \"property\";\n startTokenIndex: number;\n }\n | {\n name: string;\n kind: \"function\";\n argumentCount: number;\n startTokenIndex: number;\n };\n\ntype MethodAccessorStep =\n | CompletedAccessorStep\n | {\n kind: \"incomplete\";\n startTokenIndex: number;\n };\n\ntype ParsedAutocompleteInput = {\n parser: IfcExpressionParser;\n parseTree: ParserRuleContext;\n tokens: Array<Token>;\n caretTokenIndex: number;\n};\n\nfunction isIdentifierChar(char: string | undefined): boolean {\n return typeof char === \"string\" && /[a-zA-Z0-9_\\-$&]/.test(char);\n}\n\nfunction toBuiltinLabel(name: string): string {\n return name.startsWith(\"$\") ? name : `$${name}`;\n}\n\nfunction normalizeForMatch(value: string): string {\n return value.toUpperCase();\n}\n\nfunction toCompletionTypeName(type: ExprType): string {\n return type.getName().replace(/^\\$/, \"\");\n}\n\nfunction isChainableType(type: ExprType): boolean {\n return type instanceof ContextObjectType;\n}\n\nfunction isExtendableTokenType(tokenType: number): boolean {\n return tokenType === IfcExpressionParser.IDENTIFIER;\n}\n\nfunction findCaretTokenIndex(\n tokens: Array<Token>,\n cursorOffset: number\n): number {\n if (tokens.length === 0) {\n return 0;\n }\n\n const cursor = Math.max(0, cursorOffset);\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.type === Token.EOF) {\n return token.tokenIndex;\n }\n\n if (cursor < token.start) {\n return token.tokenIndex;\n }\n\n if (cursor <= token.stop) {\n return token.tokenIndex;\n }\n\n if (cursor === token.stop + 1) {\n if (isExtendableTokenType(token.type)) {\n return token.tokenIndex;\n }\n\n const nextToken = tokens[i + 1];\n return nextToken?.tokenIndex ?? token.tokenIndex;\n }\n }\n\n return tokens[tokens.length - 1].tokenIndex;\n}\n\nfunction parseAutocompleteInput(\n input: string,\n cursorOffset: number\n): ParsedAutocompleteInput {\n const chars = CharStream.fromString(input);\n const lexer = new IfcExpressionLexer(chars);\n const tokenStream = new CommonTokenStream(lexer);\n const parser = new IfcExpressionParser(tokenStream);\n lexer.removeErrorListeners();\n parser.removeErrorListeners();\n const parseTree = parser.expr();\n tokenStream.fill();\n const tokens = tokenStream.getTokens();\n\n return {\n parser,\n parseTree,\n tokens,\n caretTokenIndex: findCaretTokenIndex(tokens, cursorOffset),\n };\n}\n\nfunction findBuiltinRootReplaceRange(\n input: string,\n cursorOffset: number\n): { from: number; to: number } | undefined {\n const cursor = Math.max(0, Math.min(cursorOffset, input.length));\n let i = cursor - 1;\n\n while (i >= 0 && isIdentifierChar(input[i]) && input[i] !== \"$\") {\n i--;\n }\n\n if (i >= 0 && input[i] === \"$\") {\n return { from: i, to: cursor };\n }\n\n return undefined;\n}\n\nfunction findIdentifierReplaceRange(\n input: string,\n cursorOffset: number\n): { from: number; to: number } {\n const cursor = Math.max(0, Math.min(cursorOffset, input.length));\n let from = cursor;\n\n while (from > 0 && isIdentifierChar(input[from - 1])) {\n from--;\n }\n\n return {\n from,\n to: cursor,\n };\n}\n\nfunction findMemberReplaceRange(\n input: string,\n cursorOffset: number\n): { from: number; to: number } | undefined {\n const range = findIdentifierReplaceRange(input, cursorOffset);\n\n if (range.from === 0 || input[range.from - 1] !== \".\") {\n return undefined;\n }\n\n return range;\n}\n\nfunction findFunctionReplaceRange(\n input: string,\n cursorOffset: number\n): { from: number; to: number } | undefined {\n const range = findIdentifierReplaceRange(input, cursorOffset);\n const prefixChar = range.from > 0 ? input[range.from - 1] : undefined;\n const hasIdentifierFragment =\n range.from < range.to || isIdentifierChar(input[Math.max(0, range.to)]);\n\n if (!hasIdentifierFragment || prefixChar === \".\" || prefixChar === \"$\") {\n return undefined;\n }\n\n return range;\n}\n\nfunction countExprListArguments(exprList: ExprListContext | undefined): number {\n if (!exprList) {\n return 0;\n }\n\n const rest = exprList.exprList();\n return 1 + (rest ? countExprListArguments(rest) : 0);\n}\n\nfunction toMethodAccessorStep(\n methodAccessor: MethodAccessorContext\n): CompletedAccessorStep | undefined {\n if (methodAccessor instanceof MethodPropertyAccessContext) {\n const identifier = methodAccessor.IDENTIFIER()?.getText();\n if (!identifier) {\n return undefined;\n }\n\n return {\n name: identifier,\n kind: \"property\",\n startTokenIndex: methodAccessor.start?.tokenIndex ?? -1,\n };\n }\n\n if (methodAccessor instanceof MethodFunctionCallContext) {\n const functionCall = methodAccessor.functionCall();\n const name = functionCall.IDENTIFIER()?.getText();\n if (!name) {\n return undefined;\n }\n\n return {\n name,\n kind: \"function\",\n argumentCount: countExprListArguments(functionCall.exprList()),\n startTokenIndex: functionCall.start?.tokenIndex ?? -1,\n };\n }\n\n return undefined;\n}\n\nfunction collectMethodCallChainSteps(\n methodCallChain: MethodCallChainContext\n): Array<MethodAccessorStep> | undefined {\n if (methodCallChain instanceof MethodCallChainInnerContext) {\n const current = toMethodAccessorStep(methodCallChain.methodAccessor());\n const rest = collectMethodCallChainSteps(methodCallChain.methodCallChain());\n if (!current || !rest) {\n return undefined;\n }\n\n return [current, ...rest];\n }\n\n if (methodCallChain instanceof MethodCallChainEndContext) {\n const current = toMethodAccessorStep(methodCallChain.methodAccessor());\n return current ? [current] : undefined;\n }\n\n const dot = methodCallChain.getToken(IfcExpressionParser.DOT, 0);\n if (dot) {\n return [\n {\n kind: \"incomplete\",\n startTokenIndex: dot.symbol.tokenIndex + 1,\n },\n ];\n }\n\n return [];\n}\n\nfunction getMemberResultType(definition: BuiltinMemberDefinition): ExprType {\n return definition.kind === \"property\"\n ? definition.valueType\n : definition.returnType;\n}\n\nfunction resolveCompletedAccessorStep(\n currentType: ExprType,\n step: CompletedAccessorStep\n): ExprType | undefined {\n if (!(currentType instanceof ContextObjectType)) {\n return undefined;\n }\n\n const memberDefinition = currentType.getMemberDefinition(step.name);\n if (!memberDefinition) {\n return undefined;\n }\n\n if (step.kind === \"property\") {\n return memberDefinition.kind === \"property\"\n ? memberDefinition.valueType\n : undefined;\n }\n\n if (memberDefinition.kind !== \"function\") {\n return undefined;\n }\n\n if (memberDefinition.argumentTypes.length !== step.argumentCount) {\n return undefined;\n }\n\n return memberDefinition.returnType;\n}\n\nfunction resolveSingleExprType(\n singleExpr: SingleExprContext,\n builtinVariableRegistry: BuiltinVariableRegistry\n): ExprType | undefined {\n if (singleExpr instanceof SEVariableRefContext) {\n const identifier = singleExpr.variableRef()?.IDENTIFIER()?.getText();\n return identifier\n ? builtinVariableRegistry.getDefinition(`$${identifier}`)?.type\n : undefined;\n }\n\n if (singleExpr instanceof SEParenthesisContext) {\n return resolveSingleExprType(\n singleExpr.singleExpr(),\n builtinVariableRegistry\n );\n }\n\n if (singleExpr instanceof SEMethodCallContext) {\n const baseType = resolveSingleExprType(\n singleExpr.singleExpr(),\n builtinVariableRegistry\n );\n const steps = collectMethodCallChainSteps(singleExpr.methodCallChain());\n if (!baseType || !steps) {\n return undefined;\n }\n\n let currentType: ExprType | undefined = baseType;\n for (const step of steps) {\n if (step.kind === \"incomplete\") {\n return undefined;\n }\n\n currentType = resolveCompletedAccessorStep(currentType, step);\n if (!currentType) {\n return undefined;\n }\n }\n\n return currentType;\n }\n\n return undefined;\n}\n\nfunction findReceiverTypeForMemberSlot(\n node: ParserRuleContext,\n startTokenIndex: number,\n builtinVariableRegistry: BuiltinVariableRegistry\n): ExprType | undefined {\n if (node instanceof SEMethodCallContext) {\n const steps = collectMethodCallChainSteps(node.methodCallChain());\n if (steps) {\n const slotIndex = steps.findIndex(\n (step) => step.startTokenIndex === startTokenIndex\n );\n\n if (slotIndex >= 0) {\n let currentType = resolveSingleExprType(\n node.singleExpr(),\n builtinVariableRegistry\n );\n\n for (const step of steps.slice(0, slotIndex)) {\n if (!currentType || step.kind === \"incomplete\") {\n return undefined;\n }\n\n currentType = resolveCompletedAccessorStep(currentType, step);\n }\n\n return currentType;\n }\n }\n }\n\n for (let i = 0; i < node.getChildCount(); i++) {\n const child = node.getChild(i);\n if (child instanceof ParserRuleContext) {\n const receiverType = findReceiverTypeForMemberSlot(\n child,\n startTokenIndex,\n builtinVariableRegistry\n );\n if (receiverType) {\n return receiverType;\n }\n }\n }\n\n return undefined;\n}\n\nfunction toFunctionInsertText(name: string): string {\n return `${name}()`;\n}\n\nfunction buildSignatureLabel(\n name: string,\n argumentLabels: Array<string>\n): string {\n return `${name}(${argumentLabels.join(\", \")})`;\n}\n\nfunction buildFunctionDocumentation(\n name: string,\n localizer?: DocumentationLocalizer\n): string | undefined {\n const func = IfcExpressionFunctions.getFunction(name);\n const documentation = func?.getDocumentation();\n if (!func || !documentation) {\n return undefined;\n }\n\n const fallback = `${func.getSignatureLabel(name)}: ${documentation.fallback}`;\n return localizer ? localizer.t(documentation.key, fallback) : fallback;\n}\n\nfunction buildMemberDocumentation(\n definition: BuiltinMemberDefinition,\n localizer?: DocumentationLocalizer\n): string | undefined {\n if (!definition.documentation) {\n return undefined;\n }\n\n const fallback =\n definition.kind === \"property\"\n ? `${definition.name}: ${definition.documentation.fallback}`\n : `${buildSignatureLabel(\n definition.name,\n (definition.argumentDocumentation ?? []).map(\n (argument, index) => argument.label.fallback ?? `arg${index}`\n )\n )}: ${definition.documentation.fallback}`;\n\n return localizer\n ? localizer.t(definition.documentation.key, fallback)\n : fallback;\n}\n\nfunction buildRootDocumentation(\n name: string,\n documentation,\n localizer?: DocumentationLocalizer\n): string | undefined {\n if (!documentation) {\n return undefined;\n }\n\n const fallback = documentation.fallback;\n return localizer ? localizer.t(documentation.key, fallback) : fallback;\n}\n\ntype CallFrame = {\n kind: \"function\" | \"group\" | \"array\";\n name?: string;\n argumentIndex: number;\n startTokenIndex?: number;\n};\n\nfunction findActiveCallFrame(\n tokens: Array<Token>,\n cursorOffset: number\n): CallFrame | undefined {\n const stack: Array<CallFrame> = [];\n let previousSignificantToken: Token | undefined;\n\n for (const token of tokens) {\n if (token.type === Token.EOF || token.start >= cursorOffset) {\n break;\n }\n\n if (\n token.type === IfcExpressionParser.WS ||\n token.type === IfcExpressionParser.NEWLINE\n ) {\n continue;\n }\n\n if (token.type === IfcExpressionParser.T__1) {\n stack.push(\n previousSignificantToken?.type === IfcExpressionParser.IDENTIFIER\n ? {\n kind: \"function\",\n name: previousSignificantToken.text ?? undefined,\n argumentIndex: 0,\n startTokenIndex: previousSignificantToken.tokenIndex,\n }\n : { kind: \"group\", argumentIndex: 0 }\n );\n } else if (token.type === IfcExpressionParser.T__10) {\n stack.push({ kind: \"array\", argumentIndex: 0 });\n } else if (\n token.type === IfcExpressionParser.T__2 ||\n token.type === IfcExpressionParser.T__11\n ) {\n stack.pop();\n } else if (token.type === IfcExpressionParser.T__9) {\n const currentFrame = stack[stack.length - 1];\n if (currentFrame?.kind === \"function\") {\n currentFrame.argumentIndex += 1;\n }\n }\n\n previousSignificantToken = token;\n }\n\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i].kind === \"function\") {\n return stack[i];\n }\n }\n\n return undefined;\n}\n\nfunction buildMemberSignatureLabel(\n definition: BuiltinFunctionDefinition\n): string {\n return buildSignatureLabel(\n definition.name,\n (definition.argumentDocumentation ?? []).map(\n (argument, index) => argument.label.fallback ?? `arg${index}`\n )\n );\n}\n\nfunction buildActiveMemberHelp(\n parseTree: ParserRuleContext,\n builtinVariableRegistry: BuiltinVariableRegistry,\n activeFrame: CallFrame,\n localizer?: DocumentationLocalizer\n): CompletionResult[\"activeHelp\"] {\n if (activeFrame.startTokenIndex === undefined || !activeFrame.name) {\n return undefined;\n }\n\n const receiverType = findReceiverTypeForMemberSlot(\n parseTree,\n activeFrame.startTokenIndex,\n builtinVariableRegistry\n );\n if (!(receiverType instanceof ContextObjectType)) {\n return undefined;\n }\n\n const memberDefinition = receiverType.getMemberDefinition(activeFrame.name);\n if (\n memberDefinition?.kind !== \"function\" ||\n !memberDefinition.documentation\n ) {\n return undefined;\n }\n\n const label = buildMemberSignatureLabel(memberDefinition);\n const fallback = memberDefinition.documentation.fallback.startsWith(\n `${label}: `\n )\n ? memberDefinition.documentation.fallback\n : `${label}: ${memberDefinition.documentation.fallback}`;\n const activeArgument =\n memberDefinition.argumentDocumentation?.[activeFrame.argumentIndex];\n\n return {\n label,\n documentation: localizer\n ? localizer.t(memberDefinition.documentation.key, fallback)\n : fallback,\n activeParameterIndex: activeFrame.argumentIndex,\n activeParameterLabel: activeArgument\n ? resolveLocalizedText(activeArgument.label, localizer) ??\n activeArgument.label.fallback\n : undefined,\n activeParameterDocumentation: activeArgument\n ? resolveLocalizedText(activeArgument.documentation, localizer)\n : undefined,\n };\n}\n\nfunction buildActiveHelp(\n parseTree: ParserRuleContext,\n builtinVariableRegistry: BuiltinVariableRegistry,\n tokens: Array<Token>,\n cursorOffset: number,\n localizer?: DocumentationLocalizer\n): CompletionResult[\"activeHelp\"] {\n const activeFrame = findActiveCallFrame(tokens, cursorOffset);\n if (!activeFrame?.name) {\n return undefined;\n }\n\n const memberHelp = buildActiveMemberHelp(\n parseTree,\n builtinVariableRegistry,\n activeFrame,\n localizer\n );\n if (memberHelp) {\n return memberHelp;\n }\n\n const func = IfcExpressionFunctions.getFunction(activeFrame.name);\n const documentation = func?.getDocumentation();\n if (!func || !documentation) {\n return undefined;\n }\n\n const activeArgument = func.getFormalArguments()[activeFrame.argumentIndex];\n const label = func.getSignatureLabel(activeFrame.name);\n const fallback = `${label}: ${documentation.fallback}`;\n return {\n label,\n documentation: localizer\n ? localizer.t(documentation.key, fallback)\n : fallback,\n activeParameterIndex: activeFrame.argumentIndex,\n activeParameterLabel: activeArgument\n ? resolveLocalizedText(activeArgument.displayLabel, localizer) ??\n activeArgument.displayLabel?.fallback ??\n activeArgument.name\n : undefined,\n activeParameterDocumentation: activeArgument\n ? resolveLocalizedText(activeArgument.documentation, localizer)\n : undefined,\n };\n}\nfunction toFunctionItem(\n name: string,\n localizer?: DocumentationLocalizer\n): CompletionItem {\n const insertText = toFunctionInsertText(name);\n\n return {\n kind: \"builtinFunction\",\n label: name,\n insertText,\n cursorOffset: insertText.length - 1,\n documentation: buildFunctionDocumentation(name, localizer),\n };\n}\n\nfunction toMemberItem(\n definition: BuiltinMemberDefinition,\n localizer?: DocumentationLocalizer\n): CompletionItem {\n if (definition.kind === \"property\") {\n return {\n kind: \"builtinMemberProperty\",\n label: definition.name,\n returnTypeName: toCompletionTypeName(definition.valueType),\n chainable: isChainableType(definition.valueType),\n documentation: buildMemberDocumentation(definition, localizer),\n };\n }\n\n const insertText = toFunctionInsertText(definition.name);\n\n return {\n kind: \"builtinMemberFunction\",\n label: definition.name,\n insertText,\n cursorOffset: insertText.length - 1,\n argumentTypeNames: definition.argumentTypes.map((type) => type.getName()),\n returnTypeName: toCompletionTypeName(definition.returnType),\n chainable: isChainableType(definition.returnType),\n documentation: buildMemberDocumentation(definition, localizer),\n };\n}\n\nfunction collectRuleCandidates(\n parser: IfcExpressionParser,\n caretTokenIndex: number,\n parseTree: ParserRuleContext\n): CandidatesCollection {\n const completionCore = new CodeCompletionCore(parser);\n completionCore.preferredRules = new Set([\n IfcExpressionParser.RULE_variableRef,\n IfcExpressionParser.RULE_methodAccessor,\n ]);\n\n return completionCore.collectCandidates(caretTokenIndex, parseTree);\n}\n\nfunction getMemberRuleCandidate(\n ruleCandidates: Map<number, ICandidateRule>\n): ICandidateRule | undefined {\n return ruleCandidates.get(IfcExpressionParser.RULE_methodAccessor);\n}\n\nfunction hasBuiltinRootRuleCandidate(\n ruleCandidates: Map<number, ICandidateRule>\n): boolean {\n return ruleCandidates.has(IfcExpressionParser.RULE_variableRef);\n}\n\nfunction hasIdentifierTokenCandidate(\n tokenCandidates: Map<number, Array<number>>\n): boolean {\n return tokenCandidates.has(IfcExpressionParser.IDENTIFIER);\n}\n\nexport class IfcExpressionAutocomplete {\n public static complete(\n input: string,\n cursorOffset: number,\n options: IfcExpressionAutocompleteOptions = {}\n ): CompletionResult {\n const builtinVariableRegistry =\n options.builtinVariableRegistry ??\n BuiltinVariableRegistry.getDefaultRegistry();\n const parsed = parseAutocompleteInput(input, cursorOffset);\n const candidates = collectRuleCandidates(\n parsed.parser,\n parsed.caretTokenIndex,\n parsed.parseTree\n );\n const ruleCandidates = candidates.rules;\n const activeHelp = buildActiveHelp(\n parsed.parseTree,\n builtinVariableRegistry,\n parsed.tokens,\n cursorOffset,\n options.localizer\n );\n\n const memberCandidate = getMemberRuleCandidate(ruleCandidates);\n if (memberCandidate) {\n const range = findMemberReplaceRange(input, cursorOffset);\n if (!range) {\n return {\n items: [],\n replaceFrom: cursorOffset,\n replaceTo: cursorOffset,\n activeHelp,\n };\n }\n\n const receiverType = findReceiverTypeForMemberSlot(\n parsed.parseTree,\n memberCandidate.startTokenIndex,\n builtinVariableRegistry\n );\n if (!(receiverType instanceof ContextObjectType)) {\n return {\n items: [],\n replaceFrom: range.from,\n replaceTo: range.to,\n activeHelp,\n };\n }\n\n const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));\n const items = receiverType\n .getMemberDefinitions()\n .map((definition) => toMemberItem(definition, options.localizer))\n .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))\n .sort((left, right) => left.label.localeCompare(right.label));\n\n return {\n items,\n replaceFrom: range.from,\n replaceTo: range.to,\n activeHelp,\n };\n }\n\n const functionRange = findFunctionReplaceRange(input, cursorOffset);\n if (functionRange && hasIdentifierTokenCandidate(candidates.tokens)) {\n const typedPrefix = normalizeForMatch(\n input.slice(functionRange.from, functionRange.to)\n );\n const items = IfcExpressionFunctions.getBuiltinFunctionNames()\n .map((name) => toFunctionItem(name, options.localizer))\n .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))\n .sort((left, right) => left.label.localeCompare(right.label));\n\n if (items.length > 0) {\n return {\n items,\n replaceFrom: functionRange.from,\n replaceTo: functionRange.to,\n activeHelp,\n };\n }\n }\n\n const range = findBuiltinRootReplaceRange(input, cursorOffset);\n if (!range || !hasBuiltinRootRuleCandidate(ruleCandidates)) {\n return {\n items: [],\n replaceFrom: cursorOffset,\n replaceTo: cursorOffset,\n activeHelp,\n };\n }\n\n const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));\n const items: Array<CompletionItem> = builtinVariableRegistry\n .getDefinitions()\n .map((definition) => ({\n kind: \"builtinRoot\" as const,\n label: toBuiltinLabel(definition.name),\n documentation: buildRootDocumentation(\n definition.name,\n definition.documentation,\n options.localizer\n ),\n }))\n .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))\n .sort((left, right) => left.label.localeCompare(right.label));\n\n return {\n items,\n replaceFrom: range.from,\n replaceTo: range.to,\n activeHelp,\n };\n }\n}\n"]}