ifc-expressions 3.0.0-beta.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -227,6 +227,19 @@ The autocomplete surface is shaped by two inputs:
227
227
 
228
228
  That means the same builtin definitions you use for parsing and evaluation also drive autocomplete. If a client registers `$thequery` or `$theresult`, those exact reserved names, their typed members, and their member functions participate in completion automatically.
229
229
 
230
+ For empty or whitespace-only expressions, you can also provide a curated starter list with `emptyExpressionStarters`. Use the same names users would type in expressions: builtin roots such as `"$result"` and builtin functions such as `"REPLACE"`.
231
+ Unknown starter names are ignored, and if you omit this option the built-in default starter list is used.
232
+
233
+ ```ts
234
+ const emptyStateCompletion = IfcExpressionAutocomplete.complete("", 0, {
235
+ builtinVariableRegistry,
236
+ emptyExpressionStarters: ["$result", "REPLACE", "$query", "TOBOOLEAN"],
237
+ });
238
+
239
+ console.log(emptyStateCompletion.items.map((item) => item.label));
240
+ // ["$result", "REPLACE", "$query", "TOBOOLEAN"]
241
+ ```
242
+
230
243
  Example with localization:
231
244
 
232
245
  ```ts
@@ -4,6 +4,7 @@ import { DocumentationLocalizer } from "../documentation/Documentation.js";
4
4
  export type IfcExpressionAutocompleteOptions = {
5
5
  builtinVariableRegistry?: BuiltinVariableRegistry;
6
6
  localizer?: DocumentationLocalizer;
7
+ emptyExpressionStarters?: Array<string>;
7
8
  };
8
9
  export declare class IfcExpressionAutocomplete {
9
10
  static complete(input: string, cursorOffset: number, options?: IfcExpressionAutocompleteOptions): CompletionResult;
@@ -24,6 +24,72 @@ function toCompletionTypeName(type) {
24
24
  function isChainableType(type) {
25
25
  return type instanceof ContextObjectType_js_1.ContextObjectType;
26
26
  }
27
+ const unsupportedPrimitiveMethodFunctionNames = new Set([
28
+ "NAME",
29
+ "GUID",
30
+ "IFCCLASS",
31
+ "DESCRIPTION",
32
+ "VALUE",
33
+ ]);
34
+ const preferredMethodLabels = new Map([
35
+ ["MAP", "map"],
36
+ ["CHOOSE", "choose"],
37
+ ["AT", "at"],
38
+ ["IF", "if"],
39
+ ["ROUND", "round"],
40
+ ["NAME", "name"],
41
+ ["GUID", "guid"],
42
+ ["IFCCLASS", "ifcClass"],
43
+ ["DESCRIPTION", "description"],
44
+ ["VALUE", "value"],
45
+ ["PROPERTYSET", "propertySet"],
46
+ ["PROPERTY", "property"],
47
+ ["TYPE", "type"],
48
+ ["NOT", "not"],
49
+ ["TOSTRING", "toString"],
50
+ ["TONUMERIC", "toNumeric"],
51
+ ["TONUMBER", "toNumber"],
52
+ ["TOBOOLEAN", "toBoolean"],
53
+ ["TOLOGICAL", "toLogical"],
54
+ ["NOTFOUNDASUNKNOWN", "notFoundAsUnknown"],
55
+ ["TOIFCDATE", "toIfcDate"],
56
+ ["TOIFCTIME", "toIfcTime"],
57
+ ["TOIFCDATETIME", "toIfcDateTime"],
58
+ ["TOIFCDURATION", "toIfcDuration"],
59
+ ["TOIFCTIMESTAMP", "toIfcTimeStamp"],
60
+ ["ADDDURATION", "addDuration"],
61
+ ["TOLOWERCASE", "toLowerCase"],
62
+ ["TOUPPERCASE", "toUpperCase"],
63
+ ["SUBSTRING", "substring"],
64
+ ["SPLIT", "split"],
65
+ ["EXISTS", "exists"],
66
+ ["AND", "and"],
67
+ ["OR", "or"],
68
+ ["XOR", "xor"],
69
+ ["IMPLIES", "implies"],
70
+ ["EQUALS", "equals"],
71
+ ["GREATERTHAN", "greaterThan"],
72
+ ["GREATERTHANOREQUAL", "greaterThanOrEqual"],
73
+ ["LESSTHAN", "lessThan"],
74
+ ["LESSTHANOREQUAL", "lessThanOrEqual"],
75
+ ["CONTAINS", "contains"],
76
+ ["MATCHES", "matches"],
77
+ ["REGEXCONTAINS", "regexContains"],
78
+ ["REGEXMATCHES", "regexMatches"],
79
+ ["REPLACE", "replace"],
80
+ ["REGEXREPLACE", "regexReplace"],
81
+ ]);
82
+ const emptyExpressionStarterFunctionNames = [
83
+ "IF",
84
+ "EXISTS",
85
+ "ROUND",
86
+ "CONTAINS",
87
+ "MATCHES",
88
+ "REPLACE",
89
+ "TOSTRING",
90
+ "TONUMERIC",
91
+ "TOBOOLEAN",
92
+ ];
27
93
  function isExtendableTokenType(tokenType) {
28
94
  return tokenType === IfcExpressionParser_js_1.IfcExpressionParser.IDENTIFIER;
29
95
  }
@@ -250,19 +316,22 @@ function findReceiverTypeForMemberSlot(node, startTokenIndex, builtinVariableReg
250
316
  }
251
317
  return undefined;
252
318
  }
319
+ function isEmptyExpressionInput(input) {
320
+ return input.trim().length === 0;
321
+ }
253
322
  function toFunctionInsertText(name) {
254
323
  return `${name}()`;
255
324
  }
256
325
  function buildSignatureLabel(name, argumentLabels) {
257
326
  return `${name}(${argumentLabels.join(", ")})`;
258
327
  }
259
- function buildFunctionDocumentation(name, localizer) {
328
+ function buildFunctionDocumentation(name, localizer, displayName = name) {
260
329
  const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(name);
261
330
  const documentation = func?.getDocumentation();
262
331
  if (!func || !documentation) {
263
332
  return undefined;
264
333
  }
265
- const fallback = `${func.getSignatureLabel(name)}: ${documentation.fallback}`;
334
+ const fallback = `${func.getSignatureLabel(displayName)}: ${documentation.fallback}`;
266
335
  return localizer ? localizer.t(documentation.key, fallback) : fallback;
267
336
  }
268
337
  function buildMemberDocumentation(definition, localizer) {
@@ -277,11 +346,10 @@ function buildMemberDocumentation(definition, localizer) {
277
346
  : fallback;
278
347
  }
279
348
  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;
349
+ const key = documentation?.key ?? `builtin.${name}.summary`;
350
+ const fallback = documentation?.fallback ??
351
+ `${name}: built-in value from the evaluation context`;
352
+ return localizer ? localizer.t(key, fallback) : fallback;
285
353
  }
286
354
  function findActiveCallFrame(tokens, cursorOffset) {
287
355
  const stack = [];
@@ -395,16 +463,67 @@ function buildActiveHelp(parseTree, builtinVariableRegistry, tokens, cursorOffse
395
463
  : undefined,
396
464
  };
397
465
  }
398
- function toFunctionItem(name, localizer) {
399
- const insertText = toFunctionInsertText(name);
466
+ function toFunctionItem(name, localizer, label = name) {
467
+ const insertText = toFunctionInsertText(label);
400
468
  return {
401
469
  kind: "builtinFunction",
402
- label: name,
470
+ label,
403
471
  insertText,
404
472
  cursorOffset: insertText.length - 1,
405
- documentation: buildFunctionDocumentation(name, localizer),
473
+ documentation: buildFunctionDocumentation(name, localizer, label),
474
+ };
475
+ }
476
+ function getPreferredMethodLabel(name) {
477
+ return preferredMethodLabels.get(name) ?? name;
478
+ }
479
+ function isApplicablePrimitiveMethodFunction(name, receiverType) {
480
+ if (unsupportedPrimitiveMethodFunctionNames.has(name)) {
481
+ return false;
482
+ }
483
+ const func = IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(name);
484
+ const firstArgument = func?.getFormalArguments()[0];
485
+ if (!func || !firstArgument) {
486
+ return false;
487
+ }
488
+ const firstArgumentType = firstArgument.getType();
489
+ return (firstArgumentType.isAssignableFrom(receiverType) ||
490
+ firstArgumentType.overlapsWith(receiverType));
491
+ }
492
+ function getPrimitiveMethodItems(receiverType, localizer) {
493
+ return IfcExpressionFunctions_js_1.IfcExpressionFunctions.getBuiltinFunctionNames()
494
+ .filter((name) => isApplicablePrimitiveMethodFunction(name, receiverType))
495
+ .map((name) => toFunctionItem(name, localizer, getPreferredMethodLabel(name)));
496
+ }
497
+ function toBuiltinRootItem(name, builtinVariableRegistry, localizer) {
498
+ const normalizedName = name.startsWith("$") ? name : `${name}`;
499
+ const definition = builtinVariableRegistry.getDefinition(normalizedName);
500
+ if (!definition) {
501
+ return undefined;
502
+ }
503
+ return {
504
+ kind: "builtinRoot",
505
+ label: toBuiltinLabel(definition.name),
506
+ documentation: buildRootDocumentation(definition.name, definition.documentation, localizer),
406
507
  };
407
508
  }
509
+ function toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer) {
510
+ if (name.startsWith("$")) {
511
+ return toBuiltinRootItem(name, builtinVariableRegistry, localizer);
512
+ }
513
+ return IfcExpressionFunctions_js_1.IfcExpressionFunctions.getFunction(name)
514
+ ? toFunctionItem(name, localizer)
515
+ : undefined;
516
+ }
517
+ function getEmptyExpressionStarterItems(builtinVariableRegistry, localizer, starterNames = [
518
+ ...builtinVariableRegistry
519
+ .getDefinitions()
520
+ .map((definition) => toBuiltinLabel(definition.name)),
521
+ ...emptyExpressionStarterFunctionNames,
522
+ ]) {
523
+ return starterNames
524
+ .map((name) => toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer))
525
+ .filter((item) => item !== undefined);
526
+ }
408
527
  function toMemberItem(definition, localizer) {
409
528
  if (definition.kind === "property") {
410
529
  return {
@@ -448,6 +567,13 @@ class IfcExpressionAutocomplete {
448
567
  static complete(input, cursorOffset, options = {}) {
449
568
  const builtinVariableRegistry = options.builtinVariableRegistry ??
450
569
  BuiltinVariableRegistry_js_1.BuiltinVariableRegistry.getDefaultRegistry();
570
+ if (isEmptyExpressionInput(input)) {
571
+ return {
572
+ items: getEmptyExpressionStarterItems(builtinVariableRegistry, options.localizer, options.emptyExpressionStarters),
573
+ replaceFrom: 0,
574
+ replaceTo: input.length,
575
+ };
576
+ }
451
577
  const parsed = parseAutocompleteInput(input, cursorOffset);
452
578
  const candidates = collectRuleCandidates(parsed.parser, parsed.caretTokenIndex, parsed.parseTree);
453
579
  const ruleCandidates = candidates.rules;
@@ -464,18 +590,14 @@ class IfcExpressionAutocomplete {
464
590
  };
465
591
  }
466
592
  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
593
  const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));
476
- const items = receiverType
477
- .getMemberDefinitions()
478
- .map((definition) => toMemberItem(definition, options.localizer))
594
+ const items = (receiverType instanceof ContextObjectType_js_1.ContextObjectType
595
+ ? receiverType
596
+ .getMemberDefinitions()
597
+ .map((definition) => toMemberItem(definition, options.localizer))
598
+ : receiverType
599
+ ? getPrimitiveMethodItems(receiverType, options.localizer)
600
+ : [])
479
601
  .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))
480
602
  .sort((left, right) => left.label.localeCompare(right.label));
481
603
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/autocomplete/IfcExpressionAutocomplete.ts"],"names":[],"mappings":";;;AAAA,uCAKkB;AAClB,yCAImB;AACnB,sFAI+C;AAC/C,+EAAyE;AACzE,iFAc8C;AAC9C,gGAA0F;AAC1F,uEAAiE;AAGjE,wEAG2C;AAkC3C,SAAS,gBAAgB,CAAC,IAAwB;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IACrC,OAAO,IAAI,YAAY,wCAAiB,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,OAAO,SAAS,KAAK,4CAAmB,CAAC,UAAU,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAoB,EACpB,YAAoB;IAEpB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,CAAC,CAAC;KACV;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAK,CAAC,GAAG,EAAE;YAC5B,OAAO,KAAK,CAAC,UAAU,CAAC;SACzB;QAED,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE;YACxB,OAAO,KAAK,CAAC,UAAU,CAAC;SACzB;QAED,IAAI,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE;YACxB,OAAO,KAAK,CAAC,UAAU,CAAC;SACzB;QAED,IAAI,MAAM,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE;YAC7B,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACrC,OAAO,KAAK,CAAC,UAAU,CAAC;aACzB;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,OAAO,SAAS,EAAE,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;SAClD;KACF;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9C,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,YAAoB;IAEpB,MAAM,KAAK,GAAG,qBAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,0CAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,4BAAiB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,4CAAmB,CAAC,WAAW,CAAC,CAAC;IACpD,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC7B,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAChC,WAAW,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAEvC,OAAO;QACL,MAAM;QACN,SAAS;QACT,MAAM;QACN,eAAe,EAAE,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAa,EACb,YAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IAEnB,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QAC/D,CAAC,EAAE,CAAC;KACL;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QAC9B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;KAChC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAa,EACb,YAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,GAAG,MAAM,CAAC;IAElB,OAAO,IAAI,GAAG,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;QACpD,IAAI,EAAE,CAAC;KACR;IAED,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,MAAM;KACX,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,YAAoB;IAEpB,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAE9D,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;QACrD,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAa,EACb,YAAoB;IAEpB,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,qBAAqB,GACzB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,IAAI,CAAC,qBAAqB,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE;QACtE,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAqC;IACnE,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,CAAC,CAAC;KACV;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAC3B,cAAqC;IAErC,IAAI,cAAc,YAAY,oDAA2B,EAAE;QACzD,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC;QAC1D,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,SAAS,CAAC;SAClB;QAED,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,eAAe,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;SACxD,CAAC;KACH;IAED,IAAI,cAAc,YAAY,kDAAyB,EAAE;QACvD,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,SAAS,CAAC;SAClB;QAED,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,UAAU;YAChB,aAAa,EAAE,sBAAsB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC9D,eAAe,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;SACtD,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,2BAA2B,CAClC,eAAuC;IAEvC,IAAI,eAAe,YAAY,oDAA2B,EAAE;QAC1D,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,2BAA2B,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE;YACrB,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;KAC3B;IAED,IAAI,eAAe,YAAY,kDAAyB,EAAE;QACxD,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC;QACvE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KACxC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,4CAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjE,IAAI,GAAG,EAAE;QACP,OAAO;YACL;gBACE,IAAI,EAAE,YAAY;gBAClB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC;aAC3C;SACF,CAAC;KACH;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAmC;IAC9D,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU;QACnC,CAAC,CAAC,UAAU,CAAC,SAAS;QACtB,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;AAC5B,CAAC;AAED,SAAS,4BAA4B,CACnC,WAAqB,EACrB,IAA2B;IAE3B,IAAI,CAAC,CAAC,WAAW,YAAY,wCAAiB,CAAC,EAAE;QAC/C,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,CAAC,gBAAgB,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;QAC5B,OAAO,gBAAgB,CAAC,IAAI,KAAK,UAAU;YACzC,CAAC,CAAC,gBAAgB,CAAC,SAAS;YAC5B,CAAC,CAAC,SAAS,CAAC;KACf;IAED,IAAI,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE;QACxC,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,gBAAgB,CAAC,aAAa,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE;QAChE,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,gBAAgB,CAAC,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,qBAAqB,CAC5B,UAA6B,EAC7B,uBAAgD;IAEhD,IAAI,UAAU,YAAY,6CAAoB,EAAE;QAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC;QACrE,OAAO,UAAU;YACf,CAAC,CAAC,uBAAuB,CAAC,aAAa,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,IAAI;YAC/D,CAAC,CAAC,SAAS,CAAC;KACf;IAED,IAAI,UAAU,YAAY,6CAAoB,EAAE;QAC9C,OAAO,qBAAqB,CAC1B,UAAU,CAAC,UAAU,EAAE,EACvB,uBAAuB,CACxB,CAAC;KACH;IAED,IAAI,UAAU,YAAY,4CAAmB,EAAE;QAC7C,MAAM,QAAQ,GAAG,qBAAqB,CACpC,UAAU,CAAC,UAAU,EAAE,EACvB,uBAAuB,CACxB,CAAC;QACF,MAAM,KAAK,GAAG,2BAA2B,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;YACvB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,WAAW,GAAyB,QAAQ,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC9B,OAAO,SAAS,CAAC;aAClB;YAED,WAAW,GAAG,4BAA4B,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,SAAS,CAAC;aAClB;SACF;QAED,OAAO,WAAW,CAAC;KACpB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAuB,EACvB,eAAuB,EACvB,uBAAgD;IAEhD,IAAI,IAAI,YAAY,4CAAmB,EAAE;QACvC,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE;YACT,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAC/B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,eAAe,CACnD,CAAC;YAEF,IAAI,SAAS,IAAI,CAAC,EAAE;gBAClB,IAAI,WAAW,GAAG,qBAAqB,CACrC,IAAI,CAAC,UAAU,EAAE,EACjB,uBAAuB,CACxB,CAAC;gBAEF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE;oBAC5C,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;wBAC9C,OAAO,SAAS,CAAC;qBAClB;oBAED,WAAW,GAAG,4BAA4B,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;iBAC/D;gBAED,OAAO,WAAW,CAAC;aACpB;SACF;KACF;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,KAAK,YAAY,4BAAiB,EAAE;YACtC,MAAM,YAAY,GAAG,6BAA6B,CAChD,KAAK,EACL,eAAe,EACf,uBAAuB,CACxB,CAAC;YACF,IAAI,YAAY,EAAE;gBAChB,OAAO,YAAY,CAAC;aACrB;SACF;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAY,EACZ,cAA6B;IAE7B,OAAO,GAAG,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACjD,CAAC;AAED,SAAS,0BAA0B,CACjC,IAAY,EACZ,SAAkC;IAElC,MAAM,IAAI,GAAG,kDAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;QAC3B,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,QAAQ,EAAE,CAAC;IAC9E,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzE,CAAC;AAED,SAAS,wBAAwB,CAC/B,UAAmC,EACnC,SAAkC;IAElC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;QAC7B,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,QAAQ,GACZ,UAAU,CAAC,IAAI,KAAK,UAAU;QAC5B,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE;QAC5D,CAAC,CAAC,GAAG,mBAAmB,CACpB,UAAU,CAAC,IAAI,EACf,CAAC,UAAU,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CAC1C,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,EAAE,CAC9D,CACF,KAAK,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;IAEhD,OAAO,SAAS;QACd,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC;QACrD,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,aAAa,EACb,SAAkC;IAElC,IAAI,CAAC,aAAa,EAAE;QAClB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;IACxC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzE,CAAC;AASD,SAAS,mBAAmB,CAC1B,MAAoB,EACpB,YAAoB;IAEpB,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,wBAA2C,CAAC;IAEhD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,YAAY,EAAE;YAC3D,MAAM;SACP;QAED,IACE,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,EAAE;YACrC,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,OAAO,EAC1C;YACA,SAAS;SACV;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,IAAI,EAAE;YAC3C,KAAK,CAAC,IAAI,CACR,wBAAwB,EAAE,IAAI,KAAK,4CAAmB,CAAC,UAAU;gBAC/D,CAAC,CAAC;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,wBAAwB,CAAC,IAAI,IAAI,SAAS;oBAChD,aAAa,EAAE,CAAC;oBAChB,eAAe,EAAE,wBAAwB,CAAC,UAAU;iBACrD;gBACH,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,CACxC,CAAC;SACH;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,KAAK,EAAE;YACnD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;SACjD;aAAM,IACL,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,IAAI;YACvC,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,KAAK,EACxC;YACA,KAAK,CAAC,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,4CAAmB,CAAC,IAAI,EAAE;YAClD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,YAAY,EAAE,IAAI,KAAK,UAAU,EAAE;gBACrC,YAAY,CAAC,aAAa,IAAI,CAAC,CAAC;aACjC;SACF;QAED,wBAAwB,GAAG,KAAK,CAAC;KAClC;IAED,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE;YAChC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,yBAAyB,CAChC,UAAqC;IAErC,OAAO,mBAAmB,CACxB,UAAU,CAAC,IAAI,EACf,CAAC,UAAU,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CAC1C,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,EAAE,CAC9D,CACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAA4B,EAC5B,uBAAgD,EAChD,WAAsB,EACtB,SAAkC;IAElC,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QAClE,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,6BAA6B,CAChD,SAAS,EACT,WAAW,CAAC,eAAe,EAC3B,uBAAuB,CACxB,CAAC;IACF,IAAI,CAAC,CAAC,YAAY,YAAY,wCAAiB,CAAC,EAAE;QAChD,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5E,IACE,gBAAgB,EAAE,IAAI,KAAK,UAAU;QACrC,CAAC,gBAAgB,CAAC,aAAa,EAC/B;QACA,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CACjE,GAAG,KAAK,IAAI,CACb;QACC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ;QACzC,CAAC,CAAC,GAAG,KAAK,KAAK,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;IAC3D,MAAM,cAAc,GAClB,gBAAgB,CAAC,qBAAqB,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAEtE,OAAO;QACL,KAAK;QACL,aAAa,EAAE,SAAS;YACtB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC3D,CAAC,CAAC,QAAQ;QACZ,oBAAoB,EAAE,WAAW,CAAC,aAAa;QAC/C,oBAAoB,EAAE,cAAc;YAClC,CAAC,CAAC,IAAA,uCAAoB,EAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;gBACrD,cAAc,CAAC,KAAK,CAAC,QAAQ;YAC/B,CAAC,CAAC,SAAS;QACb,4BAA4B,EAAE,cAAc;YAC1C,CAAC,CAAC,IAAA,uCAAoB,EAAC,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC;YAC/D,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,SAA4B,EAC5B,uBAAgD,EAChD,MAAoB,EACpB,YAAoB,EACpB,SAAkC;IAElC,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC9D,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QACtB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,UAAU,GAAG,qBAAqB,CACtC,SAAS,EACT,uBAAuB,EACvB,WAAW,EACX,SAAS,CACV,CAAC;IACF,IAAI,UAAU,EAAE;QACd,OAAO,UAAU,CAAC;KACnB;IAED,MAAM,IAAI,GAAG,kDAAsB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;QAC3B,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,aAAa,CAAC,QAAQ,EAAE,CAAC;IACvD,OAAO;QACL,KAAK;QACL,aAAa,EAAE,SAAS;YACtB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC1C,CAAC,CAAC,QAAQ;QACZ,oBAAoB,EAAE,WAAW,CAAC,aAAa;QAC/C,oBAAoB,EAAE,cAAc;YAClC,CAAC,CAAC,IAAA,uCAAoB,EAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC;gBAC5D,cAAc,CAAC,YAAY,EAAE,QAAQ;gBACrC,cAAc,CAAC,IAAI;YACrB,CAAC,CAAC,SAAS;QACb,4BAA4B,EAAE,cAAc;YAC1C,CAAC,CAAC,IAAA,uCAAoB,EAAC,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC;YAC/D,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AACD,SAAS,cAAc,CACrB,IAAY,EACZ,SAAkC;IAElC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,IAAI;QACX,UAAU;QACV,YAAY,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;QACnC,aAAa,EAAE,0BAA0B,CAAC,IAAI,EAAE,SAAS,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,UAAmC,EACnC,SAAkC;IAElC,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;QAClC,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,UAAU,CAAC,IAAI;YACtB,cAAc,EAAE,oBAAoB,CAAC,UAAU,CAAC,SAAS,CAAC;YAC1D,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC;YAChD,aAAa,EAAE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC;SAC/D,CAAC;KACH;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEzD,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,UAAU,CAAC,IAAI;QACtB,UAAU;QACV,YAAY,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;QACnC,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzE,cAAc,EAAE,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3D,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC;QACjD,aAAa,EAAE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAA2B,EAC3B,eAAuB,EACvB,SAA4B;IAE5B,MAAM,cAAc,GAAG,IAAI,8BAAkB,CAAC,MAAM,CAAC,CAAC;IACtD,cAAc,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC;QACtC,4CAAmB,CAAC,gBAAgB;QACpC,4CAAmB,CAAC,mBAAmB;KACxC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC,iBAAiB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,sBAAsB,CAC7B,cAA2C;IAE3C,OAAO,cAAc,CAAC,GAAG,CAAC,4CAAmB,CAAC,mBAAmB,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,2BAA2B,CAClC,cAA2C;IAE3C,OAAO,cAAc,CAAC,GAAG,CAAC,4CAAmB,CAAC,gBAAgB,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,2BAA2B,CAClC,eAA2C;IAE3C,OAAO,eAAe,CAAC,GAAG,CAAC,4CAAmB,CAAC,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED,MAAa,yBAAyB;IAC7B,MAAM,CAAC,QAAQ,CACpB,KAAa,EACb,YAAoB,EACpB,UAA4C,EAAE;QAE9C,MAAM,uBAAuB,GAC3B,OAAO,CAAC,uBAAuB;YAC/B,oDAAuB,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,qBAAqB,CACtC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,SAAS,CACjB,CAAC;QACF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QACxC,MAAM,UAAU,GAAG,eAAe,CAChC,MAAM,CAAC,SAAS,EAChB,uBAAuB,EACvB,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,OAAO,CAAC,SAAS,CAClB,CAAC;QAEF,MAAM,eAAe,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,eAAe,EAAE;YACnB,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,EAAE;gBACV,OAAO;oBACL,KAAK,EAAE,EAAE;oBACT,WAAW,EAAE,YAAY;oBACzB,SAAS,EAAE,YAAY;oBACvB,UAAU;iBACX,CAAC;aACH;YAED,MAAM,YAAY,GAAG,6BAA6B,CAChD,MAAM,CAAC,SAAS,EAChB,eAAe,CAAC,eAAe,EAC/B,uBAAuB,CACxB,CAAC;YACF,IAAI,CAAC,CAAC,YAAY,YAAY,wCAAiB,CAAC,EAAE;gBAChD,OAAO;oBACL,KAAK,EAAE,EAAE;oBACT,WAAW,EAAE,KAAK,CAAC,IAAI;oBACvB,SAAS,EAAE,KAAK,CAAC,EAAE;oBACnB,UAAU;iBACX,CAAC;aACH;YAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,YAAY;iBACvB,oBAAoB,EAAE;iBACtB,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;iBAChE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;iBACvE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhE,OAAO;gBACL,KAAK;gBACL,WAAW,EAAE,KAAK,CAAC,IAAI;gBACvB,SAAS,EAAE,KAAK,CAAC,EAAE;gBACnB,UAAU;aACX,CAAC;SACH;QAED,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACpE,IAAI,aAAa,IAAI,2BAA2B,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACnE,MAAM,WAAW,GAAG,iBAAiB,CACnC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,CAClD,CAAC;YACF,MAAM,KAAK,GAAG,kDAAsB,CAAC,uBAAuB,EAAE;iBAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;iBACtD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;iBACvE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,OAAO;oBACL,KAAK;oBACL,WAAW,EAAE,aAAa,CAAC,IAAI;oBAC/B,SAAS,EAAE,aAAa,CAAC,EAAE;oBAC3B,UAAU;iBACX,CAAC;aACH;SACF;QAED,MAAM,KAAK,GAAG,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,EAAE;YAC1D,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,YAAY;gBACzB,SAAS,EAAE,YAAY;gBACvB,UAAU;aACX,CAAC;SACH;QAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAA0B,uBAAuB;aACzD,cAAc,EAAE;aAChB,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,aAAsB;YAC5B,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;YACtC,aAAa,EAAE,sBAAsB,CACnC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,aAAa,EACxB,OAAO,CAAC,SAAS,CAClB;SACF,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;aACvE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,OAAO;YACL,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,IAAI;YACvB,SAAS,EAAE,KAAK,CAAC,EAAE;YACnB,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AArHD,8DAqHC","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"]}
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 emptyExpressionStarters?: Array<string>;\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\nconst unsupportedPrimitiveMethodFunctionNames = new Set([\n \"NAME\",\n \"GUID\",\n \"IFCCLASS\",\n \"DESCRIPTION\",\n \"VALUE\",\n]);\n\nconst preferredMethodLabels = new Map<string, string>([\n [\"MAP\", \"map\"],\n [\"CHOOSE\", \"choose\"],\n [\"AT\", \"at\"],\n [\"IF\", \"if\"],\n [\"ROUND\", \"round\"],\n [\"NAME\", \"name\"],\n [\"GUID\", \"guid\"],\n [\"IFCCLASS\", \"ifcClass\"],\n [\"DESCRIPTION\", \"description\"],\n [\"VALUE\", \"value\"],\n [\"PROPERTYSET\", \"propertySet\"],\n [\"PROPERTY\", \"property\"],\n [\"TYPE\", \"type\"],\n [\"NOT\", \"not\"],\n [\"TOSTRING\", \"toString\"],\n [\"TONUMERIC\", \"toNumeric\"],\n [\"TONUMBER\", \"toNumber\"],\n [\"TOBOOLEAN\", \"toBoolean\"],\n [\"TOLOGICAL\", \"toLogical\"],\n [\"NOTFOUNDASUNKNOWN\", \"notFoundAsUnknown\"],\n [\"TOIFCDATE\", \"toIfcDate\"],\n [\"TOIFCTIME\", \"toIfcTime\"],\n [\"TOIFCDATETIME\", \"toIfcDateTime\"],\n [\"TOIFCDURATION\", \"toIfcDuration\"],\n [\"TOIFCTIMESTAMP\", \"toIfcTimeStamp\"],\n [\"ADDDURATION\", \"addDuration\"],\n [\"TOLOWERCASE\", \"toLowerCase\"],\n [\"TOUPPERCASE\", \"toUpperCase\"],\n [\"SUBSTRING\", \"substring\"],\n [\"SPLIT\", \"split\"],\n [\"EXISTS\", \"exists\"],\n [\"AND\", \"and\"],\n [\"OR\", \"or\"],\n [\"XOR\", \"xor\"],\n [\"IMPLIES\", \"implies\"],\n [\"EQUALS\", \"equals\"],\n [\"GREATERTHAN\", \"greaterThan\"],\n [\"GREATERTHANOREQUAL\", \"greaterThanOrEqual\"],\n [\"LESSTHAN\", \"lessThan\"],\n [\"LESSTHANOREQUAL\", \"lessThanOrEqual\"],\n [\"CONTAINS\", \"contains\"],\n [\"MATCHES\", \"matches\"],\n [\"REGEXCONTAINS\", \"regexContains\"],\n [\"REGEXMATCHES\", \"regexMatches\"],\n [\"REPLACE\", \"replace\"],\n [\"REGEXREPLACE\", \"regexReplace\"],\n]);\n\nconst emptyExpressionStarterFunctionNames = [\n \"IF\",\n \"EXISTS\",\n \"ROUND\",\n \"CONTAINS\",\n \"MATCHES\",\n \"REPLACE\",\n \"TOSTRING\",\n \"TONUMERIC\",\n \"TOBOOLEAN\",\n] as const;\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 isEmptyExpressionInput(input: string): boolean {\n return input.trim().length === 0;\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 displayName = name\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(displayName)}: ${\n documentation.fallback\n }`;\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 const key = documentation?.key ?? `builtin.${name}.summary`;\n const fallback =\n documentation?.fallback ??\n `${name}: built-in value from the evaluation context`;\n return localizer ? localizer.t(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 label = name\n): CompletionItem {\n const insertText = toFunctionInsertText(label);\n\n return {\n kind: \"builtinFunction\",\n label,\n insertText,\n cursorOffset: insertText.length - 1,\n documentation: buildFunctionDocumentation(name, localizer, label),\n };\n}\n\nfunction getPreferredMethodLabel(name: string): string {\n return preferredMethodLabels.get(name) ?? name;\n}\n\nfunction isApplicablePrimitiveMethodFunction(\n name: string,\n receiverType: ExprType\n): boolean {\n if (unsupportedPrimitiveMethodFunctionNames.has(name)) {\n return false;\n }\n\n const func = IfcExpressionFunctions.getFunction(name);\n const firstArgument = func?.getFormalArguments()[0];\n if (!func || !firstArgument) {\n return false;\n }\n\n const firstArgumentType = firstArgument.getType();\n return (\n firstArgumentType.isAssignableFrom(receiverType) ||\n firstArgumentType.overlapsWith(receiverType)\n );\n}\n\nfunction getPrimitiveMethodItems(\n receiverType: ExprType,\n localizer?: DocumentationLocalizer\n): Array<CompletionItem> {\n return IfcExpressionFunctions.getBuiltinFunctionNames()\n .filter((name) => isApplicablePrimitiveMethodFunction(name, receiverType))\n .map((name) =>\n toFunctionItem(name, localizer, getPreferredMethodLabel(name))\n );\n}\n\nfunction toBuiltinRootItem(\n name: string,\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer\n): CompletionItem | undefined {\n const normalizedName = name.startsWith(\"$\") ? name : `${name}`;\n const definition = builtinVariableRegistry.getDefinition(normalizedName);\n if (!definition) {\n return undefined;\n }\n\n return {\n kind: \"builtinRoot\",\n label: toBuiltinLabel(definition.name),\n documentation: buildRootDocumentation(\n definition.name,\n definition.documentation,\n localizer\n ),\n };\n}\n\nfunction toEmptyExpressionStarterItem(\n name: string,\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer\n): CompletionItem | undefined {\n if (name.startsWith(\"$\")) {\n return toBuiltinRootItem(name, builtinVariableRegistry, localizer);\n }\n\n return IfcExpressionFunctions.getFunction(name)\n ? toFunctionItem(name, localizer)\n : undefined;\n}\n\nfunction getEmptyExpressionStarterItems(\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer,\n starterNames: Array<string> = [\n ...builtinVariableRegistry\n .getDefinitions()\n .map((definition) => toBuiltinLabel(definition.name)),\n ...emptyExpressionStarterFunctionNames,\n ]\n): Array<CompletionItem> {\n return starterNames\n .map((name) =>\n toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer)\n )\n .filter((item): item is CompletionItem => item !== undefined);\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\n if (isEmptyExpressionInput(input)) {\n return {\n items: getEmptyExpressionStarterItems(\n builtinVariableRegistry,\n options.localizer,\n options.emptyExpressionStarters\n ),\n replaceFrom: 0,\n replaceTo: input.length,\n };\n }\n\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 const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));\n const items = (\n receiverType instanceof ContextObjectType\n ? receiverType\n .getMemberDefinitions()\n .map((definition) => toMemberItem(definition, options.localizer))\n : receiverType\n ? getPrimitiveMethodItems(receiverType, 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 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"]}
@@ -21,6 +21,72 @@ function toCompletionTypeName(type) {
21
21
  function isChainableType(type) {
22
22
  return type instanceof ContextObjectType;
23
23
  }
24
+ const unsupportedPrimitiveMethodFunctionNames = new Set([
25
+ "NAME",
26
+ "GUID",
27
+ "IFCCLASS",
28
+ "DESCRIPTION",
29
+ "VALUE",
30
+ ]);
31
+ const preferredMethodLabels = new Map([
32
+ ["MAP", "map"],
33
+ ["CHOOSE", "choose"],
34
+ ["AT", "at"],
35
+ ["IF", "if"],
36
+ ["ROUND", "round"],
37
+ ["NAME", "name"],
38
+ ["GUID", "guid"],
39
+ ["IFCCLASS", "ifcClass"],
40
+ ["DESCRIPTION", "description"],
41
+ ["VALUE", "value"],
42
+ ["PROPERTYSET", "propertySet"],
43
+ ["PROPERTY", "property"],
44
+ ["TYPE", "type"],
45
+ ["NOT", "not"],
46
+ ["TOSTRING", "toString"],
47
+ ["TONUMERIC", "toNumeric"],
48
+ ["TONUMBER", "toNumber"],
49
+ ["TOBOOLEAN", "toBoolean"],
50
+ ["TOLOGICAL", "toLogical"],
51
+ ["NOTFOUNDASUNKNOWN", "notFoundAsUnknown"],
52
+ ["TOIFCDATE", "toIfcDate"],
53
+ ["TOIFCTIME", "toIfcTime"],
54
+ ["TOIFCDATETIME", "toIfcDateTime"],
55
+ ["TOIFCDURATION", "toIfcDuration"],
56
+ ["TOIFCTIMESTAMP", "toIfcTimeStamp"],
57
+ ["ADDDURATION", "addDuration"],
58
+ ["TOLOWERCASE", "toLowerCase"],
59
+ ["TOUPPERCASE", "toUpperCase"],
60
+ ["SUBSTRING", "substring"],
61
+ ["SPLIT", "split"],
62
+ ["EXISTS", "exists"],
63
+ ["AND", "and"],
64
+ ["OR", "or"],
65
+ ["XOR", "xor"],
66
+ ["IMPLIES", "implies"],
67
+ ["EQUALS", "equals"],
68
+ ["GREATERTHAN", "greaterThan"],
69
+ ["GREATERTHANOREQUAL", "greaterThanOrEqual"],
70
+ ["LESSTHAN", "lessThan"],
71
+ ["LESSTHANOREQUAL", "lessThanOrEqual"],
72
+ ["CONTAINS", "contains"],
73
+ ["MATCHES", "matches"],
74
+ ["REGEXCONTAINS", "regexContains"],
75
+ ["REGEXMATCHES", "regexMatches"],
76
+ ["REPLACE", "replace"],
77
+ ["REGEXREPLACE", "regexReplace"],
78
+ ]);
79
+ const emptyExpressionStarterFunctionNames = [
80
+ "IF",
81
+ "EXISTS",
82
+ "ROUND",
83
+ "CONTAINS",
84
+ "MATCHES",
85
+ "REPLACE",
86
+ "TOSTRING",
87
+ "TONUMERIC",
88
+ "TOBOOLEAN",
89
+ ];
24
90
  function isExtendableTokenType(tokenType) {
25
91
  return tokenType === IfcExpressionParser.IDENTIFIER;
26
92
  }
@@ -247,19 +313,22 @@ function findReceiverTypeForMemberSlot(node, startTokenIndex, builtinVariableReg
247
313
  }
248
314
  return undefined;
249
315
  }
