@tsonic/frontend 0.0.13 → 0.0.15
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/dist/.tsbuildinfo +1 -1
- package/dist/graph/builder.js +2 -2
- package/dist/graph/builder.js.map +1 -1
- package/dist/graph/extraction/imports.js +1 -1
- package/dist/graph/extraction/imports.js.map +1 -1
- package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
- package/dist/graph/extraction/orchestrator.js +1 -1
- package/dist/graph/extraction/orchestrator.js.map +1 -1
- package/dist/ir/binding/index.d.ts +134 -0
- package/dist/ir/binding/index.d.ts.map +1 -0
- package/dist/ir/binding/index.js +725 -0
- package/dist/ir/binding/index.js.map +1 -0
- package/dist/ir/binding-resolution.test.js +193 -52
- package/dist/ir/binding-resolution.test.js.map +1 -1
- package/dist/ir/builder/exports.d.ts +20 -2
- package/dist/ir/builder/exports.d.ts.map +1 -1
- package/dist/ir/builder/exports.js +65 -6
- package/dist/ir/builder/exports.js.map +1 -1
- package/dist/ir/builder/imports.d.ts +9 -5
- package/dist/ir/builder/imports.d.ts.map +1 -1
- package/dist/ir/builder/imports.js +20 -31
- package/dist/ir/builder/imports.js.map +1 -1
- package/dist/ir/builder/orchestrator.d.ts +10 -1
- package/dist/ir/builder/orchestrator.d.ts.map +1 -1
- package/dist/ir/builder/orchestrator.js +25 -14
- package/dist/ir/builder/orchestrator.js.map +1 -1
- package/dist/ir/builder/statements.d.ts +7 -1
- package/dist/ir/builder/statements.d.ts.map +1 -1
- package/dist/ir/builder/statements.js +7 -2
- package/dist/ir/builder/statements.js.map +1 -1
- package/dist/ir/builder/types.d.ts +3 -0
- package/dist/ir/builder/types.d.ts.map +1 -1
- package/dist/ir/builder/validation.d.ts +4 -1
- package/dist/ir/builder/validation.d.ts.map +1 -1
- package/dist/ir/builder/validation.js +37 -37
- package/dist/ir/builder/validation.js.map +1 -1
- package/dist/ir/builder.test.js +54 -111
- package/dist/ir/builder.test.js.map +1 -1
- package/dist/ir/clr-type-mappings.d.ts +42 -0
- package/dist/ir/clr-type-mappings.d.ts.map +1 -0
- package/dist/ir/clr-type-mappings.js +139 -0
- package/dist/ir/clr-type-mappings.js.map +1 -0
- package/dist/ir/converters/anonymous-synthesis.d.ts +30 -8
- package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
- package/dist/ir/converters/anonymous-synthesis.js +46 -55
- package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
- package/dist/ir/converters/context.d.ts +40 -0
- package/dist/ir/converters/context.d.ts.map +1 -0
- package/dist/ir/converters/context.js +24 -0
- package/dist/ir/converters/context.js.map +1 -0
- package/dist/ir/converters/expressions/access.d.ts +6 -1
- package/dist/ir/converters/expressions/access.d.ts.map +1 -1
- package/dist/ir/converters/expressions/access.js +239 -15
- package/dist/ir/converters/expressions/access.js.map +1 -1
- package/dist/ir/converters/expressions/calls.d.ts +24 -3
- package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
- package/dist/ir/converters/expressions/calls.js +450 -385
- package/dist/ir/converters/expressions/calls.js.map +1 -1
- package/dist/ir/converters/expressions/collections.d.ts +16 -3
- package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
- package/dist/ir/converters/expressions/collections.js +300 -46
- package/dist/ir/converters/expressions/collections.js.map +1 -1
- package/dist/ir/converters/expressions/functions.d.ts +10 -3
- package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
- package/dist/ir/converters/expressions/functions.js +140 -32
- package/dist/ir/converters/expressions/functions.js.map +1 -1
- package/dist/ir/converters/expressions/helpers.d.ts +22 -23
- package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
- package/dist/ir/converters/expressions/helpers.js +242 -239
- package/dist/ir/converters/expressions/helpers.js.map +1 -1
- package/dist/ir/converters/expressions/index.d.ts +1 -1
- package/dist/ir/converters/expressions/index.d.ts.map +1 -1
- package/dist/ir/converters/expressions/index.js +1 -1
- package/dist/ir/converters/expressions/index.js.map +1 -1
- package/dist/ir/converters/expressions/literals.d.ts +12 -12
- package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
- package/dist/ir/converters/expressions/literals.js +62 -17
- package/dist/ir/converters/expressions/literals.js.map +1 -1
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +5 -2
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -1
- package/dist/ir/converters/expressions/numeric-recovery.test.js +62 -49
- package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -1
- package/dist/ir/converters/expressions/operators.d.ts +13 -4
- package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
- package/dist/ir/converters/expressions/operators.js +179 -33
- package/dist/ir/converters/expressions/operators.js.map +1 -1
- package/dist/ir/converters/expressions/other.d.ts +11 -3
- package/dist/ir/converters/expressions/other.d.ts.map +1 -1
- package/dist/ir/converters/expressions/other.js +26 -10
- package/dist/ir/converters/expressions/other.js.map +1 -1
- package/dist/ir/converters/statements/control/blocks.d.ts +8 -2
- package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/blocks.js +7 -2
- package/dist/ir/converters/statements/control/blocks.js.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.d.ts +14 -4
- package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.js +19 -10
- package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
- package/dist/ir/converters/statements/control/exceptions.d.ts +10 -3
- package/dist/ir/converters/statements/control/exceptions.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/exceptions.js +13 -7
- package/dist/ir/converters/statements/control/exceptions.js.map +1 -1
- package/dist/ir/converters/statements/control/loops.d.ts +16 -5
- package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/loops.js +25 -15
- package/dist/ir/converters/statements/control/loops.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/constructors.d.ts +3 -2
- package/dist/ir/converters/statements/declarations/classes/constructors.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/constructors.js +11 -7
- package/dist/ir/converters/statements/declarations/classes/constructors.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/methods.d.ts +2 -1
- package/dist/ir/converters/statements/declarations/classes/methods.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/methods.js +63 -11
- package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts +2 -1
- package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/orchestrator.js +60 -40
- package/dist/ir/converters/statements/declarations/classes/orchestrator.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts +6 -2
- package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/override-detection.js +49 -50
- package/dist/ir/converters/statements/declarations/classes/override-detection.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/properties.d.ts +9 -1
- package/dist/ir/converters/statements/declarations/classes/properties.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/properties.js +119 -16
- package/dist/ir/converters/statements/declarations/classes/properties.js.map +1 -1
- package/dist/ir/converters/statements/declarations/enums.d.ts +2 -1
- package/dist/ir/converters/statements/declarations/enums.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/enums.js +8 -2
- package/dist/ir/converters/statements/declarations/enums.js.map +1 -1
- package/dist/ir/converters/statements/declarations/functions.d.ts +2 -1
- package/dist/ir/converters/statements/declarations/functions.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/functions.js +11 -6
- package/dist/ir/converters/statements/declarations/functions.js.map +1 -1
- package/dist/ir/converters/statements/declarations/index.d.ts +3 -1
- package/dist/ir/converters/statements/declarations/index.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/index.js +3 -1
- package/dist/ir/converters/statements/declarations/index.js.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.d.ts +3 -2
- package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.js +26 -20
- package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
- package/dist/ir/converters/statements/declarations/registry.d.ts +72 -0
- package/dist/ir/converters/statements/declarations/registry.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/registry.js +92 -0
- package/dist/ir/converters/statements/declarations/registry.js.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts +2 -1
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.js +6 -4
- package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.d.ts +11 -1
- package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.js +123 -19
- package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
- package/dist/ir/converters/statements/declarations.d.ts +4 -1
- package/dist/ir/converters/statements/declarations.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations.js +4 -1
- package/dist/ir/converters/statements/declarations.js.map +1 -1
- package/dist/ir/converters/statements/helpers.d.ts +4 -3
- package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
- package/dist/ir/converters/statements/helpers.js +55 -31
- package/dist/ir/converters/statements/helpers.js.map +1 -1
- package/dist/ir/converters/statements/index.d.ts +1 -1
- package/dist/ir/converters/statements/index.d.ts.map +1 -1
- package/dist/ir/converters/statements/index.js +2 -1
- package/dist/ir/converters/statements/index.js.map +1 -1
- package/dist/ir/expression-converter.d.ts +10 -3
- package/dist/ir/expression-converter.d.ts.map +1 -1
- package/dist/ir/expression-converter.js +150 -56
- package/dist/ir/expression-converter.js.map +1 -1
- package/dist/ir/hierarchical-bindings-e2e.test.js +10 -6
- package/dist/ir/hierarchical-bindings-e2e.test.js.map +1 -1
- package/dist/ir/index.d.ts +5 -0
- package/dist/ir/index.d.ts.map +1 -1
- package/dist/ir/index.js +5 -0
- package/dist/ir/index.js.map +1 -1
- package/dist/ir/no-ts-type-inference.test.d.ts +17 -0
- package/dist/ir/no-ts-type-inference.test.d.ts.map +1 -0
- package/dist/ir/no-ts-type-inference.test.js +171 -0
- package/dist/ir/no-ts-type-inference.test.js.map +1 -0
- package/dist/ir/program-context.d.ts +74 -0
- package/dist/ir/program-context.d.ts.map +1 -0
- package/dist/ir/program-context.js +286 -0
- package/dist/ir/program-context.js.map +1 -0
- package/dist/ir/statement-converter.d.ts +14 -4
- package/dist/ir/statement-converter.d.ts.map +1 -1
- package/dist/ir/statement-converter.js +31 -21
- package/dist/ir/statement-converter.js.map +1 -1
- package/dist/ir/syntax/binding-patterns.d.ts +22 -0
- package/dist/ir/syntax/binding-patterns.d.ts.map +1 -0
- package/dist/ir/syntax/binding-patterns.js +92 -0
- package/dist/ir/syntax/binding-patterns.js.map +1 -0
- package/dist/ir/thisarg-inference.test.d.ts +8 -0
- package/dist/ir/thisarg-inference.test.d.ts.map +1 -0
- package/dist/ir/thisarg-inference.test.js +94 -0
- package/dist/ir/thisarg-inference.test.js.map +1 -0
- package/dist/ir/type-converter.d.ts +5 -2
- package/dist/ir/type-converter.d.ts.map +1 -1
- package/dist/ir/type-converter.js +5 -2
- package/dist/ir/type-converter.js.map +1 -1
- package/dist/ir/type-system/core.d.ts +29 -0
- package/dist/ir/type-system/core.d.ts.map +1 -0
- package/dist/ir/type-system/core.js +456 -0
- package/dist/ir/type-system/core.js.map +1 -0
- package/dist/ir/type-system/index.d.ts +21 -0
- package/dist/ir/type-system/index.d.ts.map +1 -0
- package/dist/ir/type-system/index.js +43 -0
- package/dist/ir/type-system/index.js.map +1 -0
- package/dist/ir/type-system/internal/handle-types.d.ts +98 -0
- package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -0
- package/dist/ir/type-system/internal/handle-types.js +13 -0
- package/dist/ir/type-system/internal/handle-types.js.map +1 -0
- package/dist/ir/type-system/internal/nominal-env.d.ts +66 -0
- package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -0
- package/dist/ir/type-system/internal/nominal-env.js +301 -0
- package/dist/ir/type-system/internal/nominal-env.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/arrays.d.ts +11 -0
- package/dist/ir/type-system/internal/type-converter/arrays.d.ts.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/arrays.js +2 -2
- package/dist/ir/type-system/internal/type-converter/arrays.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/converter.d.ts +17 -0
- package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/converter.js +16 -0
- package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/functions.d.ts +14 -0
- package/dist/ir/type-system/internal/type-converter/functions.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/functions.js +66 -0
- package/dist/ir/type-system/internal/type-converter/functions.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/index.d.ts +11 -0
- package/dist/ir/type-system/internal/type-converter/index.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/index.js +11 -0
- package/dist/ir/type-system/internal/type-converter/index.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/inference.d.ts +37 -0
- package/dist/ir/type-system/internal/type-converter/inference.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/inference.js +32 -0
- package/dist/ir/type-system/internal/type-converter/inference.js.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.d.ts +1 -1
- package/dist/ir/type-system/internal/type-converter/literals.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/literals.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/objects.d.ts +20 -0
- package/dist/ir/type-system/internal/type-converter/objects.d.ts.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/objects.js +56 -6
- package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.d.ts +3 -2
- package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.js +63 -21
- package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/patterns.d.ts +12 -0
- package/dist/ir/type-system/internal/type-converter/patterns.d.ts.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/patterns.js +22 -6
- package/dist/ir/type-system/internal/type-converter/patterns.js.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.d.ts +1 -1
- package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/references.d.ts +3 -2
- package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/references.js +551 -0
- package/dist/ir/type-system/internal/type-converter/references.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts +15 -0
- package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/unions-intersections.js +22 -0
- package/dist/ir/type-system/internal/type-converter/unions-intersections.js.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.d.ts +23 -36
- package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/utility-types.js +879 -0
- package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts.map +1 -0
- package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.js +398 -120
- package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter.d.ts +9 -0
- package/dist/ir/type-system/internal/type-converter.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter.js +9 -0
- package/dist/ir/type-system/internal/type-converter.js.map +1 -0
- package/dist/ir/type-system/internal/type-registry.d.ts +107 -0
- package/dist/ir/type-system/internal/type-registry.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-registry.js +534 -0
- package/dist/ir/type-system/internal/type-registry.js.map +1 -0
- package/dist/ir/type-system/internal/universe/alias-table.d.ts +92 -0
- package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/alias-table.js +222 -0
- package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +44 -0
- package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-catalog.js +1176 -0
- package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -0
- package/dist/ir/type-system/internal/universe/index.d.ts +26 -0
- package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/index.js +30 -0
- package/dist/ir/type-system/internal/universe/index.js.map +1 -0
- package/dist/ir/type-system/internal/universe/resolution.d.ts +115 -0
- package/dist/ir/type-system/internal/universe/resolution.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/resolution.js +181 -0
- package/dist/ir/type-system/internal/universe/resolution.js.map +1 -0
- package/dist/ir/type-system/internal/universe/source-catalog.d.ts +62 -0
- package/dist/ir/type-system/internal/universe/source-catalog.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/source-catalog.js +91 -0
- package/dist/ir/type-system/internal/universe/source-catalog.js.map +1 -0
- package/dist/ir/type-system/internal/universe/types.d.ts +436 -0
- package/dist/ir/type-system/internal/universe/types.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/types.js +69 -0
- package/dist/ir/type-system/internal/universe/types.js.map +1 -0
- package/dist/ir/type-system/internal/universe/unified-universe.d.ts +70 -0
- package/dist/ir/type-system/internal/universe/unified-universe.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/unified-universe.js +319 -0
- package/dist/ir/type-system/internal/universe/unified-universe.js.map +1 -0
- package/dist/ir/type-system/type-system.d.ts +617 -0
- package/dist/ir/type-system/type-system.d.ts.map +1 -0
- package/dist/ir/type-system/type-system.js +2420 -0
- package/dist/ir/type-system/type-system.js.map +1 -0
- package/dist/ir/type-system/types.d.ts +176 -0
- package/dist/ir/type-system/types.d.ts.map +1 -0
- package/dist/ir/type-system/types.js +80 -0
- package/dist/ir/type-system/types.js.map +1 -0
- package/dist/ir/type-universe/assembly-catalog.d.ts +44 -0
- package/dist/ir/type-universe/assembly-catalog.d.ts.map +1 -0
- package/dist/ir/type-universe/assembly-catalog.js +532 -0
- package/dist/ir/type-universe/assembly-catalog.js.map +1 -0
- package/dist/ir/type-universe/assembly-catalog.test.d.ts +7 -0
- package/dist/ir/type-universe/assembly-catalog.test.d.ts.map +1 -0
- package/dist/ir/type-universe/assembly-catalog.test.js +105 -0
- package/dist/ir/type-universe/assembly-catalog.test.js.map +1 -0
- package/dist/ir/type-universe/index.d.ts +19 -0
- package/dist/ir/type-universe/index.d.ts.map +1 -0
- package/dist/ir/type-universe/index.js +21 -0
- package/dist/ir/type-universe/index.js.map +1 -0
- package/dist/ir/type-universe/types.d.ts +436 -0
- package/dist/ir/type-universe/types.d.ts.map +1 -0
- package/dist/ir/type-universe/types.js +69 -0
- package/dist/ir/type-universe/types.js.map +1 -0
- package/dist/ir/type-universe/unified-catalog.d.ts +70 -0
- package/dist/ir/type-universe/unified-catalog.d.ts.map +1 -0
- package/dist/ir/type-universe/unified-catalog.js +319 -0
- package/dist/ir/type-universe/unified-catalog.js.map +1 -0
- package/dist/ir/type-universe/unified-catalog.test.d.ts +7 -0
- package/dist/ir/type-universe/unified-catalog.test.d.ts.map +1 -0
- package/dist/ir/type-universe/unified-catalog.test.js +135 -0
- package/dist/ir/type-universe/unified-catalog.test.js.map +1 -0
- package/dist/ir/types/expressions.d.ts +74 -2
- package/dist/ir/types/expressions.d.ts.map +1 -1
- package/dist/ir/types/helpers.d.ts +22 -2
- package/dist/ir/types/helpers.d.ts.map +1 -1
- package/dist/ir/types/index.d.ts +4 -2
- package/dist/ir/types/index.d.ts.map +1 -1
- package/dist/ir/types/index.js +1 -0
- package/dist/ir/types/index.js.map +1 -1
- package/dist/ir/types/ir-substitution.d.ts +144 -0
- package/dist/ir/types/ir-substitution.d.ts.map +1 -0
- package/dist/ir/types/ir-substitution.js +569 -0
- package/dist/ir/types/ir-substitution.js.map +1 -0
- package/dist/ir/types/ir-types.d.ts +9 -3
- package/dist/ir/types/ir-types.d.ts.map +1 -1
- package/dist/ir/types/numeric-helpers.d.ts +2 -1
- package/dist/ir/types/numeric-helpers.d.ts.map +1 -1
- package/dist/ir/types/numeric-helpers.js +9 -3
- package/dist/ir/types/numeric-helpers.js.map +1 -1
- package/dist/ir/types/statements.d.ts +13 -1
- package/dist/ir/types/statements.d.ts.map +1 -1
- package/dist/ir/types.d.ts +1 -1
- package/dist/ir/types.d.ts.map +1 -1
- package/dist/ir/types.js.map +1 -1
- package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
- package/dist/ir/validation/anonymous-type-lowering-pass.js +165 -7
- package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
- package/dist/ir/validation/arrow-return-finalization-pass.d.ts +28 -0
- package/dist/ir/validation/arrow-return-finalization-pass.d.ts.map +1 -0
- package/dist/ir/validation/arrow-return-finalization-pass.js +416 -0
- package/dist/ir/validation/arrow-return-finalization-pass.js.map +1 -0
- package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
- package/dist/ir/validation/attribute-collection-pass.js +40 -6
- package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
- package/dist/ir/validation/attribute-collection-pass.test.js +43 -36
- package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
- package/dist/ir/validation/index.d.ts +3 -0
- package/dist/ir/validation/index.d.ts.map +1 -1
- package/dist/ir/validation/index.js +3 -0
- package/dist/ir/validation/index.js.map +1 -1
- package/dist/ir/validation/numeric-coercion-pass.d.ts +22 -16
- package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -1
- package/dist/ir/validation/numeric-coercion-pass.js +159 -51
- package/dist/ir/validation/numeric-coercion-pass.js.map +1 -1
- package/dist/ir/validation/numeric-invariants.test.js +72 -108
- package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
- package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
- package/dist/ir/validation/numeric-proof-pass.js +71 -23
- package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
- package/dist/ir/validation/rest-type-synthesis-pass.d.ts +24 -0
- package/dist/ir/validation/rest-type-synthesis-pass.d.ts.map +1 -0
- package/dist/ir/validation/rest-type-synthesis-pass.js +417 -0
- package/dist/ir/validation/rest-type-synthesis-pass.js.map +1 -0
- package/dist/ir/validation/soundness-gate.d.ts +11 -1
- package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
- package/dist/ir/validation/soundness-gate.js +42 -10
- package/dist/ir/validation/soundness-gate.js.map +1 -1
- package/dist/ir/validation/soundness-gate.test.js +19 -2
- package/dist/ir/validation/soundness-gate.test.js.map +1 -1
- package/dist/ir/validation/virtual-marking-pass.d.ts +16 -0
- package/dist/ir/validation/virtual-marking-pass.d.ts.map +1 -0
- package/dist/ir/validation/virtual-marking-pass.js +77 -0
- package/dist/ir/validation/virtual-marking-pass.js.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.test.js +2 -2
- package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
- package/dist/program/bindings.d.ts +28 -0
- package/dist/program/bindings.d.ts.map +1 -1
- package/dist/program/bindings.js +204 -2
- package/dist/program/bindings.js.map +1 -1
- package/dist/program/bindings.test.js +30 -0
- package/dist/program/bindings.test.js.map +1 -1
- package/dist/program/creation.d.ts.map +1 -1
- package/dist/program/creation.js +251 -4
- package/dist/program/creation.js.map +1 -1
- package/dist/program/dependency-graph.d.ts.map +1 -1
- package/dist/program/dependency-graph.js +25 -25
- package/dist/program/dependency-graph.js.map +1 -1
- package/dist/program/diagnostics.d.ts.map +1 -1
- package/dist/program/diagnostics.js +6 -0
- package/dist/program/diagnostics.js.map +1 -1
- package/dist/program/index.d.ts +1 -1
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/types.d.ts +8 -8
- package/dist/program/types.d.ts.map +1 -1
- package/dist/resolver/clr-bindings-resolver.d.ts +1 -0
- package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
- package/dist/resolver/clr-bindings-resolver.js +90 -34
- package/dist/resolver/clr-bindings-resolver.js.map +1 -1
- package/dist/resolver/import-resolution.d.ts +16 -1
- package/dist/resolver/import-resolution.d.ts.map +1 -1
- package/dist/resolver/import-resolution.js +29 -12
- package/dist/resolver/import-resolution.js.map +1 -1
- package/dist/resolver/naming.d.ts +1 -1
- package/dist/resolver/naming.d.ts.map +1 -1
- package/dist/resolver/naming.js +13 -2
- package/dist/resolver/naming.js.map +1 -1
- package/dist/resolver.test.js +4 -0
- package/dist/resolver.test.js.map +1 -1
- package/dist/symbol-table/builder.d.ts +3 -1
- package/dist/symbol-table/builder.d.ts.map +1 -1
- package/dist/symbol-table/builder.js +9 -8
- package/dist/symbol-table/builder.js.map +1 -1
- package/dist/symbol-table/types.d.ts +2 -2
- package/dist/symbol-table/types.d.ts.map +1 -1
- package/dist/types/diagnostic.d.ts +12 -2
- package/dist/types/diagnostic.d.ts.map +1 -1
- package/dist/types/diagnostic.js +5 -1
- package/dist/types/diagnostic.js.map +1 -1
- package/dist/validation/extension-methods.d.ts +17 -0
- package/dist/validation/extension-methods.d.ts.map +1 -0
- package/dist/validation/extension-methods.js +133 -0
- package/dist/validation/extension-methods.js.map +1 -0
- package/dist/validation/generics.d.ts.map +1 -1
- package/dist/validation/generics.js +1 -129
- package/dist/validation/generics.js.map +1 -1
- package/dist/validation/imports.js +1 -1
- package/dist/validation/imports.js.map +1 -1
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +1 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/orchestrator.d.ts.map +1 -1
- package/dist/validation/orchestrator.js +2 -0
- package/dist/validation/orchestrator.js.map +1 -1
- package/dist/validation/static-safety.d.ts +1 -0
- package/dist/validation/static-safety.d.ts.map +1 -1
- package/dist/validation/static-safety.js +366 -96
- package/dist/validation/static-safety.js.map +1 -1
- package/dist/validator.test.js +77 -1
- package/dist/validator.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/ir/type-converter/arrays.d.ts +0 -10
- package/dist/ir/type-converter/arrays.d.ts.map +0 -1
- package/dist/ir/type-converter/arrays.js.map +0 -1
- package/dist/ir/type-converter/converter.d.ts +0 -6
- package/dist/ir/type-converter/converter.d.ts.map +0 -1
- package/dist/ir/type-converter/converter.js +0 -6
- package/dist/ir/type-converter/converter.js.map +0 -1
- package/dist/ir/type-converter/functions.d.ts +0 -10
- package/dist/ir/type-converter/functions.d.ts.map +0 -1
- package/dist/ir/type-converter/functions.js +0 -15
- package/dist/ir/type-converter/functions.js.map +0 -1
- package/dist/ir/type-converter/index.d.ts +0 -7
- package/dist/ir/type-converter/index.d.ts.map +0 -1
- package/dist/ir/type-converter/index.js +0 -7
- package/dist/ir/type-converter/index.js.map +0 -1
- package/dist/ir/type-converter/inference.d.ts +0 -32
- package/dist/ir/type-converter/inference.d.ts.map +0 -1
- package/dist/ir/type-converter/inference.js +0 -297
- package/dist/ir/type-converter/inference.js.map +0 -1
- package/dist/ir/type-converter/literals.d.ts.map +0 -1
- package/dist/ir/type-converter/literals.js.map +0 -1
- package/dist/ir/type-converter/objects.d.ts +0 -16
- package/dist/ir/type-converter/objects.d.ts.map +0 -1
- package/dist/ir/type-converter/objects.js.map +0 -1
- package/dist/ir/type-converter/orchestrator.d.ts.map +0 -1
- package/dist/ir/type-converter/orchestrator.js.map +0 -1
- package/dist/ir/type-converter/patterns.d.ts +0 -10
- package/dist/ir/type-converter/patterns.d.ts.map +0 -1
- package/dist/ir/type-converter/patterns.js.map +0 -1
- package/dist/ir/type-converter/primitives.d.ts.map +0 -1
- package/dist/ir/type-converter/primitives.js.map +0 -1
- package/dist/ir/type-converter/references.d.ts.map +0 -1
- package/dist/ir/type-converter/references.js +0 -371
- package/dist/ir/type-converter/references.js.map +0 -1
- package/dist/ir/type-converter/unions-intersections.d.ts +0 -14
- package/dist/ir/type-converter/unions-intersections.d.ts.map +0 -1
- package/dist/ir/type-converter/unions-intersections.js +0 -22
- package/dist/ir/type-converter/unions-intersections.js.map +0 -1
- package/dist/ir/type-converter/utility-types.d.ts.map +0 -1
- package/dist/ir/type-converter/utility-types.js +0 -528
- package/dist/ir/type-converter/utility-types.js.map +0 -1
- package/dist/ir/type-converter/utility-types.test.d.ts.map +0 -1
- package/dist/ir/type-converter/utility-types.test.js.map +0 -1
- /package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.js +0 -0
- /package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.js +0 -0
- /package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.d.ts +0 -0
|
@@ -0,0 +1,725 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding Layer — TS Symbol Resolution with Opaque Handles
|
|
3
|
+
*
|
|
4
|
+
* This module wraps TypeScript's symbol resolution APIs and returns opaque
|
|
5
|
+
* handles (DeclId, SignatureId, MemberId) instead of ts.Symbol/ts.Signature.
|
|
6
|
+
*
|
|
7
|
+
* ALLOWED APIs (symbol resolution only):
|
|
8
|
+
* - checker.getSymbolAtLocation(node) — Find symbol at AST node
|
|
9
|
+
* - checker.getAliasedSymbol(symbol) — Resolve import alias
|
|
10
|
+
* - checker.getExportSymbolOfSymbol(symbol) — Resolve export
|
|
11
|
+
* - symbol.getDeclarations() — Get AST declaration nodes
|
|
12
|
+
* - checker.getResolvedSignature(call) — Pick overload (type from declaration)
|
|
13
|
+
*
|
|
14
|
+
* BANNED APIs (these produce ts.Type, which violates INV-0):
|
|
15
|
+
* - checker.getTypeAtLocation
|
|
16
|
+
* - checker.getTypeOfSymbolAtLocation
|
|
17
|
+
* - checker.getContextualType
|
|
18
|
+
* - checker.typeToTypeNode
|
|
19
|
+
*/
|
|
20
|
+
import ts from "typescript";
|
|
21
|
+
import { makeDeclId, makeSignatureId, makeMemberId, makeTypeSyntaxId, } from "../type-system/types.js";
|
|
22
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
23
|
+
// BINDING IMPLEMENTATION
|
|
24
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
25
|
+
/**
|
|
26
|
+
* Create a Binding instance for a TypeScript program.
|
|
27
|
+
*
|
|
28
|
+
* Returns BindingInternal which includes _getHandleRegistry() for TypeSystem.
|
|
29
|
+
* Cast to Binding when passing to regular converters.
|
|
30
|
+
*/
|
|
31
|
+
export const createBinding = (checker) => {
|
|
32
|
+
// Internal registries mapping handles to underlying TS objects
|
|
33
|
+
const declMap = new Map();
|
|
34
|
+
const signatureMap = new Map();
|
|
35
|
+
const memberMap = new Map(); // key: "declId:name"
|
|
36
|
+
const typeSyntaxMap = new Map(); // TypeSyntaxId → TypeNode
|
|
37
|
+
// Auto-increment IDs
|
|
38
|
+
const nextDeclId = { value: 0 };
|
|
39
|
+
const nextSignatureId = { value: 0 };
|
|
40
|
+
const nextTypeSyntaxId = { value: 0 };
|
|
41
|
+
// Symbol to DeclId cache (avoid duplicate DeclIds for same symbol)
|
|
42
|
+
const symbolToDeclId = new Map();
|
|
43
|
+
const signatureToId = new Map();
|
|
44
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
45
|
+
// INTERNAL HELPERS
|
|
46
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
47
|
+
const getOrCreateDeclId = (symbol) => {
|
|
48
|
+
const existing = symbolToDeclId.get(symbol);
|
|
49
|
+
if (existing)
|
|
50
|
+
return existing;
|
|
51
|
+
const id = makeDeclId(nextDeclId.value++);
|
|
52
|
+
symbolToDeclId.set(symbol, id);
|
|
53
|
+
// Get declaration info
|
|
54
|
+
const decl = symbol.getDeclarations()?.[0];
|
|
55
|
+
// Capture class member names for override detection (TS-version safe)
|
|
56
|
+
const classMemberNames = decl && ts.isClassDeclaration(decl)
|
|
57
|
+
? extractClassMemberNames(decl)
|
|
58
|
+
: undefined;
|
|
59
|
+
const entry = {
|
|
60
|
+
symbol,
|
|
61
|
+
decl,
|
|
62
|
+
typeNode: decl ? getTypeNodeFromDeclaration(decl) : undefined,
|
|
63
|
+
kind: decl ? getDeclKind(decl) : "variable",
|
|
64
|
+
fqName: symbol.getName(),
|
|
65
|
+
classMemberNames,
|
|
66
|
+
};
|
|
67
|
+
declMap.set(id.id, entry);
|
|
68
|
+
return id;
|
|
69
|
+
};
|
|
70
|
+
const getOrCreateSignatureId = (signature) => {
|
|
71
|
+
const existing = signatureToId.get(signature);
|
|
72
|
+
if (existing)
|
|
73
|
+
return existing;
|
|
74
|
+
const id = makeSignatureId(nextSignatureId.value++);
|
|
75
|
+
signatureToId.set(signature, id);
|
|
76
|
+
// Extract signature info from declaration
|
|
77
|
+
const decl = signature.getDeclaration();
|
|
78
|
+
// Extract declaring identity (CRITICAL for Alice's spec: resolveCall needs this)
|
|
79
|
+
const declaringIdentity = extractDeclaringIdentity(decl, checker);
|
|
80
|
+
// Extract type predicate from return type (ALICE'S SPEC: pure syntax inspection)
|
|
81
|
+
const returnTypeNode = getReturnTypeNode(decl);
|
|
82
|
+
const typePredicate = extractTypePredicate(returnTypeNode, decl);
|
|
83
|
+
const entry = {
|
|
84
|
+
signature,
|
|
85
|
+
decl,
|
|
86
|
+
parameters: extractParameterNodes(decl),
|
|
87
|
+
returnTypeNode,
|
|
88
|
+
typeParameters: extractTypeParameterNodes(decl),
|
|
89
|
+
declaringTypeTsName: declaringIdentity?.typeTsName,
|
|
90
|
+
declaringMemberName: declaringIdentity?.memberName,
|
|
91
|
+
typePredicate,
|
|
92
|
+
};
|
|
93
|
+
signatureMap.set(id.id, entry);
|
|
94
|
+
return id;
|
|
95
|
+
};
|
|
96
|
+
const getOrCreateMemberId = (ownerDeclId, memberName, memberSymbol) => {
|
|
97
|
+
const key = `${ownerDeclId.id}:${memberName}`;
|
|
98
|
+
const existing = memberMap.get(key);
|
|
99
|
+
if (existing)
|
|
100
|
+
return existing.memberId;
|
|
101
|
+
const id = makeMemberId(ownerDeclId, memberName);
|
|
102
|
+
const decl = memberSymbol.getDeclarations()?.[0];
|
|
103
|
+
const entry = {
|
|
104
|
+
memberId: id,
|
|
105
|
+
symbol: memberSymbol,
|
|
106
|
+
decl,
|
|
107
|
+
name: memberName,
|
|
108
|
+
typeNode: decl ? getMemberTypeAnnotation(decl) : undefined,
|
|
109
|
+
isOptional: isOptionalMember(memberSymbol),
|
|
110
|
+
isReadonly: isReadonlyMember(decl),
|
|
111
|
+
};
|
|
112
|
+
memberMap.set(key, entry);
|
|
113
|
+
return id;
|
|
114
|
+
};
|
|
115
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
116
|
+
// BINDING IMPLEMENTATION
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
118
|
+
const resolveIdentifier = (node) => {
|
|
119
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
120
|
+
if (!symbol)
|
|
121
|
+
return undefined;
|
|
122
|
+
// Follow aliases for imports
|
|
123
|
+
const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
|
|
124
|
+
? checker.getAliasedSymbol(symbol)
|
|
125
|
+
: symbol;
|
|
126
|
+
return getOrCreateDeclId(resolvedSymbol);
|
|
127
|
+
};
|
|
128
|
+
const resolveTypeReference = (node) => {
|
|
129
|
+
const typeName = node.typeName;
|
|
130
|
+
const symbol = ts.isIdentifier(typeName)
|
|
131
|
+
? checker.getSymbolAtLocation(typeName)
|
|
132
|
+
: checker.getSymbolAtLocation(typeName.right);
|
|
133
|
+
if (!symbol)
|
|
134
|
+
return undefined;
|
|
135
|
+
// Follow aliases
|
|
136
|
+
const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
|
|
137
|
+
? checker.getAliasedSymbol(symbol)
|
|
138
|
+
: symbol;
|
|
139
|
+
return getOrCreateDeclId(resolvedSymbol);
|
|
140
|
+
};
|
|
141
|
+
const resolvePropertyAccess = (node) => {
|
|
142
|
+
const rawPropSymbol = checker.getSymbolAtLocation(node.name);
|
|
143
|
+
if (!rawPropSymbol)
|
|
144
|
+
return undefined;
|
|
145
|
+
const propSymbol = rawPropSymbol.flags & ts.SymbolFlags.Alias
|
|
146
|
+
? checker.getAliasedSymbol(rawPropSymbol)
|
|
147
|
+
: rawPropSymbol;
|
|
148
|
+
// Get owner type's declaration
|
|
149
|
+
const rawOwnerSymbol = checker.getSymbolAtLocation(node.expression);
|
|
150
|
+
// Note: `getSymbolAtLocation(node.expression)` can be undefined for receivers
|
|
151
|
+
// that are not identifiers/member-accesses (e.g., `xs.where(...).select`).
|
|
152
|
+
// In that case we still want a stable MemberId for the member symbol itself,
|
|
153
|
+
// so we key the member entry off the member symbol's own DeclId.
|
|
154
|
+
const ownerSymbol = rawOwnerSymbol
|
|
155
|
+
? rawOwnerSymbol.flags & ts.SymbolFlags.Alias
|
|
156
|
+
? checker.getAliasedSymbol(rawOwnerSymbol)
|
|
157
|
+
: rawOwnerSymbol
|
|
158
|
+
: undefined;
|
|
159
|
+
const ownerDeclId = getOrCreateDeclId(ownerSymbol ?? propSymbol);
|
|
160
|
+
return getOrCreateMemberId(ownerDeclId, node.name.text, propSymbol);
|
|
161
|
+
};
|
|
162
|
+
const resolveElementAccess = (_node) => {
|
|
163
|
+
// Element access member resolution requires type-level analysis
|
|
164
|
+
// Return undefined (member not resolved via handles)
|
|
165
|
+
return undefined;
|
|
166
|
+
};
|
|
167
|
+
const resolveCallSignature = (node) => {
|
|
168
|
+
const signature = checker.getResolvedSignature(node);
|
|
169
|
+
if (!signature)
|
|
170
|
+
return undefined;
|
|
171
|
+
// TypeScript can produce a resolved signature without a declaration for
|
|
172
|
+
// implicit default constructors (e.g., `super()` when the base class has
|
|
173
|
+
// no explicit constructor). We still want a SignatureId so TypeSystem can
|
|
174
|
+
// treat this call deterministically as `void`.
|
|
175
|
+
if (signature.declaration === undefined) {
|
|
176
|
+
return node.expression.kind === ts.SyntaxKind.SuperKeyword
|
|
177
|
+
? getOrCreateSignatureId(signature)
|
|
178
|
+
: undefined;
|
|
179
|
+
}
|
|
180
|
+
return getOrCreateSignatureId(signature);
|
|
181
|
+
};
|
|
182
|
+
const resolveConstructorSignature = (node) => {
|
|
183
|
+
const signature = checker.getResolvedSignature(node);
|
|
184
|
+
if (!signature)
|
|
185
|
+
return undefined;
|
|
186
|
+
const sigId = getOrCreateSignatureId(signature);
|
|
187
|
+
// For implicit default constructors, TypeScript may return a signature with no declaration.
|
|
188
|
+
// We still need a SignatureEntry that identifies the constructed type so TypeSystem can
|
|
189
|
+
// synthesize the constructor return type deterministically.
|
|
190
|
+
const entry = signatureMap.get(sigId.id);
|
|
191
|
+
if (entry && !entry.decl) {
|
|
192
|
+
const expr = node.expression;
|
|
193
|
+
const symbol = (() => {
|
|
194
|
+
if (ts.isIdentifier(expr))
|
|
195
|
+
return checker.getSymbolAtLocation(expr);
|
|
196
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
197
|
+
return checker.getSymbolAtLocation(expr.name);
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
})();
|
|
201
|
+
const resolvedSymbol = symbol && symbol.flags & ts.SymbolFlags.Alias
|
|
202
|
+
? checker.getAliasedSymbol(symbol)
|
|
203
|
+
: symbol;
|
|
204
|
+
const decl = resolvedSymbol?.getDeclarations()?.[0];
|
|
205
|
+
const declaringTypeTsName = (() => {
|
|
206
|
+
if (decl && ts.isClassDeclaration(decl) && decl.name)
|
|
207
|
+
return decl.name.text;
|
|
208
|
+
if (resolvedSymbol)
|
|
209
|
+
return resolvedSymbol.getName();
|
|
210
|
+
if (ts.isIdentifier(expr))
|
|
211
|
+
return expr.text;
|
|
212
|
+
if (ts.isPropertyAccessExpression(expr))
|
|
213
|
+
return expr.name.text;
|
|
214
|
+
return undefined;
|
|
215
|
+
})();
|
|
216
|
+
if (declaringTypeTsName) {
|
|
217
|
+
signatureMap.set(sigId.id, {
|
|
218
|
+
...entry,
|
|
219
|
+
declaringTypeTsName,
|
|
220
|
+
declaringMemberName: "constructor",
|
|
221
|
+
typeParameters: decl && ts.isClassDeclaration(decl)
|
|
222
|
+
? convertTypeParameterDeclarations(decl.typeParameters)
|
|
223
|
+
: undefined,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return sigId;
|
|
228
|
+
};
|
|
229
|
+
const resolveImport = (node) => {
|
|
230
|
+
const symbol = checker.getSymbolAtLocation(node.name);
|
|
231
|
+
if (!symbol)
|
|
232
|
+
return undefined;
|
|
233
|
+
const aliased = checker.getAliasedSymbol(symbol);
|
|
234
|
+
return getOrCreateDeclId(aliased);
|
|
235
|
+
};
|
|
236
|
+
const resolveShorthandAssignment = (node) => {
|
|
237
|
+
const symbol = checker.getShorthandAssignmentValueSymbol(node);
|
|
238
|
+
if (!symbol)
|
|
239
|
+
return undefined;
|
|
240
|
+
return getOrCreateDeclId(symbol);
|
|
241
|
+
};
|
|
242
|
+
const getDeclaringTypeNameOfMember = (member) => {
|
|
243
|
+
const key = `${member.declId.id}:${member.name}`;
|
|
244
|
+
const entry = memberMap.get(key);
|
|
245
|
+
const decl = entry?.decl;
|
|
246
|
+
if (!decl)
|
|
247
|
+
return undefined;
|
|
248
|
+
const parent = decl.parent;
|
|
249
|
+
if (ts.isInterfaceDeclaration(parent) && parent.name)
|
|
250
|
+
return parent.name.text;
|
|
251
|
+
if (ts.isClassDeclaration(parent) && parent.name)
|
|
252
|
+
return parent.name.text;
|
|
253
|
+
if (ts.isTypeAliasDeclaration(parent) && parent.name)
|
|
254
|
+
return parent.name.text;
|
|
255
|
+
return undefined;
|
|
256
|
+
};
|
|
257
|
+
const getFullyQualifiedName = (declId) => {
|
|
258
|
+
const entry = declMap.get(declId.id);
|
|
259
|
+
if (!entry)
|
|
260
|
+
return undefined;
|
|
261
|
+
return checker.getFullyQualifiedName(entry.symbol);
|
|
262
|
+
};
|
|
263
|
+
const getTypePredicateOfSignature = (sigId) => {
|
|
264
|
+
const entry = signatureMap.get(sigId.id);
|
|
265
|
+
if (!entry)
|
|
266
|
+
return undefined;
|
|
267
|
+
const predicate = checker.getTypePredicateOfSignature(entry.signature);
|
|
268
|
+
if (!predicate || predicate.kind !== ts.TypePredicateKind.Identifier) {
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
kind: "typePredicate",
|
|
273
|
+
parameterIndex: predicate.parameterIndex ?? 0,
|
|
274
|
+
typeNode: predicate.type
|
|
275
|
+
? checker.typeToTypeNode(predicate.type, undefined, ts.NodeBuilderFlags.None)
|
|
276
|
+
: undefined,
|
|
277
|
+
};
|
|
278
|
+
};
|
|
279
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
280
|
+
// HANDLE REGISTRY IMPLEMENTATION
|
|
281
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
282
|
+
const handleRegistry = {
|
|
283
|
+
getDecl: (id) => {
|
|
284
|
+
const entry = declMap.get(id.id);
|
|
285
|
+
if (!entry)
|
|
286
|
+
return undefined;
|
|
287
|
+
return {
|
|
288
|
+
typeNode: entry.typeNode,
|
|
289
|
+
kind: entry.kind,
|
|
290
|
+
fqName: entry.fqName,
|
|
291
|
+
declNode: entry.decl,
|
|
292
|
+
classMemberNames: entry.classMemberNames,
|
|
293
|
+
};
|
|
294
|
+
},
|
|
295
|
+
getSignature: (id) => {
|
|
296
|
+
const entry = signatureMap.get(id.id);
|
|
297
|
+
if (!entry)
|
|
298
|
+
return undefined;
|
|
299
|
+
return {
|
|
300
|
+
parameters: entry.parameters,
|
|
301
|
+
returnTypeNode: entry.returnTypeNode,
|
|
302
|
+
typeParameters: entry.typeParameters,
|
|
303
|
+
// CRITICAL for Alice's spec: declaring identity for resolveCall()
|
|
304
|
+
// Uses simple TS name, resolved via UnifiedTypeCatalog.resolveTsName()
|
|
305
|
+
declaringTypeTsName: entry.declaringTypeTsName,
|
|
306
|
+
declaringMemberName: entry.declaringMemberName,
|
|
307
|
+
// Type predicate extracted at registration time (Alice's spec)
|
|
308
|
+
typePredicate: entry.typePredicate,
|
|
309
|
+
};
|
|
310
|
+
},
|
|
311
|
+
getMember: (id) => {
|
|
312
|
+
const key = `${id.declId.id}:${id.name}`;
|
|
313
|
+
const entry = memberMap.get(key);
|
|
314
|
+
if (!entry)
|
|
315
|
+
return undefined;
|
|
316
|
+
return {
|
|
317
|
+
name: entry.name,
|
|
318
|
+
declNode: entry.decl,
|
|
319
|
+
typeNode: entry.typeNode,
|
|
320
|
+
isOptional: entry.isOptional,
|
|
321
|
+
isReadonly: entry.isReadonly,
|
|
322
|
+
};
|
|
323
|
+
},
|
|
324
|
+
getTypeSyntax: (id) => {
|
|
325
|
+
const entry = typeSyntaxMap.get(id.id);
|
|
326
|
+
if (!entry)
|
|
327
|
+
return undefined;
|
|
328
|
+
return {
|
|
329
|
+
typeNode: entry.typeNode,
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
334
|
+
// TYPE SYNTAX CAPTURE (Phase 2: TypeSyntaxId)
|
|
335
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
336
|
+
/**
|
|
337
|
+
* Capture a type syntax node for later conversion.
|
|
338
|
+
*
|
|
339
|
+
* This creates an opaque TypeSyntaxId handle that can be passed to
|
|
340
|
+
* TypeSystem.typeFromSyntax() for conversion. Used for inline type syntax
|
|
341
|
+
* that cannot be captured at catalog-build time.
|
|
342
|
+
*/
|
|
343
|
+
const captureTypeSyntax = (node) => {
|
|
344
|
+
const id = makeTypeSyntaxId(nextTypeSyntaxId.value++);
|
|
345
|
+
typeSyntaxMap.set(id.id, { typeNode: node });
|
|
346
|
+
return id;
|
|
347
|
+
};
|
|
348
|
+
/**
|
|
349
|
+
* Capture multiple type arguments.
|
|
350
|
+
*
|
|
351
|
+
* Convenience method for capturing generic type arguments.
|
|
352
|
+
*/
|
|
353
|
+
const captureTypeArgs = (nodes) => {
|
|
354
|
+
return nodes.map((node) => captureTypeSyntax(node));
|
|
355
|
+
};
|
|
356
|
+
return {
|
|
357
|
+
resolveIdentifier,
|
|
358
|
+
resolveTypeReference,
|
|
359
|
+
resolvePropertyAccess,
|
|
360
|
+
resolveElementAccess,
|
|
361
|
+
resolveCallSignature,
|
|
362
|
+
resolveConstructorSignature,
|
|
363
|
+
resolveImport,
|
|
364
|
+
resolveShorthandAssignment,
|
|
365
|
+
getDeclaringTypeNameOfMember,
|
|
366
|
+
getFullyQualifiedName,
|
|
367
|
+
getTypePredicateOfSignature,
|
|
368
|
+
// Type syntax capture (Phase 2: TypeSyntaxId)
|
|
369
|
+
captureTypeSyntax,
|
|
370
|
+
captureTypeArgs,
|
|
371
|
+
// Internal method for TypeSystem construction only
|
|
372
|
+
_getHandleRegistry: () => handleRegistry,
|
|
373
|
+
};
|
|
374
|
+
};
|
|
375
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
376
|
+
// HELPER FUNCTIONS
|
|
377
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
378
|
+
const getTypeNodeFromDeclaration = (decl) => {
|
|
379
|
+
if (ts.isVariableDeclaration(decl) && decl.type) {
|
|
380
|
+
return decl.type;
|
|
381
|
+
}
|
|
382
|
+
if (ts.isFunctionDeclaration(decl) || ts.isMethodDeclaration(decl)) {
|
|
383
|
+
return decl.type;
|
|
384
|
+
}
|
|
385
|
+
if (ts.isParameter(decl) && decl.type) {
|
|
386
|
+
return decl.type;
|
|
387
|
+
}
|
|
388
|
+
if (ts.isPropertyDeclaration(decl) && decl.type) {
|
|
389
|
+
return decl.type;
|
|
390
|
+
}
|
|
391
|
+
if (ts.isPropertySignature(decl) && decl.type) {
|
|
392
|
+
return decl.type;
|
|
393
|
+
}
|
|
394
|
+
if (ts.isTypeAliasDeclaration(decl)) {
|
|
395
|
+
return decl.type;
|
|
396
|
+
}
|
|
397
|
+
return undefined;
|
|
398
|
+
};
|
|
399
|
+
const getMemberTypeAnnotation = (decl) => {
|
|
400
|
+
if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)) {
|
|
401
|
+
return decl.type;
|
|
402
|
+
}
|
|
403
|
+
if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl)) {
|
|
404
|
+
// For methods, we could return a function type node if needed
|
|
405
|
+
return decl.type;
|
|
406
|
+
}
|
|
407
|
+
if (ts.isGetAccessorDeclaration(decl)) {
|
|
408
|
+
return decl.type;
|
|
409
|
+
}
|
|
410
|
+
if (ts.isSetAccessorDeclaration(decl)) {
|
|
411
|
+
// Setter declarations have no return type; use the value parameter type.
|
|
412
|
+
const valueParam = decl.parameters[0];
|
|
413
|
+
return valueParam?.type;
|
|
414
|
+
}
|
|
415
|
+
return undefined;
|
|
416
|
+
};
|
|
417
|
+
const getDeclKind = (decl) => {
|
|
418
|
+
if (ts.isVariableDeclaration(decl))
|
|
419
|
+
return "variable";
|
|
420
|
+
if (ts.isFunctionDeclaration(decl))
|
|
421
|
+
return "function";
|
|
422
|
+
if (ts.isClassDeclaration(decl))
|
|
423
|
+
return "class";
|
|
424
|
+
if (ts.isInterfaceDeclaration(decl))
|
|
425
|
+
return "interface";
|
|
426
|
+
if (ts.isTypeAliasDeclaration(decl))
|
|
427
|
+
return "typeAlias";
|
|
428
|
+
if (ts.isEnumDeclaration(decl))
|
|
429
|
+
return "enum";
|
|
430
|
+
if (ts.isParameter(decl))
|
|
431
|
+
return "parameter";
|
|
432
|
+
if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl))
|
|
433
|
+
return "property";
|
|
434
|
+
if (ts.isGetAccessorDeclaration(decl) || ts.isSetAccessorDeclaration(decl))
|
|
435
|
+
return "property";
|
|
436
|
+
if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl))
|
|
437
|
+
return "method";
|
|
438
|
+
return "variable";
|
|
439
|
+
};
|
|
440
|
+
const getReturnTypeNode = (decl) => {
|
|
441
|
+
if (!decl)
|
|
442
|
+
return undefined;
|
|
443
|
+
return decl.type;
|
|
444
|
+
};
|
|
445
|
+
/**
|
|
446
|
+
* Extract and normalize parameter nodes from a signature declaration.
|
|
447
|
+
*
|
|
448
|
+
* ALICE'S SPEC: Parameter mode detection happens HERE during signature registration.
|
|
449
|
+
* If the parameter type is `ref<T>`, `out<T>`, or `in<T>`:
|
|
450
|
+
* - Set `mode` to that keyword
|
|
451
|
+
* - Set `typeNode` to the INNER T node (unwrapped)
|
|
452
|
+
*
|
|
453
|
+
* This is PURE SYNTAX inspection, no TS type inference.
|
|
454
|
+
*/
|
|
455
|
+
const extractParameterNodes = (decl) => {
|
|
456
|
+
if (!decl)
|
|
457
|
+
return [];
|
|
458
|
+
return decl.parameters.map((p) => {
|
|
459
|
+
const normalized = normalizeParameterTypeNode(p.type);
|
|
460
|
+
return {
|
|
461
|
+
name: ts.isIdentifier(p.name) ? p.name.text : "param",
|
|
462
|
+
typeNode: normalized.typeNode,
|
|
463
|
+
isOptional: !!p.questionToken || !!p.initializer,
|
|
464
|
+
isRest: !!p.dotDotDotToken,
|
|
465
|
+
mode: normalized.mode,
|
|
466
|
+
};
|
|
467
|
+
});
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Normalize a parameter type node by detecting ref<T>/out<T>/in<T> wrappers.
|
|
471
|
+
*
|
|
472
|
+
* This is PURE SYNTAX analysis - we look at the TypeNode AST structure:
|
|
473
|
+
* - If it's a TypeReferenceNode with identifier name "ref"/"out"/"in"
|
|
474
|
+
* - And exactly one type argument
|
|
475
|
+
* - Then unwrap to get the inner type
|
|
476
|
+
*
|
|
477
|
+
* @param typeNode The parameter's type node
|
|
478
|
+
* @returns { mode, typeNode } where typeNode is unwrapped if wrapper detected
|
|
479
|
+
*/
|
|
480
|
+
const normalizeParameterTypeNode = (typeNode) => {
|
|
481
|
+
if (!typeNode) {
|
|
482
|
+
return { mode: "value", typeNode: undefined };
|
|
483
|
+
}
|
|
484
|
+
// Mirror IR conversion rules: wrappers may be nested and may appear in any order.
|
|
485
|
+
// - thisarg<T> marks an extension-method receiver parameter (erases for typing)
|
|
486
|
+
// - ref<T>/out<T>/in<T>/inref<T> set passing mode and erase to T for typing
|
|
487
|
+
let mode = "value";
|
|
488
|
+
let current = typeNode;
|
|
489
|
+
while (current) {
|
|
490
|
+
if (ts.isParenthesizedTypeNode(current)) {
|
|
491
|
+
current = current.type;
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
if (!ts.isTypeReferenceNode(current))
|
|
495
|
+
break;
|
|
496
|
+
if (!ts.isIdentifier(current.typeName))
|
|
497
|
+
break;
|
|
498
|
+
if (!current.typeArguments || current.typeArguments.length !== 1)
|
|
499
|
+
break;
|
|
500
|
+
const inner = current.typeArguments[0];
|
|
501
|
+
if (!inner)
|
|
502
|
+
break;
|
|
503
|
+
const wrapperName = current.typeName.text;
|
|
504
|
+
if (wrapperName === "thisarg") {
|
|
505
|
+
current = inner;
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
if (wrapperName === "ref" || wrapperName === "out") {
|
|
509
|
+
mode = wrapperName;
|
|
510
|
+
current = inner;
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
if (wrapperName === "in" || wrapperName === "inref") {
|
|
514
|
+
mode = "in";
|
|
515
|
+
current = inner;
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
// No wrapper detected - regular parameter
|
|
521
|
+
return { mode, typeNode: current ?? typeNode };
|
|
522
|
+
};
|
|
523
|
+
const convertTypeParameterDeclarations = (typeParameters) => {
|
|
524
|
+
if (!typeParameters || typeParameters.length === 0)
|
|
525
|
+
return undefined;
|
|
526
|
+
return typeParameters.map((tp) => ({
|
|
527
|
+
name: tp.name.text,
|
|
528
|
+
constraintNode: tp.constraint,
|
|
529
|
+
defaultNode: tp.default,
|
|
530
|
+
}));
|
|
531
|
+
};
|
|
532
|
+
const extractTypeParameterNodes = (decl) => {
|
|
533
|
+
if (!decl)
|
|
534
|
+
return undefined;
|
|
535
|
+
// Constructor declarations don't have their own type parameters in TS syntax,
|
|
536
|
+
// but the enclosing class may be generic (class Box<T> { constructor(x: T) {} }).
|
|
537
|
+
// For constructor signature typing/inference, the relevant type parameters are the
|
|
538
|
+
// class type parameters.
|
|
539
|
+
if (ts.isConstructorDeclaration(decl)) {
|
|
540
|
+
const parent = decl.parent;
|
|
541
|
+
if (ts.isClassDeclaration(parent)) {
|
|
542
|
+
return convertTypeParameterDeclarations(parent.typeParameters);
|
|
543
|
+
}
|
|
544
|
+
return undefined;
|
|
545
|
+
}
|
|
546
|
+
return convertTypeParameterDeclarations(decl.typeParameters);
|
|
547
|
+
};
|
|
548
|
+
/**
|
|
549
|
+
* Extract type predicate from a signature's return type.
|
|
550
|
+
*
|
|
551
|
+
* ALICE'S SPEC: This is PURE SYNTAX inspection at registration time.
|
|
552
|
+
* We check if the return TypeNode is a TypePredicateNode (x is T or this is T).
|
|
553
|
+
* No TS type inference is used.
|
|
554
|
+
*
|
|
555
|
+
* @param returnTypeNode The signature's return type node
|
|
556
|
+
* @param decl The signature declaration (to find parameter index)
|
|
557
|
+
* @returns SignatureTypePredicate or undefined if not a predicate
|
|
558
|
+
*/
|
|
559
|
+
const extractTypePredicate = (returnTypeNode, decl) => {
|
|
560
|
+
// Return type must be a TypePredicateNode
|
|
561
|
+
if (!returnTypeNode || !ts.isTypePredicateNode(returnTypeNode)) {
|
|
562
|
+
return undefined;
|
|
563
|
+
}
|
|
564
|
+
const predNode = returnTypeNode;
|
|
565
|
+
// Must have a target type
|
|
566
|
+
if (!predNode.type) {
|
|
567
|
+
return undefined;
|
|
568
|
+
}
|
|
569
|
+
// Check if it's "this is T" predicate
|
|
570
|
+
if (predNode.parameterName.kind === ts.SyntaxKind.ThisType) {
|
|
571
|
+
return {
|
|
572
|
+
kind: "this",
|
|
573
|
+
targetTypeNode: predNode.type,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
// Check if it's "param is T" predicate
|
|
577
|
+
if (ts.isIdentifier(predNode.parameterName)) {
|
|
578
|
+
const paramName = predNode.parameterName.text;
|
|
579
|
+
// Find parameter index
|
|
580
|
+
const paramIndex = decl?.parameters.findIndex((p) => ts.isIdentifier(p.name) && p.name.text === paramName) ?? -1;
|
|
581
|
+
if (paramIndex >= 0) {
|
|
582
|
+
return {
|
|
583
|
+
kind: "param",
|
|
584
|
+
parameterName: paramName,
|
|
585
|
+
parameterIndex: paramIndex,
|
|
586
|
+
targetTypeNode: predNode.type,
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return undefined;
|
|
591
|
+
};
|
|
592
|
+
const isOptionalMember = (symbol) => {
|
|
593
|
+
return (symbol.flags & ts.SymbolFlags.Optional) !== 0;
|
|
594
|
+
};
|
|
595
|
+
const isReadonlyMember = (decl) => {
|
|
596
|
+
if (!decl)
|
|
597
|
+
return false;
|
|
598
|
+
if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)) {
|
|
599
|
+
return (decl.modifiers?.some((m) => m.kind === ts.SyntaxKind.ReadonlyKeyword) ??
|
|
600
|
+
false);
|
|
601
|
+
}
|
|
602
|
+
return false;
|
|
603
|
+
};
|
|
604
|
+
/**
|
|
605
|
+
* Extract declaring identity from a signature declaration.
|
|
606
|
+
*
|
|
607
|
+
* CRITICAL for Alice's spec: Without this, resolveCall() cannot compute
|
|
608
|
+
* inheritance substitution. It would have to "guess" the method name
|
|
609
|
+
* from the signature, which breaks on overloads, aliases, etc.
|
|
610
|
+
*
|
|
611
|
+
* DESIGN (Phase 5 Step 4): Store the declaring type as a **simple TS name**
|
|
612
|
+
* (identifier text like "Box"), NOT a TS "fully qualified name". TypeSystem
|
|
613
|
+
* uses UnifiedTypeCatalog.resolveTsName() to resolve this to the proper
|
|
614
|
+
* CLR FQ name for inheritance substitution.
|
|
615
|
+
*
|
|
616
|
+
* @param decl The signature declaration (method, function, etc.)
|
|
617
|
+
* @param _checker TypeChecker (kept for backwards compatibility, unused)
|
|
618
|
+
* @returns { typeTsName, memberName } or undefined if not a member
|
|
619
|
+
*/
|
|
620
|
+
const extractDeclaringIdentity = (decl, _checker) => {
|
|
621
|
+
if (!decl)
|
|
622
|
+
return undefined;
|
|
623
|
+
const normalizeTsbindgenTypeName = (name) => {
|
|
624
|
+
if (name.endsWith("$instance")) {
|
|
625
|
+
return name.slice(0, -"$instance".length);
|
|
626
|
+
}
|
|
627
|
+
if (name.startsWith("__") && name.endsWith("$views")) {
|
|
628
|
+
return name.slice(2, -"$views".length);
|
|
629
|
+
}
|
|
630
|
+
return name;
|
|
631
|
+
};
|
|
632
|
+
// Check if this is a method (class or interface member)
|
|
633
|
+
if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl)) {
|
|
634
|
+
const parent = decl.parent;
|
|
635
|
+
// Get the method name
|
|
636
|
+
const memberName = ts.isIdentifier(decl.name)
|
|
637
|
+
? decl.name.text
|
|
638
|
+
: (decl.name?.getText() ?? "unknown");
|
|
639
|
+
// Get the containing type's simple name (identifier text)
|
|
640
|
+
if (ts.isClassDeclaration(parent) || ts.isInterfaceDeclaration(parent)) {
|
|
641
|
+
if (parent.name) {
|
|
642
|
+
// Use the simple identifier text, not checker.getFullyQualifiedName
|
|
643
|
+
const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
|
|
644
|
+
return { typeTsName, memberName };
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Object literal method - use parent context
|
|
648
|
+
if (ts.isObjectLiteralExpression(parent)) {
|
|
649
|
+
// For object literals, we don't have a named type
|
|
650
|
+
return undefined;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
// Constructor declarations
|
|
654
|
+
if (ts.isConstructorDeclaration(decl)) {
|
|
655
|
+
const parent = decl.parent;
|
|
656
|
+
if (ts.isClassDeclaration(parent) && parent.name) {
|
|
657
|
+
// Use the simple identifier text
|
|
658
|
+
const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
|
|
659
|
+
return { typeTsName, memberName: "constructor" };
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
// Getter/setter declarations
|
|
663
|
+
if (ts.isGetAccessorDeclaration(decl) || ts.isSetAccessorDeclaration(decl)) {
|
|
664
|
+
const parent = decl.parent;
|
|
665
|
+
const memberName = ts.isIdentifier(decl.name)
|
|
666
|
+
? decl.name.text
|
|
667
|
+
: (decl.name?.getText() ?? "unknown");
|
|
668
|
+
if (ts.isClassDeclaration(parent) || ts.isInterfaceDeclaration(parent)) {
|
|
669
|
+
if (parent.name) {
|
|
670
|
+
// Use the simple identifier text
|
|
671
|
+
const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
|
|
672
|
+
return { typeTsName, memberName };
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
// Standalone functions don't have a declaring type
|
|
677
|
+
return undefined;
|
|
678
|
+
};
|
|
679
|
+
/**
|
|
680
|
+
* Extract class member names from a ClassDeclaration.
|
|
681
|
+
*
|
|
682
|
+
* ALICE'S SPEC: This is PURE SYNTAX inspection at registration time.
|
|
683
|
+
* We iterate class members and collect method/property names.
|
|
684
|
+
* This data is used by TypeSystem.checkTsClassMemberOverride without
|
|
685
|
+
* needing to inspect TS AST nodes or use hardcoded SyntaxKind numbers.
|
|
686
|
+
*
|
|
687
|
+
* @param classDecl The class declaration node
|
|
688
|
+
* @returns ClassMemberNames with method and property name sets
|
|
689
|
+
*/
|
|
690
|
+
const extractClassMemberNames = (classDecl) => {
|
|
691
|
+
const methods = new Set();
|
|
692
|
+
const properties = new Set();
|
|
693
|
+
for (const member of classDecl.members) {
|
|
694
|
+
// Get member name if it has an identifier
|
|
695
|
+
const name = ts.isMethodDeclaration(member)
|
|
696
|
+
? ts.isIdentifier(member.name)
|
|
697
|
+
? member.name.text
|
|
698
|
+
: undefined
|
|
699
|
+
: ts.isPropertyDeclaration(member)
|
|
700
|
+
? ts.isIdentifier(member.name)
|
|
701
|
+
? member.name.text
|
|
702
|
+
: undefined
|
|
703
|
+
: ts.isGetAccessorDeclaration(member) ||
|
|
704
|
+
ts.isSetAccessorDeclaration(member)
|
|
705
|
+
? ts.isIdentifier(member.name)
|
|
706
|
+
? member.name.text
|
|
707
|
+
: undefined
|
|
708
|
+
: undefined;
|
|
709
|
+
if (!name)
|
|
710
|
+
continue;
|
|
711
|
+
if (ts.isMethodDeclaration(member)) {
|
|
712
|
+
methods.add(name);
|
|
713
|
+
}
|
|
714
|
+
else if (ts.isPropertyDeclaration(member)) {
|
|
715
|
+
properties.add(name);
|
|
716
|
+
}
|
|
717
|
+
else if (ts.isGetAccessorDeclaration(member) ||
|
|
718
|
+
ts.isSetAccessorDeclaration(member)) {
|
|
719
|
+
// Accessors are treated as properties for override detection
|
|
720
|
+
properties.add(name);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
return { methods, properties };
|
|
724
|
+
};
|
|
725
|
+
//# sourceMappingURL=index.js.map
|