ifc-expressions 2.3.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +255 -30
  2. package/dist/IfcExpression.d.ts +24 -26
  3. package/dist/IfcExpressionErrorListener.d.ts +3 -3
  4. package/dist/IfcExpressionOptions.d.ts +4 -0
  5. package/dist/autocomplete/CompletionItem.d.ts +24 -0
  6. package/dist/autocomplete/IfcExpressionAutocomplete.d.ts +11 -0
  7. package/dist/builtin/BuiltinRuntimeValueConverter.d.ts +7 -0
  8. package/dist/builtin/BuiltinVariableRegistry.d.ts +50 -0
  9. package/dist/cjs/IfcExpression.js +112 -37
  10. package/dist/cjs/IfcExpression.js.map +1 -1
  11. package/dist/cjs/IfcExpressionErrorListener.js +3 -8
  12. package/dist/cjs/IfcExpressionErrorListener.js.map +1 -1
  13. package/dist/cjs/IfcExpressionOptions.js +3 -0
  14. package/dist/cjs/IfcExpressionOptions.js.map +1 -0
  15. package/dist/cjs/autocomplete/CompletionItem.js +3 -0
  16. package/dist/cjs/autocomplete/CompletionItem.js.map +1 -0
  17. package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js +654 -0
  18. package/dist/cjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
  19. package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js +124 -0
  20. package/dist/cjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
  21. package/dist/cjs/builtin/BuiltinVariableRegistry.js +405 -0
  22. package/dist/cjs/builtin/BuiltinVariableRegistry.js.map +1 -0
  23. package/dist/cjs/compiler/ExprCompiler.js +44 -41
  24. package/dist/cjs/compiler/ExprCompiler.js.map +1 -1
  25. package/dist/cjs/compiler/ExprManager.js.map +1 -1
  26. package/dist/cjs/compiler/IfcExpressionValidationListener.js +85 -25
  27. package/dist/cjs/compiler/IfcExpressionValidationListener.js.map +1 -1
  28. package/dist/cjs/compiler/TypeManager.js.map +1 -1
  29. package/dist/cjs/context/IfcExpressionContext.js.map +1 -1
  30. package/dist/cjs/context/NopContext.js +3 -0
  31. package/dist/cjs/context/NopContext.js.map +1 -1
  32. package/dist/cjs/documentation/Documentation.js +11 -0
  33. package/dist/cjs/documentation/Documentation.js.map +1 -0
  34. package/dist/cjs/error/ExpressionTypeError.js.map +1 -1
  35. package/dist/cjs/error/IfcExpressionBuiltinConfigException.js +10 -0
  36. package/dist/cjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
  37. package/dist/cjs/error/InvalidSyntaxException.js.map +1 -1
  38. package/dist/cjs/error/NoSuchFunctionException.js.map +1 -1
  39. package/dist/cjs/error/NoSuchMemberException.js +13 -0
  40. package/dist/cjs/error/NoSuchMemberException.js.map +1 -0
  41. package/dist/cjs/error/ValidationException.js.map +1 -1
  42. package/dist/cjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
  43. package/dist/cjs/expression/ExprKind.js +3 -0
  44. package/dist/cjs/expression/ExprKind.js.map +1 -1
  45. package/dist/cjs/expression/function/Func.js +18 -14
  46. package/dist/cjs/expression/function/Func.js.map +1 -1
  47. package/dist/cjs/expression/function/FuncArg.js +11 -5
  48. package/dist/cjs/expression/function/FuncArg.js.map +1 -1
  49. package/dist/cjs/expression/function/IfcExpressionFunctions.js +198 -42
  50. package/dist/cjs/expression/function/IfcExpressionFunctions.js.map +1 -1
  51. package/dist/cjs/expression/function/impl/CHOOSE.js.map +1 -1
  52. package/dist/cjs/expression/function/impl/IF.js.map +1 -1
  53. package/dist/cjs/expression/function/impl/MAP.js.map +1 -1
  54. package/dist/cjs/expression/function/impl/ReplacePattern.js +20 -2
  55. package/dist/cjs/expression/function/impl/ReplacePattern.js.map +1 -1
  56. package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js +59 -0
  57. package/dist/cjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
  58. package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js +34 -0
  59. package/dist/cjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
  60. package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js +29 -0
  61. package/dist/cjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
  62. package/dist/cjs/gen/parser/IfcExpressionLexer.js +126 -104
  63. package/dist/cjs/gen/parser/IfcExpressionLexer.js.map +1 -1
  64. package/dist/cjs/gen/parser/IfcExpressionListener.js +7 -4
  65. package/dist/cjs/gen/parser/IfcExpressionListener.js.map +1 -1
  66. package/dist/cjs/gen/parser/IfcExpressionParser.js +739 -682
  67. package/dist/cjs/gen/parser/IfcExpressionParser.js.map +1 -1
  68. package/dist/cjs/gen/parser/IfcExpressionVisitor.js +4 -4
  69. package/dist/cjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
  70. package/dist/cjs/index.js +4 -1
  71. package/dist/cjs/index.js.map +1 -1
  72. package/dist/cjs/type/ContextObjectType.js +45 -0
  73. package/dist/cjs/type/ContextObjectType.js.map +1 -0
  74. package/dist/cjs/type/Types.js +4 -6
  75. package/dist/cjs/type/Types.js.map +1 -1
  76. package/dist/cjs/value/ContextObjectValue.js +23 -0
  77. package/dist/cjs/value/ContextObjectValue.js.map +1 -0
  78. package/dist/cjs/value/ExpressionValue.js.map +1 -1
  79. package/dist/cjs/value/Value.js.map +1 -1
  80. package/dist/compiler/ExprCompiler.d.ts +8 -3
  81. package/dist/compiler/ExprManager.d.ts +1 -1
  82. package/dist/compiler/IfcExpressionValidationListener.d.ts +9 -3
  83. package/dist/compiler/TypeManager.d.ts +1 -1
  84. package/dist/context/IfcExpressionContext.d.ts +3 -4
  85. package/dist/context/NopContext.d.ts +1 -0
  86. package/dist/documentation/Documentation.d.ts +12 -0
  87. package/dist/error/ExpressionTypeError.d.ts +1 -1
  88. package/dist/error/IfcExpressionBuiltinConfigException.d.ts +3 -0
  89. package/dist/error/InvalidSyntaxException.d.ts +1 -1
  90. package/dist/error/NoSuchFunctionException.d.ts +1 -1
  91. package/dist/error/NoSuchMemberException.d.ts +6 -0
  92. package/dist/error/ValidationException.d.ts +1 -1
  93. package/dist/error/WrongFunctionArgumentTypeException.d.ts +1 -1
  94. package/dist/expression/ExprKind.d.ts +3 -0
  95. package/dist/expression/function/Func.d.ts +7 -21
  96. package/dist/expression/function/FuncArg.d.ts +6 -5
  97. package/dist/expression/function/IfcExpressionFunctions.d.ts +1 -0
  98. package/dist/expression/function/impl/CHOOSE.d.ts +1 -1
  99. package/dist/expression/function/impl/IF.d.ts +1 -1
  100. package/dist/expression/function/impl/MAP.d.ts +1 -1
  101. package/dist/expression/reference/BuiltinFunctionCallExpr.d.ts +19 -0
  102. package/dist/expression/reference/BuiltinPropertyAccessExpr.d.ts +15 -0
  103. package/dist/expression/reference/BuiltinRootReferenceExpr.d.ts +14 -0
  104. package/dist/gen/parser/IfcExpressionLexer.d.ts +9 -8
  105. package/dist/gen/parser/IfcExpressionListener.d.ts +89 -59
  106. package/dist/gen/parser/IfcExpressionParser.d.ts +192 -169
  107. package/dist/gen/parser/IfcExpressionVisitor.d.ts +51 -35
  108. package/dist/index.d.ts +2 -2
  109. package/dist/mjs/IfcExpression.js +104 -32
  110. package/dist/mjs/IfcExpression.js.map +1 -1
  111. package/dist/mjs/IfcExpressionErrorListener.js +3 -8
  112. package/dist/mjs/IfcExpressionErrorListener.js.map +1 -1
  113. package/dist/mjs/IfcExpressionOptions.js +2 -0
  114. package/dist/mjs/IfcExpressionOptions.js.map +1 -0
  115. package/dist/mjs/autocomplete/CompletionItem.js +2 -0
  116. package/dist/mjs/autocomplete/CompletionItem.js.map +1 -0
  117. package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js +650 -0
  118. package/dist/mjs/autocomplete/IfcExpressionAutocomplete.js.map +1 -0
  119. package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js +117 -0
  120. package/dist/mjs/builtin/BuiltinRuntimeValueConverter.js.map +1 -0
  121. package/dist/mjs/builtin/BuiltinVariableRegistry.js +399 -0
  122. package/dist/mjs/builtin/BuiltinVariableRegistry.js.map +1 -0
  123. package/dist/mjs/compiler/ExprCompiler.js +43 -40
  124. package/dist/mjs/compiler/ExprCompiler.js.map +1 -1
  125. package/dist/mjs/compiler/ExprManager.js.map +1 -1
  126. package/dist/mjs/compiler/IfcExpressionValidationListener.js +85 -22
  127. package/dist/mjs/compiler/IfcExpressionValidationListener.js.map +1 -1
  128. package/dist/mjs/compiler/TypeManager.js.map +1 -1
  129. package/dist/mjs/context/IfcExpressionContext.js.map +1 -1
  130. package/dist/mjs/context/NopContext.js +3 -0
  131. package/dist/mjs/context/NopContext.js.map +1 -1
  132. package/dist/mjs/documentation/Documentation.js +7 -0
  133. package/dist/mjs/documentation/Documentation.js.map +1 -0
  134. package/dist/mjs/error/ExpressionTypeError.js.map +1 -1
  135. package/dist/mjs/error/IfcExpressionBuiltinConfigException.js +6 -0
  136. package/dist/mjs/error/IfcExpressionBuiltinConfigException.js.map +1 -0
  137. package/dist/mjs/error/InvalidSyntaxException.js.map +1 -1
  138. package/dist/mjs/error/NoSuchFunctionException.js.map +1 -1
  139. package/dist/mjs/error/NoSuchMemberException.js +9 -0
  140. package/dist/mjs/error/NoSuchMemberException.js.map +1 -0
  141. package/dist/mjs/error/ValidationException.js.map +1 -1
  142. package/dist/mjs/error/WrongFunctionArgumentTypeException.js.map +1 -1
  143. package/dist/mjs/expression/ExprKind.js +3 -0
  144. package/dist/mjs/expression/ExprKind.js.map +1 -1
  145. package/dist/mjs/expression/function/Func.js +18 -14
  146. package/dist/mjs/expression/function/Func.js.map +1 -1
  147. package/dist/mjs/expression/function/FuncArg.js +11 -5
  148. package/dist/mjs/expression/function/FuncArg.js.map +1 -1
  149. package/dist/mjs/expression/function/IfcExpressionFunctions.js +198 -42
  150. package/dist/mjs/expression/function/IfcExpressionFunctions.js.map +1 -1
  151. package/dist/mjs/expression/function/impl/CHOOSE.js.map +1 -1
  152. package/dist/mjs/expression/function/impl/IF.js.map +1 -1
  153. package/dist/mjs/expression/function/impl/MAP.js.map +1 -1
  154. package/dist/mjs/expression/function/impl/ReplacePattern.js +20 -2
  155. package/dist/mjs/expression/function/impl/ReplacePattern.js.map +1 -1
  156. package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js +55 -0
  157. package/dist/mjs/expression/reference/BuiltinFunctionCallExpr.js.map +1 -0
  158. package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js +30 -0
  159. package/dist/mjs/expression/reference/BuiltinPropertyAccessExpr.js.map +1 -0
  160. package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js +25 -0
  161. package/dist/mjs/expression/reference/BuiltinRootReferenceExpr.js.map +1 -0
  162. package/dist/mjs/gen/parser/IfcExpressionLexer.js +101 -104
  163. package/dist/mjs/gen/parser/IfcExpressionLexer.js.map +1 -1
  164. package/dist/mjs/gen/parser/IfcExpressionListener.js +5 -3
  165. package/dist/mjs/gen/parser/IfcExpressionListener.js.map +1 -1
  166. package/dist/mjs/gen/parser/IfcExpressionParser.js +700 -670
  167. package/dist/mjs/gen/parser/IfcExpressionParser.js.map +1 -1
  168. package/dist/mjs/gen/parser/IfcExpressionVisitor.js +2 -3
  169. package/dist/mjs/gen/parser/IfcExpressionVisitor.js.map +1 -1
  170. package/dist/mjs/index.js +1 -1
  171. package/dist/mjs/index.js.map +1 -1
  172. package/dist/mjs/type/ContextObjectType.js +41 -0
  173. package/dist/mjs/type/ContextObjectType.js.map +1 -0
  174. package/dist/mjs/type/Types.js +4 -6
  175. package/dist/mjs/type/Types.js.map +1 -1
  176. package/dist/mjs/value/ContextObjectValue.js +19 -0
  177. package/dist/mjs/value/ContextObjectValue.js.map +1 -0
  178. package/dist/mjs/value/ExpressionValue.js.map +1 -1
  179. package/dist/mjs/value/Value.js.map +1 -1
  180. package/dist/type/ContextObjectType.d.ts +17 -0
  181. package/dist/type/Types.d.ts +2 -6
  182. package/dist/value/ContextObjectValue.d.ts +11 -0
  183. package/dist/value/ExpressionValue.d.ts +2 -1
  184. package/dist/value/Value.d.ts +1 -1
  185. package/package.json +5 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["builtin/BuiltinVariableRegistry.ts"],"names":[],"mappings":"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","file":"builtin/BuiltinVariableRegistry.js","sourcesContent":["import { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { IfcExpressionBuiltinConfigException } from \"../error/IfcExpressionBuiltinConfigException.js\";\nimport { ExprType } from \"../type/ExprType.js\";\nimport { Type, Types } from \"../type/Types.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { BuiltinRootReferenceExpr } from \"../expression/reference/BuiltinRootReferenceExpr.js\";\nimport { ElemObjectReferenceExpr } from \"../expression/reference/ElemObjectReferenceExpr.js\";\nimport { PropObjectReferenceExpr } from \"../expression/reference/PropObjectReferenceExpr.js\";\nimport {\n ArgumentDocumentation,\n LocalizedText,\n} from \"../documentation/Documentation.js\";\n\nexport type BuiltinPropertyDefinition = {\n name: string;\n kind: \"property\";\n valueType: ExprType;\n documentation?: LocalizedText;\n};\n\nexport type BuiltinFunctionDefinition = {\n name: string;\n kind: \"function\";\n returnType: ExprType;\n argumentTypes: Array<ExprType>;\n documentation?: LocalizedText;\n argumentDocumentation?: Array<ArgumentDocumentation>;\n};\n\nexport type BuiltinMemberDefinition =\n | BuiltinPropertyDefinition\n | BuiltinFunctionDefinition;\n\nexport function isBuiltinPropertyDefinition(\n definition: BuiltinMemberDefinition | undefined\n): definition is BuiltinPropertyDefinition {\n return definition?.kind === \"property\";\n}\n\nexport function isBuiltinFunctionDefinition(\n definition: BuiltinMemberDefinition | undefined\n): definition is BuiltinFunctionDefinition {\n return definition?.kind === \"function\";\n}\n\nexport type BuiltinVariableDefinition = {\n name: string;\n type?: ExprType;\n documentation?: LocalizedText;\n members?: Array<BuiltinMemberDefinition>;\n createReferenceExpr?: () => Expr<any>;\n};\n\nexport type RegisteredBuiltinVariableDefinition = {\n name: string;\n type: ExprType;\n documentation?: LocalizedText;\n members: Map<string, BuiltinMemberDefinition>;\n createReferenceExpr: () => Expr<any>;\n};\n\nfunction normalizeBuiltinName(name: string): string {\n return name?.replace(/^\\$/, \"\").toUpperCase();\n}\n\ntype StandardIfcObjectTypes = {\n elementType: ContextObjectType;\n propertyType: ContextObjectType;\n propertySetType: ContextObjectType;\n typeObjectType: ContextObjectType;\n};\n\nfunction memberArg(\n labelKey: string,\n labelFallback: string,\n summaryKey: string,\n summaryFallback: string\n): ArgumentDocumentation {\n return {\n label: { key: labelKey, fallback: labelFallback },\n documentation: { key: summaryKey, fallback: summaryFallback },\n };\n}\n\nfunction createStandardIfcObjectTypes(): StandardIfcObjectTypes {\n const elementMembers = new Map<string, BuiltinMemberDefinition>();\n const propertyMembers = new Map<string, BuiltinMemberDefinition>();\n const propertySetMembers = new Map<string, BuiltinMemberDefinition>();\n const typeObjectMembers = new Map<string, BuiltinMemberDefinition>();\n\n const propertyType = new ContextObjectType(\n Type.IFC_PROPERTY_REF.getName(),\n Type.IFC_PROPERTY_REF,\n propertyMembers\n );\n const propertySetType = new ContextObjectType(\n Type.IFC_PROPERTY_SET_REF.getName(),\n Type.IFC_PROPERTY_SET_REF,\n propertySetMembers\n );\n const typeObjectType = new ContextObjectType(\n Type.IFC_TYPE_OBJECT_REF.getName(),\n Type.IFC_TYPE_OBJECT_REF,\n typeObjectMembers\n );\n const elementType = new ContextObjectType(\n Type.IFC_ELEMENT_REF.getName(),\n Type.IFC_ELEMENT_REF,\n elementMembers\n );\n\n standardIfcElementMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n elementMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcPropertyMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n propertyMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcPropertySetMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n propertySetMembers.set(normalizeBuiltinName(member.name), member);\n });\n standardIfcTypeObjectMembers({\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n }).forEach((member) => {\n typeObjectMembers.set(normalizeBuiltinName(member.name), member);\n });\n\n return {\n elementType,\n propertyType,\n propertySetType,\n typeObjectType,\n };\n}\n\nfunction standardIfcElementMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.name.summary\",\n fallback: \"name(): name of the current IFC element\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC element\",\n },\n },\n {\n name: \"ifcClass\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.ifcClass.summary\",\n fallback: \"ifcClass(): IFC class name of the current element\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.description.summary\",\n fallback: \"description(): description of the current IFC element\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$element.property.summary\",\n fallback: \"property(name): property of the current IFC element by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$element.property.arg.name.label\",\n \"name\",\n \"builtin.$element.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$element.propertySet.summary\",\n fallback:\n \"propertySet(name): property set of the current IFC element by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$element.propertySet.arg.name.label\",\n \"name\",\n \"builtin.$element.propertySet.arg.name.summary\",\n \"The name of the property set to resolve\"\n ),\n ],\n },\n {\n name: \"type\",\n kind: \"function\",\n returnType: types.typeObjectType,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$element.type.summary\",\n fallback: \"type(): type object of the current IFC element\",\n },\n },\n ];\n}\n\nfunction standardIfcPropertyMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.name.summary\",\n fallback: \"name(): name of the current IFC property\",\n },\n },\n {\n name: \"ifcClass\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.ifcClass.summary\",\n fallback: \"ifcClass(): IFC class name of the current property\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.description.summary\",\n fallback: \"description(): description of the current IFC property\",\n },\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.propertySet.summary\",\n fallback:\n \"propertySet(): property set containing the current IFC property\",\n },\n },\n {\n name: \"value\",\n kind: \"function\",\n returnType: Types.or(Type.STRING, Type.NUMERIC, Type.BOOLEAN, Type.ARRAY),\n argumentTypes: [],\n documentation: {\n key: \"builtin.$property.value.summary\",\n fallback: \"value(): value of the current IFC property\",\n },\n },\n ];\n}\n\nfunction standardIfcPropertySetMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.name.summary\",\n fallback: \"name(): name of the current IFC property set\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC property set\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$propertySet.description.summary\",\n fallback: \"description(): description of the current IFC property set\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$propertySet.property.summary\",\n fallback:\n \"property(name): property of the current IFC property set by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$propertySet.property.arg.name.label\",\n \"name\",\n \"builtin.$propertySet.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n ];\n}\n\nfunction standardIfcTypeObjectMembers(\n types: StandardIfcObjectTypes\n): Array<BuiltinMemberDefinition> {\n return [\n {\n name: \"name\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.name.summary\",\n fallback: \"name(): name of the current IFC type object\",\n },\n },\n {\n name: \"guid\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.guid.summary\",\n fallback:\n \"guid(): globally unique identifier of the current IFC type object\",\n },\n },\n {\n name: \"description\",\n kind: \"function\",\n returnType: Type.STRING,\n argumentTypes: [],\n documentation: {\n key: \"builtin.$typeObject.description.summary\",\n fallback: \"description(): description of the current IFC type object\",\n },\n },\n {\n name: \"property\",\n kind: \"function\",\n returnType: types.propertyType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$typeObject.property.summary\",\n fallback:\n \"property(name): property of the current IFC type object by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$typeObject.property.arg.name.label\",\n \"name\",\n \"builtin.$typeObject.property.arg.name.summary\",\n \"The name of the property to resolve\"\n ),\n ],\n },\n {\n name: \"propertySet\",\n kind: \"function\",\n returnType: types.propertySetType,\n argumentTypes: [Type.STRING],\n documentation: {\n key: \"builtin.$typeObject.propertySet.summary\",\n fallback:\n \"propertySet(name): property set of the current IFC type object by name\",\n },\n argumentDocumentation: [\n memberArg(\n \"builtin.$typeObject.propertySet.arg.name.label\",\n \"name\",\n \"builtin.$typeObject.propertySet.arg.name.summary\",\n \"The name of the property set to resolve\"\n ),\n ],\n },\n ];\n}\n\nconst standardIfcObjectTypes = createStandardIfcObjectTypes();\n\nexport class BuiltinVariableRegistry {\n private static readonly defaultRegistry = new BuiltinVariableRegistry([\n {\n name: \"element\",\n type: Type.IFC_ELEMENT_REF,\n documentation: {\n key: \"builtin.$element.summary\",\n fallback: \"$element: IFC element from the evaluation context\",\n },\n members: standardIfcElementMembers(standardIfcObjectTypes),\n createReferenceExpr: () => new ElemObjectReferenceExpr(),\n },\n {\n name: \"property\",\n type: Type.IFC_PROPERTY_REF,\n documentation: {\n key: \"builtin.$property.summary\",\n fallback: \"$property: IFC property from the evaluation context\",\n },\n members: standardIfcPropertyMembers(standardIfcObjectTypes),\n createReferenceExpr: () => new PropObjectReferenceExpr(),\n },\n ]);\n\n private readonly builtinVariables: Map<\n string,\n RegisteredBuiltinVariableDefinition\n >;\n\n constructor(definitions: Array<BuiltinVariableDefinition> = []) {\n this.builtinVariables = new Map();\n definitions.forEach((definition) => this.register(definition));\n }\n\n public static getDefaultRegistry() {\n return this.defaultRegistry;\n }\n\n public static normalizeName(name: string): string {\n return normalizeBuiltinName(name);\n }\n\n public static isBuiltinVariable(name: string): boolean {\n return this.defaultRegistry.isBuiltinVariable(name);\n }\n\n public static isReservedName(name: string): boolean {\n return this.defaultRegistry.isReservedName(name);\n }\n\n public static getDefinition(\n name: string\n ): RegisteredBuiltinVariableDefinition | undefined {\n return this.defaultRegistry.getDefinition(name);\n }\n\n public isBuiltinVariable(name: string): boolean {\n return this.builtinVariables.has(\n BuiltinVariableRegistry.normalizeName(name)\n );\n }\n\n public isReservedName(name: string): boolean {\n return this.isBuiltinVariable(name);\n }\n\n public getDefinition(\n name: string\n ): RegisteredBuiltinVariableDefinition | undefined {\n return this.builtinVariables.get(\n BuiltinVariableRegistry.normalizeName(name)\n );\n }\n\n public getDefinitions(): Array<RegisteredBuiltinVariableDefinition> {\n return [...this.builtinVariables.values()];\n }\n\n private register(definition: BuiltinVariableDefinition) {\n const normalizedName = BuiltinVariableRegistry.normalizeName(\n definition.name\n );\n if (this.builtinVariables.has(normalizedName)) {\n throw new IfcExpressionBuiltinConfigException(\n `cannot register builtin variable with name '${definition.name}': name already in use`\n );\n }\n const members = this.registerMembers(definition);\n const baseType =\n definition.type ??\n (members.size > 0 ? Type.CONTEXT_OBJECT_REF : Type.ANY);\n const resolvedType =\n members.size > 0\n ? new ContextObjectType(definition.name, baseType, members)\n : baseType;\n const createReferenceExpr =\n definition.createReferenceExpr ??\n (() => new BuiltinRootReferenceExpr(definition.name, resolvedType));\n this.builtinVariables.set(normalizedName, {\n name: definition.name,\n type: resolvedType,\n documentation: definition.documentation,\n members,\n createReferenceExpr,\n });\n }\n\n private registerMembers(definition: BuiltinVariableDefinition) {\n const members = new Map<string, BuiltinMemberDefinition>();\n definition.members?.forEach((member) => {\n const normalizedMemberName = BuiltinVariableRegistry.normalizeName(\n member.name\n );\n if (members.has(normalizedMemberName)) {\n throw new IfcExpressionBuiltinConfigException(\n `cannot register member '${member.name}' for builtin '${definition.name}': name already in use`\n );\n }\n members.set(normalizedMemberName, member);\n });\n return members;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import IfcExpressionVisitor from "../gen/parser/IfcExpressionVisitor.js";
1
+ import { IfcExpressionVisitor } from "../gen/parser/IfcExpressionVisitor.js";
2
2
  import { NumericLiteralExpr } from "../expression/numeric/NumericLiteralExpr.js";
3
3
  import { isNullish, isPresent } from "../util/IfcExpressionUtils.js";
4
4
  import Decimal from "decimal.js";
@@ -6,8 +6,6 @@ import { PlusExpr } from "../expression/numeric/PlusExpr.js";
6
6
  import { MinusExpr } from "../expression/numeric/MinusExpr.js";
7
7
  import { MultiplyExpr } from "../expression/numeric/MultiplyExpr.js";
8
8
  import { DivideExpr } from "../expression/numeric/DivideExpr.js";
9
- import { PropObjectReferenceExpr } from "../expression/reference/PropObjectReferenceExpr.js";
10
- import { ElemObjectReferenceExpr } from "../expression/reference/ElemObjectReferenceExpr.js";
11
9
  import { StringLiteralExpr } from "../expression/string/StringLiteralExpr.js";
12
10
  import { ArrayExpr } from "../expression/structure/ArrayExpr.js";
13
11
  import { FunctionExpr } from "../expression/function/FunctionExpr.js";
@@ -32,19 +30,24 @@ import { LessThanOrEqual } from "../expression/comparison/LessThanOrEqual.js";
32
30
  import { ExprManager } from "./ExprManager.js";
33
31
  import { LogicalValue } from "../value/LogicalValue.js";
34
32
  import { LogicalLiteralExpr } from "../expression/boolean/LogicalLiteralExpr.js";
33
+ import { BuiltinVariableRegistry, isBuiltinFunctionDefinition, isBuiltinPropertyDefinition, } from "../builtin/BuiltinVariableRegistry.js";
34
+ import { ContextObjectType } from "../type/ContextObjectType.js";
35
+ import { BuiltinPropertyAccessExpr } from "../expression/reference/BuiltinPropertyAccessExpr.js";
36
+ import { BuiltinFunctionCallExpr } from "../expression/reference/BuiltinFunctionCallExpr.js";
35
37
  export class ExprCompiler extends IfcExpressionVisitor {
36
- constructor(typeManager) {
38
+ defaultResult() {
39
+ return null;
40
+ }
41
+ constructor(typeManager, builtinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()) {
37
42
  super();
38
43
  this.methodCallTargetStack = [];
39
44
  this.visitExpr = (ctx) => {
40
45
  return this.visit(ctx.singleExpr());
41
46
  };
42
47
  this.visitVariableRef = (ctx) => {
43
- if (ctx.IDENTIFIER().getText().toUpperCase() === "PROPERTY") {
44
- return this.associateContextAndReturn(new PropObjectReferenceExpr(), ctx);
45
- }
46
- else if (ctx.IDENTIFIER().getText().toUpperCase() === "ELEMENT") {
47
- return this.associateContextAndReturn(new ElemObjectReferenceExpr(), ctx);
48
+ const builtin = this.builtinVariableRegistry.getDefinition(ctx.IDENTIFIER().getText());
49
+ if (!isNullish(builtin)) {
50
+ return this.associateContextAndReturn(builtin.createReferenceExpr(), ctx);
48
51
  }
49
52
  throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);
50
53
  };
@@ -88,21 +91,39 @@ export class ExprCompiler extends IfcExpressionVisitor {
88
91
  this.visitSEParenthesis = (ctx) => {
89
92
  return this.associateContextAndReturn(new ParenthesisExpr(this.visit(ctx._sub)), ctx);
90
93
  };
91
- /*================================================
92
- * MethodCallChain
93
- *==============================================*/
94
94
  this.visitMethodCallChainInner = (ctx) => {
95
- const functionExpr = new FunctionExpr(ctx.functionCall().IDENTIFIER().getText(), this.collectFunctionArguments(ctx.functionCall().exprList(), [
96
- this.methodCallTargetStack.pop(),
97
- ]));
98
- this.associateContextAndReturn(functionExpr, ctx.functionCall());
99
- this.methodCallTargetStack.push(functionExpr);
100
- return this.visit(ctx.methodCallChain());
95
+ const accessExpr = this.visit(ctx._target);
96
+ this.methodCallTargetStack.push(accessExpr);
97
+ return this.visit(ctx._call);
101
98
  };
102
99
  this.visitMethodCallChainEnd = (ctx) => {
103
- return this.associateContextAndReturn(new FunctionExpr(ctx.functionCall().IDENTIFIER().getText(), this.collectFunctionArguments(ctx.functionCall().exprList(), [
104
- this.methodCallTargetStack.pop(),
105
- ])), ctx.functionCall());
100
+ return this.visit(ctx._call);
101
+ };
102
+ this.visitMethodFunctionCall = (ctx) => {
103
+ const targetExpr = this.methodCallTargetStack.pop();
104
+ const functionName = ctx.functionCall().IDENTIFIER().getText();
105
+ const args = isNullish(ctx.functionCall().exprList())
106
+ ? []
107
+ : this.collectFunctionArguments(ctx.functionCall().exprList());
108
+ const targetType = targetExpr.getType();
109
+ if (targetType instanceof ContextObjectType) {
110
+ const member = targetType.getMemberDefinition(functionName);
111
+ if (isBuiltinFunctionDefinition(member)) {
112
+ return this.associateContextAndReturn(new BuiltinFunctionCallExpr(targetExpr, member.name, args, member.returnType, targetType.getName()), ctx);
113
+ }
114
+ }
115
+ return this.associateContextAndReturn(new FunctionExpr(functionName, [targetExpr, ...args]), ctx.functionCall());
116
+ };
117
+ this.visitMethodPropertyAccess = (ctx) => {
118
+ const targetExpr = this.methodCallTargetStack.pop();
119
+ const targetType = targetExpr.getType();
120
+ if (targetType instanceof ContextObjectType) {
121
+ const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
122
+ if (isBuiltinPropertyDefinition(member)) {
123
+ return this.associateContextAndReturn(new BuiltinPropertyAccessExpr(targetExpr, member.name, member.valueType, targetType.getName()), ctx);
124
+ }
125
+ }
126
+ throw new Error(`Parsing error: No property '${ctx.getText()}' found for type '${targetType.getName()}'`);
106
127
  };
107
128
  this.visitSEAddSub = (ctx) => {
108
129
  this.typeManager.requireTypesOverlap(ctx._left, ctx._right);
@@ -125,17 +146,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
125
146
  ExprCompiler.failNode(ctx);
126
147
  }
127
148
  };
128
- /*================================================
129
- * StringExpr
130
- *===============================================*/
131
149
  this.visitStringLiteral = (ctx) => {
132
150
  const quotedString = ctx.QUOTED_STRING().getText();
133
151
  const text = quotedString.substring(1, quotedString.length - 1);
134
152
  return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);
135
153
  };
136
- /*================================================
137
- * NumExpr
138
- *===============================================*/
139
154
  this.visitNumLiteral = (ctx) => {
140
155
  let val = ctx.INT();
141
156
  if (isPresent(val)) {
@@ -156,9 +171,6 @@ export class ExprCompiler extends IfcExpressionVisitor {
156
171
  this.visitSEUnaryMinus = (ctx) => {
157
172
  return this.associateContextAndReturn(new UnaryMinusExpr(this.visit(ctx.singleExpr())), ctx);
158
173
  };
159
- /*================================================
160
- * BooleanExpr
161
- *===============================================*/
162
174
  this.visitSEBooleanBinaryOp = (ctx) => {
163
175
  switch (ctx._op.text) {
164
176
  case "&&":
@@ -174,15 +186,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
174
186
  return this.associateContextAndReturn(new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === "TRUE"), ctx);
175
187
  };
176
188
  this.visitLogicalLiteral = (ctx) => {
177
- // the only literal we recognize is 'UNKNOWN' (true and false are boolean literals)
178
189
  return this.associateContextAndReturn(new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE), ctx);
179
190
  };
180
191
  this.visitSENot = (ctx) => {
181
192
  return this.associateContextAndReturn(new NotExpr(this.visit(ctx.singleExpr())), ctx);
182
193
  };
183
- /*================================================
184
- * ArrayExpr
185
- *===============================================*/
186
194
  this.visitArrayExpr = (ctx) => {
187
195
  return this.associateContextAndReturn(new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())), ctx);
188
196
  };
@@ -199,9 +207,6 @@ export class ExprCompiler extends IfcExpressionVisitor {
199
207
  }
200
208
  return [];
201
209
  };
202
- /*================================================
203
- * FuncExpr
204
- *===============================================*/
205
210
  this.visitFunctionCall = (ctx) => {
206
211
  const args = isNullish(ctx.exprList())
207
212
  ? []
@@ -226,13 +231,11 @@ export class ExprCompiler extends IfcExpressionVisitor {
226
231
  };
227
232
  this.typeManager = typeManager;
228
233
  this.exprManager = new ExprManager();
234
+ this.builtinVariableRegistry = builtinVariableRegistry;
229
235
  }
230
236
  getExprManager() {
231
237
  return this.exprManager;
232
238
  }
233
- /*================================================
234
- * VariableRef
235
- *==============================================*/
236
239
  associateContextAndReturn(expr, ctx) {
237
240
  this.exprManager.registerExprWithContext(expr, ctx);
238
241
  return expr;
@@ -1 +1 @@
1
- {"version":3,"sources":["compiler/ExprCompiler.ts"],"names":[],"mappings":"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","file":"compiler/ExprCompiler.js","sourcesContent":["import IfcExpressionVisitor from \"../gen/parser/IfcExpressionVisitor.js\";\nimport { NumericLiteralExpr } from \"../expression/numeric/NumericLiteralExpr.js\";\nimport {\n ArrayElementListContext,\n ArrayExprContext,\n BooleanLiteralContext,\n ExprContext,\n ExprListContext,\n FunctionCallContext,\n LiteralContext,\n LogicalLiteralContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n NumLiteralContext,\n SEAddSubContext,\n SEArrayExprContext,\n SEBooleanBinaryOpContext,\n SEComparisonContext,\n SEFunctionCallContext,\n SELiteralContext,\n SEMethodCallContext,\n SEMulDivContext,\n SENotContext,\n SEParenthesisContext,\n SEPowerContext,\n SEUnaryMinusContext,\n SEUnaryMultipleMinusContext,\n SEVariableRefContext,\n StringLiteralContext,\n VariableRefContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { isNullish, isPresent } from \"../util/IfcExpressionUtils.js\";\nimport Decimal from \"decimal.js\";\nimport { PlusExpr } from \"../expression/numeric/PlusExpr.js\";\nimport { MinusExpr } from \"../expression/numeric/MinusExpr.js\";\nimport { ParserRuleContext } from \"antlr4\";\nimport { MultiplyExpr } from \"../expression/numeric/MultiplyExpr.js\";\nimport { DivideExpr } from \"../expression/numeric/DivideExpr.js\";\nimport { PropObjectReferenceExpr } from \"../expression/reference/PropObjectReferenceExpr.js\";\nimport { ElemObjectReferenceExpr } from \"../expression/reference/ElemObjectReferenceExpr.js\";\nimport { StringLiteralExpr } from \"../expression/string/StringLiteralExpr.js\";\nimport { ArrayExpr } from \"../expression/structure/ArrayExpr.js\";\nimport { FunctionExpr } from \"../expression/function/FunctionExpr.js\";\nimport { PowerExpr } from \"../expression/numeric/PowerExpr.js\";\nimport { UnaryMinusExpr } from \"../expression/numeric/UnaryMinusExpr.js\";\nimport { AndExpr } from \"../expression/boolean/AndExpr.js\";\nimport { BooleanLiteralExpr } from \"../expression/boolean/BooleanLiteralExpr.js\";\nimport { OrExpr } from \"../expression/boolean/OrExpr.js\";\nimport { XorExpr } from \"../expression/boolean/XorExpr.js\";\nimport { SyntaxErrorException } from \"../error/SyntaxErrorException.js\";\nimport { NotExpr } from \"../expression/boolean/NotExpr.js\";\nimport { ParenthesisExpr } from \"../expression/structure/ParenthesisExpr.js\";\nimport { EqualsExpr } from \"../expression/comparison/EqualsExpr.js\";\nimport { NotEqualsExpr } from \"../expression/comparison/NotEqualsExpr.js\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { StringConcatExpr } from \"../expression/string/StringConcatExpr.js\";\nimport { PlusOrConcatExpr } from \"../expression/poly/PlusOrConcatExpr.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { GreaterThan } from \"../expression/comparison/GreaterThan.js\";\nimport { GreaterThanOrEqual } from \"../expression/comparison/GreaterThanOrEqual.js\";\nimport { LessThan } from \"../expression/comparison/LessThan.js\";\nimport { LessThanOrEqual } from \"../expression/comparison/LessThanOrEqual.js\";\nimport { ExprManager } from \"./ExprManager.js\";\nimport { LogicalValue } from \"../value/LogicalValue.js\";\nimport { LogicalLiteralExpr } from \"../expression/boolean/LogicalLiteralExpr.js\";\n\nexport class ExprCompiler extends IfcExpressionVisitor<Expr<any>> {\n private readonly methodCallTargetStack = [];\n private readonly typeManager: TypeManager;\n private readonly exprManager: ExprManager;\n\n constructor(typeManager: TypeManager) {\n super();\n this.typeManager = typeManager;\n this.exprManager = new ExprManager();\n }\n\n public getExprManager(): ExprManager {\n return this.exprManager;\n }\n\n visitExpr: (ctx: ExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.singleExpr());\n };\n\n /*================================================\n * VariableRef\n *==============================================*/\n\n private associateContextAndReturn(expr: Expr<any>, ctx: ParserRuleContext) {\n this.exprManager.registerExprWithContext(expr, ctx);\n return expr;\n }\n\n visitVariableRef: (ctx: VariableRefContext) => Expr<any> = (ctx) => {\n if (ctx.IDENTIFIER().getText().toUpperCase() === \"PROPERTY\") {\n return this.associateContextAndReturn(new PropObjectReferenceExpr(), ctx);\n } else if (ctx.IDENTIFIER().getText().toUpperCase() === \"ELEMENT\") {\n return this.associateContextAndReturn(new ElemObjectReferenceExpr(), ctx);\n }\n throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);\n };\n\n visitSEComparison: (ctx: SEComparisonContext) => Expr<any> = (ctx) => {\n const left = this.visit(ctx.singleExpr(0));\n const right = this.visit(ctx.singleExpr(1));\n switch (ctx.CMP_OP().getText()) {\n case \"==\":\n return this.associateContextAndReturn(new EqualsExpr(left, right), ctx);\n case \"!=\":\n return this.associateContextAndReturn(\n new NotEqualsExpr(left, right),\n ctx\n );\n case \">\":\n return this.associateContextAndReturn(\n new GreaterThan(left, right),\n ctx\n );\n case \">=\":\n return this.associateContextAndReturn(\n new GreaterThanOrEqual(left, right),\n ctx\n );\n case \"<\":\n return this.associateContextAndReturn(new LessThan(left, right), ctx);\n case \"<=\":\n return this.associateContextAndReturn(\n new LessThanOrEqual(left, right),\n ctx\n );\n }\n throw new Error(\n `Parsing error: comparison operator '${ctx\n .CMP_OP()\n .getText()}' not supported`\n );\n };\n\n visitSEMethodCall: (ctx: SEMethodCallContext) => Expr<any> = (ctx) => {\n this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));\n return this.visit(ctx.methodCallChain());\n };\n\n visitSELiteral: (ctx: SELiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.literal());\n };\n\n visitSEVariableRef: (ctx: SEVariableRefContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.variableRef());\n };\n visitSEArrayExpr: (ctx: SEArrayExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.arrayExpr());\n };\n visitSEFunctionCall: (ctx: SEFunctionCallContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.functionCall());\n };\n visitSEParenthesis: (ctx: SEParenthesisContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ParenthesisExpr(this.visit(ctx._sub)),\n ctx\n );\n };\n\n /*================================================\n * MethodCallChain\n *==============================================*/\n\n visitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => Expr<any> = (\n ctx\n ) => {\n const functionExpr = new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n );\n this.associateContextAndReturn(functionExpr, ctx.functionCall());\n this.methodCallTargetStack.push(functionExpr);\n return this.visit(ctx.methodCallChain());\n };\n\n visitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => Expr<any> = (\n ctx\n ) => {\n return this.associateContextAndReturn(\n new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n ),\n ctx.functionCall()\n );\n };\n\n visitSEAddSub: (ctx: SEAddSubContext) => Expr<any> = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n switch (ctx._op.text) {\n case \"+\":\n return this.makePlusExpr(ctx);\n case \"-\":\n return this.associateContextAndReturn(\n new MinusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n private makePlusExpr(ctx: SEAddSubContext) {\n if (this.typeManager.isNumeric(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new PlusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (this.typeManager.isString(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (\n this.typeManager.overlapsWithString(ctx._left, ctx._right) ||\n this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)\n ) {\n return this.associateContextAndReturn(\n new PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n throw new ExpressionTypeError(\n \"Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.\",\n ctx\n );\n }\n\n visitSEMulDiv: (ctx: SEMulDivContext) => Expr<any> = (ctx) => {\n switch (ctx._op.text) {\n case \"*\":\n return this.associateContextAndReturn(\n new MultiplyExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n case \"/\":\n return this.associateContextAndReturn(\n new DivideExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n /*================================================\n * StringExpr\n *===============================================*/\n\n visitStringLiteral: (ctx: StringLiteralContext) => Expr<any> = (ctx) => {\n const quotedString = ctx.QUOTED_STRING().getText();\n const text = quotedString.substring(1, quotedString.length - 1);\n return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);\n };\n\n /*================================================\n * NumExpr\n *===============================================*/\n\n visitNumLiteral: (ctx: NumLiteralContext) => Expr<any> = (ctx) => {\n let val = ctx.INT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n val = ctx.FLOAT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n ExprCompiler.failNode(ctx);\n };\n\n visitSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx.singleExpr());\n };\n visitSEPower: (ctx: SEPowerContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new PowerExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n };\n visitSEUnaryMinus: (ctx: SEUnaryMinusContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new UnaryMinusExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * BooleanExpr\n *===============================================*/\n\n visitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => Expr<any> = (\n ctx\n ) => {\n switch (ctx._op.text) {\n case \"&&\":\n return this.associateContextAndReturn(\n new AndExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"||\":\n return this.associateContextAndReturn(\n new OrExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"><\":\n return this.associateContextAndReturn(\n new XorExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n }\n throw new SyntaxErrorException(\n ctx._op.text,\n ctx._op.line,\n ctx._op.column,\n `Unknown boolean operator ${ctx._op.text}`\n );\n };\n\n visitBooleanLiteral: (ctx: BooleanLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === \"TRUE\"),\n ctx\n );\n };\n\n visitLogicalLiteral: (ctx: LogicalLiteralContext) => Expr<any> = (ctx) => {\n // the only literal we recognize is 'UNKNOWN' (true and false are boolean literals)\n return this.associateContextAndReturn(\n new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE),\n ctx\n );\n };\n\n visitSENot: (ctx: SENotContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new NotExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * ArrayExpr\n *===============================================*/\n\n visitArrayExpr: (ctx: ArrayExprContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())),\n ctx\n );\n };\n\n collectArrayElements: (ctx: ArrayElementListContext) => Array<Expr<any>> = (\n ctx\n ) => {\n if (!isNullish(ctx)) {\n const first = this.visit(ctx.singleExpr());\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n const arr = this.collectArrayElements(rest);\n arr.unshift(first);\n return arr;\n }\n return [first];\n }\n return [];\n };\n\n /*================================================\n * FuncExpr\n *===============================================*/\n\n visitFunctionCall: (ctx: FunctionCallContext) => Expr<any> = (ctx) => {\n const args = isNullish(ctx.exprList())\n ? []\n : this.collectFunctionArguments(ctx.exprList());\n return this.associateContextAndReturn(\n new FunctionExpr(ctx.IDENTIFIER().getText(), args),\n ctx\n );\n };\n\n collectFunctionArguments: (\n ctx: ExprListContext,\n resultSoFar?: Array<Expr<any>>\n ) => Array<Expr<any>> = (ctx, resultSoFar?: Array<Expr<any>>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.visit(ctx.singleExpr()));\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectFunctionArguments(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n private static failNode(ctx: ParserRuleContext) {\n throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);\n }\n\n visitLiteral: (ctx: LiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.getChild(0));\n };\n}\n"]}
1
+ {"version":3,"sources":["compiler/ExprCompiler.ts"],"names":[],"mappings":"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","file":"compiler/ExprCompiler.js","sourcesContent":["import { IfcExpressionVisitor } from \"../gen/parser/IfcExpressionVisitor.js\";\nimport { NumericLiteralExpr } from \"../expression/numeric/NumericLiteralExpr.js\";\nimport {\n ArrayElementListContext,\n ArrayExprContext,\n BooleanLiteralContext,\n ExprContext,\n ExprListContext,\n FunctionCallContext,\n LiteralContext,\n LogicalLiteralContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n MethodFunctionCallContext,\n MethodPropertyAccessContext,\n NumLiteralContext,\n SEAddSubContext,\n SEArrayExprContext,\n SEBooleanBinaryOpContext,\n SEComparisonContext,\n SEFunctionCallContext,\n SELiteralContext,\n SEMethodCallContext,\n SEMulDivContext,\n SENotContext,\n SEParenthesisContext,\n SEPowerContext,\n SEUnaryMinusContext,\n SEUnaryMultipleMinusContext,\n SEVariableRefContext,\n StringLiteralContext,\n VariableRefContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { isNullish, isPresent } from \"../util/IfcExpressionUtils.js\";\nimport Decimal from \"decimal.js\";\nimport { PlusExpr } from \"../expression/numeric/PlusExpr.js\";\nimport { MinusExpr } from \"../expression/numeric/MinusExpr.js\";\nimport { ParserRuleContext } from \"antlr4ng\";\nimport { MultiplyExpr } from \"../expression/numeric/MultiplyExpr.js\";\nimport { DivideExpr } from \"../expression/numeric/DivideExpr.js\";\nimport { StringLiteralExpr } from \"../expression/string/StringLiteralExpr.js\";\nimport { ArrayExpr } from \"../expression/structure/ArrayExpr.js\";\nimport { FunctionExpr } from \"../expression/function/FunctionExpr.js\";\nimport { PowerExpr } from \"../expression/numeric/PowerExpr.js\";\nimport { UnaryMinusExpr } from \"../expression/numeric/UnaryMinusExpr.js\";\nimport { AndExpr } from \"../expression/boolean/AndExpr.js\";\nimport { BooleanLiteralExpr } from \"../expression/boolean/BooleanLiteralExpr.js\";\nimport { OrExpr } from \"../expression/boolean/OrExpr.js\";\nimport { XorExpr } from \"../expression/boolean/XorExpr.js\";\nimport { SyntaxErrorException } from \"../error/SyntaxErrorException.js\";\nimport { NotExpr } from \"../expression/boolean/NotExpr.js\";\nimport { ParenthesisExpr } from \"../expression/structure/ParenthesisExpr.js\";\nimport { EqualsExpr } from \"../expression/comparison/EqualsExpr.js\";\nimport { NotEqualsExpr } from \"../expression/comparison/NotEqualsExpr.js\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { StringConcatExpr } from \"../expression/string/StringConcatExpr.js\";\nimport { PlusOrConcatExpr } from \"../expression/poly/PlusOrConcatExpr.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { GreaterThan } from \"../expression/comparison/GreaterThan.js\";\nimport { GreaterThanOrEqual } from \"../expression/comparison/GreaterThanOrEqual.js\";\nimport { LessThan } from \"../expression/comparison/LessThan.js\";\nimport { LessThanOrEqual } from \"../expression/comparison/LessThanOrEqual.js\";\nimport { ExprManager } from \"./ExprManager.js\";\nimport { LogicalValue } from \"../value/LogicalValue.js\";\nimport { LogicalLiteralExpr } from \"../expression/boolean/LogicalLiteralExpr.js\";\nimport {\n BuiltinVariableRegistry,\n isBuiltinFunctionDefinition,\n isBuiltinPropertyDefinition,\n} from \"../builtin/BuiltinVariableRegistry.js\";\nimport { ContextObjectType } from \"../type/ContextObjectType.js\";\nimport { BuiltinPropertyAccessExpr } from \"../expression/reference/BuiltinPropertyAccessExpr.js\";\nimport { BuiltinFunctionCallExpr } from \"../expression/reference/BuiltinFunctionCallExpr.js\";\n\nexport class ExprCompiler extends IfcExpressionVisitor<Expr<any>> {\n protected defaultResult(): Expr<any> | null {\n return null;\n }\n private readonly methodCallTargetStack: Array<Expr<any>> = [];\n private readonly typeManager: TypeManager;\n private readonly exprManager: ExprManager;\n private readonly builtinVariableRegistry: BuiltinVariableRegistry;\n\n constructor(\n typeManager: TypeManager,\n builtinVariableRegistry: BuiltinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()\n ) {\n super();\n this.typeManager = typeManager;\n this.exprManager = new ExprManager();\n this.builtinVariableRegistry = builtinVariableRegistry;\n }\n\n public getExprManager(): ExprManager {\n return this.exprManager;\n }\n\n visitExpr: (ctx: ExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.singleExpr());\n };\n\n private associateContextAndReturn(expr: Expr<any>, ctx: ParserRuleContext) {\n this.exprManager.registerExprWithContext(expr, ctx);\n return expr;\n }\n\n visitVariableRef: (ctx: VariableRefContext) => Expr<any> = (ctx) => {\n const builtin = this.builtinVariableRegistry.getDefinition(\n ctx.IDENTIFIER().getText()\n );\n if (!isNullish(builtin)) {\n return this.associateContextAndReturn(builtin.createReferenceExpr(), ctx);\n }\n throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);\n };\n\n visitSEComparison: (ctx: SEComparisonContext) => Expr<any> = (ctx) => {\n const left = this.visit(ctx.singleExpr(0));\n const right = this.visit(ctx.singleExpr(1));\n switch (ctx.CMP_OP().getText()) {\n case \"==\":\n return this.associateContextAndReturn(new EqualsExpr(left, right), ctx);\n case \"!=\":\n return this.associateContextAndReturn(\n new NotEqualsExpr(left, right),\n ctx\n );\n case \">\":\n return this.associateContextAndReturn(\n new GreaterThan(left, right),\n ctx\n );\n case \">=\":\n return this.associateContextAndReturn(\n new GreaterThanOrEqual(left, right),\n ctx\n );\n case \"<\":\n return this.associateContextAndReturn(new LessThan(left, right), ctx);\n case \"<=\":\n return this.associateContextAndReturn(\n new LessThanOrEqual(left, right),\n ctx\n );\n }\n throw new Error(\n `Parsing error: comparison operator '${ctx\n .CMP_OP()\n .getText()}' not supported`\n );\n };\n\n visitSEMethodCall: (ctx: SEMethodCallContext) => Expr<any> = (ctx) => {\n this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));\n return this.visit(ctx.methodCallChain());\n };\n\n visitSELiteral: (ctx: SELiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.literal());\n };\n\n visitSEVariableRef: (ctx: SEVariableRefContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.variableRef());\n };\n visitSEArrayExpr: (ctx: SEArrayExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.arrayExpr());\n };\n visitSEFunctionCall: (ctx: SEFunctionCallContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.functionCall());\n };\n visitSEParenthesis: (ctx: SEParenthesisContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ParenthesisExpr(this.visit(ctx._sub)),\n ctx\n );\n };\n\n visitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => Expr<any> = (\n ctx\n ) => {\n const accessExpr = this.visit(ctx._target);\n this.methodCallTargetStack.push(accessExpr);\n return this.visit(ctx._call);\n };\n\n visitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx._call);\n };\n\n visitMethodFunctionCall: (ctx: MethodFunctionCallContext) => Expr<any> = (\n ctx\n ) => {\n const targetExpr = this.methodCallTargetStack.pop();\n const functionName = ctx.functionCall().IDENTIFIER().getText();\n const args = isNullish(ctx.functionCall().exprList())\n ? []\n : this.collectFunctionArguments(ctx.functionCall().exprList());\n const targetType = targetExpr.getType();\n if (targetType instanceof ContextObjectType) {\n const member = targetType.getMemberDefinition(functionName);\n if (isBuiltinFunctionDefinition(member)) {\n return this.associateContextAndReturn(\n new BuiltinFunctionCallExpr(\n targetExpr,\n member.name,\n args,\n member.returnType,\n targetType.getName()\n ),\n ctx\n );\n }\n }\n return this.associateContextAndReturn(\n new FunctionExpr(functionName, [targetExpr, ...args]),\n ctx.functionCall()\n );\n };\n\n visitMethodPropertyAccess: (ctx: MethodPropertyAccessContext) => Expr<any> = (\n ctx\n ) => {\n const targetExpr = this.methodCallTargetStack.pop();\n const targetType = targetExpr.getType();\n if (targetType instanceof ContextObjectType) {\n const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());\n if (isBuiltinPropertyDefinition(member)) {\n return this.associateContextAndReturn(\n new BuiltinPropertyAccessExpr(\n targetExpr,\n member.name,\n member.valueType,\n targetType.getName()\n ),\n ctx\n );\n }\n }\n throw new Error(\n `Parsing error: No property '${ctx.getText()}' found for type '${targetType.getName()}'`\n );\n };\n\n visitSEAddSub: (ctx: SEAddSubContext) => Expr<any> = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n switch (ctx._op.text) {\n case \"+\":\n return this.makePlusExpr(ctx);\n case \"-\":\n return this.associateContextAndReturn(\n new MinusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n private makePlusExpr(ctx: SEAddSubContext) {\n if (this.typeManager.isNumeric(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new PlusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (this.typeManager.isString(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (\n this.typeManager.overlapsWithString(ctx._left, ctx._right) ||\n this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)\n ) {\n return this.associateContextAndReturn(\n new PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n throw new ExpressionTypeError(\n \"Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.\",\n ctx\n );\n }\n\n visitSEMulDiv: (ctx: SEMulDivContext) => Expr<any> = (ctx) => {\n switch (ctx._op.text) {\n case \"*\":\n return this.associateContextAndReturn(\n new MultiplyExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n case \"/\":\n return this.associateContextAndReturn(\n new DivideExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n visitStringLiteral: (ctx: StringLiteralContext) => Expr<any> = (ctx) => {\n const quotedString = ctx.QUOTED_STRING().getText();\n const text = quotedString.substring(1, quotedString.length - 1);\n return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);\n };\n\n visitNumLiteral: (ctx: NumLiteralContext) => Expr<any> = (ctx) => {\n let val = ctx.INT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n val = ctx.FLOAT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n ExprCompiler.failNode(ctx);\n };\n\n visitSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx.singleExpr());\n };\n visitSEPower: (ctx: SEPowerContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new PowerExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n };\n visitSEUnaryMinus: (ctx: SEUnaryMinusContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new UnaryMinusExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n visitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => Expr<any> = (\n ctx\n ) => {\n switch (ctx._op.text) {\n case \"&&\":\n return this.associateContextAndReturn(\n new AndExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"||\":\n return this.associateContextAndReturn(\n new OrExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"><\":\n return this.associateContextAndReturn(\n new XorExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n }\n throw new SyntaxErrorException(\n ctx._op.text,\n ctx._op.line,\n ctx._op.column,\n `Unknown boolean operator ${ctx._op.text}`\n );\n };\n\n visitBooleanLiteral: (ctx: BooleanLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === \"TRUE\"),\n ctx\n );\n };\n\n visitLogicalLiteral: (ctx: LogicalLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new LogicalLiteralExpr(LogicalValue.UNKNOWN_VALUE),\n ctx\n );\n };\n\n visitSENot: (ctx: SENotContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new NotExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n visitArrayExpr: (ctx: ArrayExprContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())),\n ctx\n );\n };\n\n collectArrayElements: (ctx: ArrayElementListContext) => Array<Expr<any>> = (\n ctx\n ) => {\n if (!isNullish(ctx)) {\n const first = this.visit(ctx.singleExpr());\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n const arr = this.collectArrayElements(rest);\n arr.unshift(first);\n return arr;\n }\n return [first];\n }\n return [];\n };\n\n visitFunctionCall: (ctx: FunctionCallContext) => Expr<any> = (ctx) => {\n const args = isNullish(ctx.exprList())\n ? []\n : this.collectFunctionArguments(ctx.exprList());\n return this.associateContextAndReturn(\n new FunctionExpr(ctx.IDENTIFIER().getText(), args),\n ctx\n );\n };\n\n collectFunctionArguments: (\n ctx: ExprListContext,\n resultSoFar?: Array<Expr<any>>\n ) => Array<Expr<any>> = (ctx, resultSoFar?: Array<Expr<any>>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.visit(ctx.singleExpr()));\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectFunctionArguments(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n private static failNode(ctx: ParserRuleContext): never {\n throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);\n }\n\n visitLiteral: (ctx: LiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.getChild(0));\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["compiler/ExprManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,OAAO,WAAW;IAGtB;QAFiB,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,CAAC;IAET,uBAAuB,CAAC,IAAe,EAAE,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,2DAA2D,QAAQ,CAAC,WAAW,CAAC,IAAI,2CAA2C,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAC1R,GAAG,CACJ,CAAC;SACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"antlr4\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { ValidationException } from \"../error/ValidationException.js\";\nimport { isNullish } from \"../util/IfcExpressionUtils.js\";\n\nexport class ExprManager {\n private readonly contextToExpr = new Map<Expr<any>, ParserRuleContext>();\n\n constructor() {}\n\n public registerExprWithContext(expr: Expr<any>, ctx) {\n const otherCtx = this.contextToExpr.get(expr);\n if (!isNullish(otherCtx) && otherCtx !== ctx) {\n throw new ValidationException(\n `Expression (of kind '${expr.getKind}') at line ${ctx.start.line}, column ${ctx.start.start} is already associated with a ParserRuleContext of type ${otherCtx.constructor.name}' cannot associate it with another one (${ctx.constructor.name} at ${ctx.start.line}:${ctx.start.start}')`,\n ctx\n );\n }\n this.contextToExpr.set(expr, ctx);\n }\n\n getContext(expr: Expr<any>) {\n return this.contextToExpr.get(expr);\n }\n}\n"]}
1
+ {"version":3,"sources":["compiler/ExprManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,OAAO,WAAW;IAGtB;QAFiB,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,CAAC;IAET,uBAAuB,CAAC,IAAe,EAAE,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,2DAA2D,QAAQ,CAAC,WAAW,CAAC,IAAI,2CAA2C,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAC1R,GAAG,CACJ,CAAC;SACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"antlr4ng\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { ValidationException } from \"../error/ValidationException.js\";\nimport { isNullish } from \"../util/IfcExpressionUtils.js\";\n\nexport class ExprManager {\n private readonly contextToExpr = new Map<Expr<any>, ParserRuleContext>();\n\n constructor() {}\n\n public registerExprWithContext(expr: Expr<any>, ctx) {\n const otherCtx = this.contextToExpr.get(expr);\n if (!isNullish(otherCtx) && otherCtx !== ctx) {\n throw new ValidationException(\n `Expression (of kind '${expr.getKind}') at line ${ctx.start.line}, column ${ctx.start.start} is already associated with a ParserRuleContext of type ${otherCtx.constructor.name}' cannot associate it with another one (${ctx.constructor.name} at ${ctx.start.line}:${ctx.start.start}')`,\n ctx\n );\n }\n this.contextToExpr.set(expr, ctx);\n }\n\n getContext(expr: Expr<any>) {\n return this.contextToExpr.get(expr);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import IfcExpressionListener from "../gen/parser/IfcExpressionListener.js";
2
- import { MethodCallChainEndContext, MethodCallChainInnerContext, SEMethodCallContext, } from "../gen/parser/IfcExpressionParser.js";
1
+ import { IfcExpressionListener } from "../gen/parser/IfcExpressionListener.js";
2
+ import { MethodCallChainEndContext, MethodCallChainInnerContext, MethodFunctionCallContext, } from "../gen/parser/IfcExpressionParser.js";
3
3
  import { IfcExpressionFunctions } from "../expression/function/IfcExpressionFunctions.js";
4
4
  import { NoSuchFunctionException } from "../error/NoSuchFunctionException.js";
5
5
  import { InvalidSyntaxException } from "../error/InvalidSyntaxException.js";
@@ -8,13 +8,27 @@ import { TypeManager } from "./TypeManager.js";
8
8
  import { ExpressionTypeError } from "../error/ExpressionTypeError.js";
9
9
  import { isNullish } from "../util/IfcExpressionUtils.js";
10
10
  import { ValidationException } from "../error/ValidationException.js";
11
+ import { BuiltinVariableRegistry, isBuiltinFunctionDefinition, isBuiltinPropertyDefinition, } from "../builtin/BuiltinVariableRegistry.js";
12
+ import { ContextObjectType } from "../type/ContextObjectType.js";
13
+ import { NoSuchMemberException } from "../error/NoSuchMemberException.js";
14
+ import { NoSuchMethodException } from "../error/NoSuchMethodException.js";
15
+ import { WrongFunctionArgumentTypeException } from "../error/WrongFunctionArgumentTypeException.js";
16
+ import { MissingFunctionArgumentException } from "../error/MissingFunctionArgumentException.js";
17
+ import { SpuriousFunctionArgumentException } from "../error/SpuriousFunctionArgumentException.js";
11
18
  export class IfcExpressionValidationListener extends IfcExpressionListener {
12
- constructor() {
19
+ constructor(builtinVariableRegistry = BuiltinVariableRegistry.getDefaultRegistry()) {
13
20
  super();
14
21
  this.methodCallTargetStack = [];
15
22
  this.enterFunctionCall = (ctx) => {
16
23
  if (!IfcExpressionFunctions.isBuiltinFunction(ctx.IDENTIFIER().getText())) {
17
- throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
24
+ const parent = ctx.parent;
25
+ const grandParent = parent?.parent;
26
+ const isMethodAccessor = parent instanceof MethodFunctionCallContext &&
27
+ (grandParent instanceof MethodCallChainInnerContext ||
28
+ grandParent instanceof MethodCallChainEndContext);
29
+ if (!isMethodAccessor) {
30
+ throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
31
+ }
18
32
  }
19
33
  };
20
34
  this.enterSEUnaryMultipleMinus = (ctx) => {
@@ -74,15 +88,12 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
74
88
  this.typeManager.setType(ctx, Types.boolean());
75
89
  };
76
90
  this.exitSEVariableRef = (ctx) => {
77
- switch (ctx._sub.IDENTIFIER().getText()) {
78
- case "property":
79
- this.typeManager.setType(ctx, Type.IFC_PROPERTY_REF);
80
- return;
81
- case "element":
82
- this.typeManager.setType(ctx, Type.IFC_ELEMENT_REF);
83
- return;
91
+ const builtin = this.builtinVariableRegistry.getDefinition(ctx._sub.IDENTIFIER().getText());
92
+ if (builtin) {
93
+ this.typeManager.setType(ctx, builtin.type);
94
+ return;
84
95
  }
85
- throw new ValidationException(`Encountered Variable ref that was neither $property nor $element`, ctx);
96
+ throw new ValidationException(`Encountered Variable ref that was neither a built-in variable nor a configured client builtin`, ctx);
86
97
  };
87
98
  this.exitSEUnaryMinus = (ctx) => {
88
99
  this.typeManager.requireNumeric(ctx._sub);
@@ -116,16 +127,45 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
116
127
  this.pushMethodCallTarget(ctx);
117
128
  };
118
129
  this.exitMethodCallChainEnd = (ctx) => {
130
+ this.typeManager.copyTypeFrom(ctx, ctx._call);
131
+ };
132
+ this.exitMethodFunctionCall = (ctx) => {
119
133
  this.typeManager.copyTypeFrom(ctx, ctx.functionCall());
120
134
  };
135
+ this.exitMethodPropertyAccess = (ctx) => {
136
+ const [_, targetType] = this.popMethodCallTarget(ctx);
137
+ if (!(targetType instanceof ContextObjectType)) {
138
+ throw new NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
139
+ }
140
+ const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
141
+ if (!isBuiltinPropertyDefinition(member)) {
142
+ throw new NoSuchMemberException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
143
+ }
144
+ this.typeManager.setType(ctx, member.valueType);
145
+ };
121
146
  this.exitFunctionCall = (ctx) => {
122
- const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
123
147
  const argumentTypes = this.collectArgumentTypes(ctx.exprList());
124
- const parent = ctx.parentCtx;
125
- if (parent instanceof MethodCallChainInnerContext ||
126
- parent instanceof MethodCallChainEndContext ||
127
- parent instanceof SEMethodCallContext) {
128
- argumentTypes.unshift(this.methodCallTargetStack.pop());
148
+ const parent = ctx.parent;
149
+ const grandParent = parent?.parent;
150
+ const isMethodAccessor = parent instanceof MethodFunctionCallContext &&
151
+ (grandParent instanceof MethodCallChainInnerContext ||
152
+ grandParent instanceof MethodCallChainEndContext);
153
+ if (isMethodAccessor) {
154
+ const [targetCtx, targetType] = this.popMethodCallTarget(ctx);
155
+ if (targetType instanceof ContextObjectType) {
156
+ const member = targetType.getMemberDefinition(ctx.IDENTIFIER().getText());
157
+ if (!isBuiltinFunctionDefinition(member)) {
158
+ throw new NoSuchMethodException(ctx.IDENTIFIER().getText(), targetType.getName(), ctx);
159
+ }
160
+ this.checkBuiltinFunctionArguments(ctx.IDENTIFIER().getText(), member.argumentTypes, argumentTypes, ctx);
161
+ this.typeManager.setType(ctx, member.returnType);
162
+ return;
163
+ }
164
+ argumentTypes.unshift([targetCtx, targetType]);
165
+ }
166
+ const func = IfcExpressionFunctions.getFunction(ctx.IDENTIFIER().getText());
167
+ if (isNullish(func)) {
168
+ throw new NoSuchFunctionException(ctx.IDENTIFIER().getText(), ctx);
129
169
  }
130
170
  const returnType = func.checkArgumentsAndGetReturnType(argumentTypes, ctx);
131
171
  this.typeManager.setType(ctx, returnType);
@@ -163,21 +203,44 @@ export class IfcExpressionValidationListener extends IfcExpressionListener {
163
203
  return resultSoFar;
164
204
  };
165
205
  this.exitVariableRef = (ctx) => {
166
- this.typeManager.setType(ctx, Types.or(Type.IFC_PROPERTY_REF, Type.IFC_ELEMENT_REF));
206
+ const builtinTypes = [Type.IFC_PROPERTY_REF, Type.IFC_ELEMENT_REF];
207
+ const otherBuiltinDefinitions = ["property", "element"]
208
+ .map((name) => this.builtinVariableRegistry.getDefinition(name)?.type)
209
+ .filter((type) => !isNullish(type));
210
+ this.typeManager.setType(ctx, Types.or(...builtinTypes, ...otherBuiltinDefinitions));
167
211
  };
168
212
  this.typeManager = new TypeManager();
213
+ this.builtinVariableRegistry = builtinVariableRegistry;
169
214
  }
170
215
  getTypeManager() {
171
216
  return this.typeManager;
172
217
  }
173
218
  pushMethodCallTarget(ctx) {
174
- if (ctx.parentCtx["_target"]) {
175
- const targetType = this.typeManager.getType(ctx.parentCtx["_target"]);
176
- this.methodCallTargetStack.push([ctx, targetType]);
219
+ if (ctx.parent["_target"]) {
220
+ const targetType = this.typeManager.getType(ctx.parent["_target"]);
221
+ this.methodCallTargetStack.push([ctx.parent["_target"], targetType]);
177
222
  }
178
223
  else {
179
224
  throw new ValidationException("Did not find expected context attribute 'target' in parent rule context", ctx);
180
225
  }
181
226
  }
227
+ checkBuiltinFunctionArguments(functionName, expectedArgumentTypes, providedArgumentTypes, ctx) {
228
+ if (providedArgumentTypes.length > expectedArgumentTypes.length) {
229
+ throw new SpuriousFunctionArgumentException(functionName, "[unexpected argument]", expectedArgumentTypes.length, ctx, `Function expects (at most) ${expectedArgumentTypes.length} arguments`);
230
+ }
231
+ for (let i = 0; i < expectedArgumentTypes.length; i++) {
232
+ if (providedArgumentTypes.length <= i) {
233
+ throw new MissingFunctionArgumentException(functionName, `[arg${i}]`, i, ctx);
234
+ }
235
+ Types.requireWeakIsAssignableFrom(expectedArgumentTypes[i], providedArgumentTypes[i][1], () => new WrongFunctionArgumentTypeException(functionName, `[arg${i}]`, expectedArgumentTypes[i], providedArgumentTypes[i][1], i, providedArgumentTypes[i][0]));
236
+ }
237
+ }
238
+ popMethodCallTarget(ctx) {
239
+ const target = this.methodCallTargetStack.pop();
240
+ if (isNullish(target)) {
241
+ throw new ValidationException("Did not find expected method call target on stack", ctx);
242
+ }
243
+ return target;
244
+ }
182
245
  }
183
246
  //# sourceMappingURL=IfcExpressionValidationListener.js.map