316
+ function isEmptyExpressionInput(input) {
317
+ return input.trim().length === 0;
318
+ }
250
319
  function toFunctionInsertText(name) {
251
320
  return `${name}()`;
252
321
  }
253
322
  function buildSignatureLabel(name, argumentLabels) {
254
323
  return `${name}(${argumentLabels.join(", ")})`;
255
324
  }
256
- function buildFunctionDocumentation(name, localizer) {
325
+ function buildFunctionDocumentation(name, localizer, displayName = name) {
257
326
  const func = IfcExpressionFunctions.getFunction(name);
258
327
  const documentation = func?.getDocumentation();
259
328
  if (!func || !documentation) {
260
329
  return undefined;
261
330
  }
262
- const fallback = `${func.getSignatureLabel(name)}: ${documentation.fallback}`;
331
+ const fallback = `${func.getSignatureLabel(displayName)}: ${documentation.fallback}`;
263
332
  return localizer ? localizer.t(documentation.key, fallback) : fallback;
264
333
  }
265
334
  function buildMemberDocumentation(definition, localizer) {
@@ -274,11 +343,10 @@ function buildMemberDocumentation(definition, localizer) {
274
343
  : fallback;
275
344
  }
276
345
  function buildRootDocumentation(name, documentation, localizer) {
277
- if (!documentation) {
278
- return undefined;
279
- }
280
- const fallback = documentation.fallback;
281
- return localizer ? localizer.t(documentation.key, fallback) : fallback;
346
+ const key = documentation?.key ?? `builtin.${name}.summary`;
347
+ const fallback = documentation?.fallback ??
348
+ `${name}: built-in value from the evaluation context`;
349
+ return localizer ? localizer.t(key, fallback) : fallback;
282
350
  }
283
351
  function findActiveCallFrame(tokens, cursorOffset) {
284
352
  const stack = [];
@@ -392,16 +460,67 @@ function buildActiveHelp(parseTree, builtinVariableRegistry, tokens, cursorOffse
392
460
  : undefined,
393
461
  };
394
462
  }
395
- function toFunctionItem(name, localizer) {
396
- const insertText = toFunctionInsertText(name);
463
+ function toFunctionItem(name, localizer, label = name) {
464
+ const insertText = toFunctionInsertText(label);
397
465
  return {
398
466
  kind: "builtinFunction",
399
- label: name,
467
+ label,
400
468
  insertText,
401
469
  cursorOffset: insertText.length - 1,
402
- documentation: buildFunctionDocumentation(name, localizer),
470
+ documentation: buildFunctionDocumentation(name, localizer, label),
471
+ };
472
+ }
473
+ function getPreferredMethodLabel(name) {
474
+ return preferredMethodLabels.get(name) ?? name;
475
+ }
476
+ function isApplicablePrimitiveMethodFunction(name, receiverType) {
477
+ if (unsupportedPrimitiveMethodFunctionNames.has(name)) {
478
+ return false;
479
+ }
480
+ const func = IfcExpressionFunctions.getFunction(name);
481
+ const firstArgument = func?.getFormalArguments()[0];
482
+ if (!func || !firstArgument) {
483
+ return false;
484
+ }
485
+ const firstArgumentType = firstArgument.getType();
486
+ return (firstArgumentType.isAssignableFrom(receiverType) ||
487
+ firstArgumentType.overlapsWith(receiverType));
488
+ }
489
+ function getPrimitiveMethodItems(receiverType, localizer) {
490
+ return IfcExpressionFunctions.getBuiltinFunctionNames()
491
+ .filter((name) => isApplicablePrimitiveMethodFunction(name, receiverType))
492
+ .map((name) => toFunctionItem(name, localizer, getPreferredMethodLabel(name)));
493
+ }
494
+ function toBuiltinRootItem(name, builtinVariableRegistry, localizer) {
495
+ const normalizedName = name.startsWith("$") ? name : `${name}`;
496
+ const definition = builtinVariableRegistry.getDefinition(normalizedName);
497
+ if (!definition) {
498
+ return undefined;
499
+ }
500
+ return {
501
+ kind: "builtinRoot",
502
+ label: toBuiltinLabel(definition.name),
503
+ documentation: buildRootDocumentation(definition.name, definition.documentation, localizer),
403
504
  };
404
505
  }
506
+ function toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer) {
507
+ if (name.startsWith("$")) {
508
+ return toBuiltinRootItem(name, builtinVariableRegistry, localizer);
509
+ }
510
+ return IfcExpressionFunctions.getFunction(name)
511
+ ? toFunctionItem(name, localizer)
512
+ : undefined;
513
+ }
514
+ function getEmptyExpressionStarterItems(builtinVariableRegistry, localizer, starterNames = [
515
+ ...builtinVariableRegistry
516
+ .getDefinitions()
517
+ .map((definition) => toBuiltinLabel(definition.name)),
518
+ ...emptyExpressionStarterFunctionNames,
519
+ ]) {
520
+ return starterNames
521
+ .map((name) => toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer))
522
+ .filter((item) => item !== undefined);
523
+ }
405
524
  function toMemberItem(definition, localizer) {
406
525
  if (definition.kind === "property") {
407
526
  return {
@@ -445,6 +564,13 @@ export class IfcExpressionAutocomplete {
445
564
  static complete(input, cursorOffset, options = {}) {
446
565
  const builtinVariableRegistry = options.builtinVariableRegistry ??
447
566
  BuiltinVariableRegistry.getDefaultRegistry();
567
+ if (isEmptyExpressionInput(input)) {
568
+ return {
569
+ items: getEmptyExpressionStarterItems(builtinVariableRegistry, options.localizer, options.emptyExpressionStarters),
570
+ replaceFrom: 0,
571
+ replaceTo: input.length,
572
+ };
573
+ }
448
574
  const parsed = parseAutocompleteInput(input, cursorOffset);
449
575
  const candidates = collectRuleCandidates(parsed.parser, parsed.caretTokenIndex, parsed.parseTree);
450
576
  const ruleCandidates = candidates.rules;
@@ -461,18 +587,14 @@ export class IfcExpressionAutocomplete {
461
587
  };
462
588
  }
463
589
  const receiverType = findReceiverTypeForMemberSlot(parsed.parseTree, memberCandidate.startTokenIndex, builtinVariableRegistry);
464
- if (!(receiverType instanceof ContextObjectType)) {
465
- return {
466
- items: [],
467
- replaceFrom: range.from,
468
- replaceTo: range.to,
469
- activeHelp,
470
- };
471
- }
472
590
  const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));
473
- const items = receiverType
474
- .getMemberDefinitions()
475
- .map((definition) => toMemberItem(definition, options.localizer))
591
+ const items = (receiverType instanceof ContextObjectType
592
+ ? receiverType
593
+ .getMemberDefinitions()
594
+ .map((definition) => toMemberItem(definition, options.localizer))
595
+ : receiverType
596
+ ? getPrimitiveMethodItems(receiverType, options.localizer)
597
+ : [])
476
598
  .filter((item) => normalizeForMatch(item.label).startsWith(typedPrefix))
477
599
  .sort((left, right) => left.label.localeCompare(right.label));
478
600
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["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"]}
1
+ {"version":3,"sources":["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 emptyExpressionStarters?: Array<string>;\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\nconst unsupportedPrimitiveMethodFunctionNames = new Set([\n \"NAME\",\n \"GUID\",\n \"IFCCLASS\",\n \"DESCRIPTION\",\n \"VALUE\",\n]);\n\nconst preferredMethodLabels = new Map<string, string>([\n [\"MAP\", \"map\"],\n [\"CHOOSE\", \"choose\"],\n [\"AT\", \"at\"],\n [\"IF\", \"if\"],\n [\"ROUND\", \"round\"],\n [\"NAME\", \"name\"],\n [\"GUID\", \"guid\"],\n [\"IFCCLASS\", \"ifcClass\"],\n [\"DESCRIPTION\", \"description\"],\n [\"VALUE\", \"value\"],\n [\"PROPERTYSET\", \"propertySet\"],\n [\"PROPERTY\", \"property\"],\n [\"TYPE\", \"type\"],\n [\"NOT\", \"not\"],\n [\"TOSTRING\", \"toString\"],\n [\"TONUMERIC\", \"toNumeric\"],\n [\"TONUMBER\", \"toNumber\"],\n [\"TOBOOLEAN\", \"toBoolean\"],\n [\"TOLOGICAL\", \"toLogical\"],\n [\"NOTFOUNDASUNKNOWN\", \"notFoundAsUnknown\"],\n [\"TOIFCDATE\", \"toIfcDate\"],\n [\"TOIFCTIME\", \"toIfcTime\"],\n [\"TOIFCDATETIME\", \"toIfcDateTime\"],\n [\"TOIFCDURATION\", \"toIfcDuration\"],\n [\"TOIFCTIMESTAMP\", \"toIfcTimeStamp\"],\n [\"ADDDURATION\", \"addDuration\"],\n [\"TOLOWERCASE\", \"toLowerCase\"],\n [\"TOUPPERCASE\", \"toUpperCase\"],\n [\"SUBSTRING\", \"substring\"],\n [\"SPLIT\", \"split\"],\n [\"EXISTS\", \"exists\"],\n [\"AND\", \"and\"],\n [\"OR\", \"or\"],\n [\"XOR\", \"xor\"],\n [\"IMPLIES\", \"implies\"],\n [\"EQUALS\", \"equals\"],\n [\"GREATERTHAN\", \"greaterThan\"],\n [\"GREATERTHANOREQUAL\", \"greaterThanOrEqual\"],\n [\"LESSTHAN\", \"lessThan\"],\n [\"LESSTHANOREQUAL\", \"lessThanOrEqual\"],\n [\"CONTAINS\", \"contains\"],\n [\"MATCHES\", \"matches\"],\n [\"REGEXCONTAINS\", \"regexContains\"],\n [\"REGEXMATCHES\", \"regexMatches\"],\n [\"REPLACE\", \"replace\"],\n [\"REGEXREPLACE\", \"regexReplace\"],\n]);\n\nconst emptyExpressionStarterFunctionNames = [\n \"IF\",\n \"EXISTS\",\n \"ROUND\",\n \"CONTAINS\",\n \"MATCHES\",\n \"REPLACE\",\n \"TOSTRING\",\n \"TONUMERIC\",\n \"TOBOOLEAN\",\n] as const;\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 isEmptyExpressionInput(input: string): boolean {\n return input.trim().length === 0;\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 displayName = name\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(displayName)}: ${\n documentation.fallback\n }`;\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 const key = documentation?.key ?? `builtin.${name}.summary`;\n const fallback =\n documentation?.fallback ??\n `${name}: built-in value from the evaluation context`;\n return localizer ? localizer.t(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 label = name\n): CompletionItem {\n const insertText = toFunctionInsertText(label);\n\n return {\n kind: \"builtinFunction\",\n label,\n insertText,\n cursorOffset: insertText.length - 1,\n documentation: buildFunctionDocumentation(name, localizer, label),\n };\n}\n\nfunction getPreferredMethodLabel(name: string): string {\n return preferredMethodLabels.get(name) ?? name;\n}\n\nfunction isApplicablePrimitiveMethodFunction(\n name: string,\n receiverType: ExprType\n): boolean {\n if (unsupportedPrimitiveMethodFunctionNames.has(name)) {\n return false;\n }\n\n const func = IfcExpressionFunctions.getFunction(name);\n const firstArgument = func?.getFormalArguments()[0];\n if (!func || !firstArgument) {\n return false;\n }\n\n const firstArgumentType = firstArgument.getType();\n return (\n firstArgumentType.isAssignableFrom(receiverType) ||\n firstArgumentType.overlapsWith(receiverType)\n );\n}\n\nfunction getPrimitiveMethodItems(\n receiverType: ExprType,\n localizer?: DocumentationLocalizer\n): Array<CompletionItem> {\n return IfcExpressionFunctions.getBuiltinFunctionNames()\n .filter((name) => isApplicablePrimitiveMethodFunction(name, receiverType))\n .map((name) =>\n toFunctionItem(name, localizer, getPreferredMethodLabel(name))\n );\n}\n\nfunction toBuiltinRootItem(\n name: string,\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer\n): CompletionItem | undefined {\n const normalizedName = name.startsWith(\"$\") ? name : `${name}`;\n const definition = builtinVariableRegistry.getDefinition(normalizedName);\n if (!definition) {\n return undefined;\n }\n\n return {\n kind: \"builtinRoot\",\n label: toBuiltinLabel(definition.name),\n documentation: buildRootDocumentation(\n definition.name,\n definition.documentation,\n localizer\n ),\n };\n}\n\nfunction toEmptyExpressionStarterItem(\n name: string,\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer\n): CompletionItem | undefined {\n if (name.startsWith(\"$\")) {\n return toBuiltinRootItem(name, builtinVariableRegistry, localizer);\n }\n\n return IfcExpressionFunctions.getFunction(name)\n ? toFunctionItem(name, localizer)\n : undefined;\n}\n\nfunction getEmptyExpressionStarterItems(\n builtinVariableRegistry: BuiltinVariableRegistry,\n localizer?: DocumentationLocalizer,\n starterNames: Array<string> = [\n ...builtinVariableRegistry\n .getDefinitions()\n .map((definition) => toBuiltinLabel(definition.name)),\n ...emptyExpressionStarterFunctionNames,\n ]\n): Array<CompletionItem> {\n return starterNames\n .map((name) =>\n toEmptyExpressionStarterItem(name, builtinVariableRegistry, localizer)\n )\n .filter((item): item is CompletionItem => item !== undefined);\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\n if (isEmptyExpressionInput(input)) {\n return {\n items: getEmptyExpressionStarterItems(\n builtinVariableRegistry,\n options.localizer,\n options.emptyExpressionStarters\n ),\n replaceFrom: 0,\n replaceTo: input.length,\n };\n }\n\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 const typedPrefix = normalizeForMatch(input.slice(range.from, range.to));\n const items = (\n receiverType instanceof ContextObjectType\n ? receiverType\n .getMemberDefinitions()\n .map((definition) => toMemberItem(definition, options.localizer))\n : receiverType\n ? getPrimitiveMethodItems(receiverType, 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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ifc-expressions",
3
- "version": "3.0.0-beta.0",
3
+ "version": "3.0.0-beta.2",
4
4
  "description": "Parsing and evaluation of IFC expressions",
5
5
  "main": "dist/cjs/IfcExpression.js",
6
6
  "module": "dist/mjs/IfcExpression.js",