gitnexus 1.6.6-rc.99 → 1.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -68
- package/dist/_shared/graph/types.d.ts +17 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -5
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +2 -4
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/scope-resolution/module-scope-index.d.ts +1 -2
- package/dist/_shared/scope-resolution/module-scope-index.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/module-scope-index.js +1 -2
- package/dist/_shared/scope-resolution/module-scope-index.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +24 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +13 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/context.d.ts +1 -0
- package/dist/_shared/scope-resolution/registries/context.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/context.js +6 -0
- package/dist/_shared/scope-resolution/registries/context.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/evidence.d.ts +2 -3
- package/dist/_shared/scope-resolution/registries/evidence.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/evidence.js +2 -3
- package/dist/_shared/scope-resolution/registries/evidence.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/macro-registry.d.ts +29 -0
- package/dist/_shared/scope-resolution/registries/macro-registry.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/registries/macro-registry.js +32 -0
- package/dist/_shared/scope-resolution/registries/macro-registry.js.map +1 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +9 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +1 -1
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +35 -1
- package/dist/cli/ai-context.js +111 -12
- package/dist/cli/analyze-config.d.ts +92 -0
- package/dist/cli/analyze-config.js +364 -0
- package/dist/cli/analyze.d.ts +17 -1
- package/dist/cli/analyze.js +224 -71
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +32 -0
- package/dist/cli/i18n/en.d.ts +2 -2
- package/dist/cli/i18n/en.js +2 -2
- package/dist/cli/i18n/resources.d.ts +2 -2
- package/dist/cli/i18n/zh-CN.js +2 -2
- package/dist/cli/index.js +4 -2
- package/dist/cli/resolve-invocation.d.ts +21 -0
- package/dist/cli/resolve-invocation.js +68 -0
- package/dist/cli/setup.d.ts +33 -0
- package/dist/cli/setup.js +96 -35
- package/dist/cli/skill-gen.js +2 -2
- package/dist/cli/wiki.js +20 -4
- package/dist/core/embeddings/embedder.d.ts +1 -1
- package/dist/core/embeddings/embedder.js +14 -1
- package/dist/core/embeddings/runtime-support.d.ts +41 -0
- package/dist/core/embeddings/runtime-support.js +65 -0
- package/dist/core/group/extractors/grpc-patterns/proto.js +2 -1
- package/dist/core/group/extractors/http-patterns/java.js +15 -1
- package/dist/core/ingestion/call-processor.d.ts +57 -227
- package/dist/core/ingestion/call-processor.js +172 -2595
- package/dist/core/ingestion/call-routing.d.ts +6 -5
- package/dist/core/ingestion/call-routing.js +6 -6
- package/dist/core/ingestion/call-types.d.ts +0 -75
- package/dist/core/ingestion/class-extractors/configs/c-cpp.js +26 -1
- package/dist/core/ingestion/class-extractors/configs/ruby.js +3 -0
- package/dist/core/ingestion/class-extractors/generic.js +9 -11
- package/dist/core/ingestion/class-types.d.ts +23 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.d.ts +11 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +227 -73
- package/dist/core/ingestion/cobol-processor.d.ts +1 -0
- package/dist/core/ingestion/cobol-processor.js +51 -2
- package/dist/core/ingestion/emit-references.js +8 -2
- package/dist/core/ingestion/export-detection.d.ts +2 -1
- package/dist/core/ingestion/export-detection.js +2 -6
- package/dist/core/ingestion/field-extractors/configs/dart.d.ts +0 -6
- package/dist/core/ingestion/field-extractors/configs/dart.js +62 -44
- package/dist/core/ingestion/field-extractors/configs/go.d.ts +0 -9
- package/dist/core/ingestion/field-extractors/configs/go.js +40 -1
- package/dist/core/ingestion/field-extractors/configs/jvm.js +43 -4
- package/dist/core/ingestion/field-extractors/configs/php.js +1 -2
- package/dist/core/ingestion/field-extractors/configs/swift.d.ts +12 -1
- package/dist/core/ingestion/field-extractors/configs/swift.js +31 -6
- package/dist/core/ingestion/field-extractors/generic.d.ts +6 -0
- package/dist/core/ingestion/field-extractors/generic.js +5 -4
- package/dist/core/ingestion/field-extractors/typescript.js +0 -29
- package/dist/core/ingestion/filesystem-walker.d.ts +0 -9
- package/dist/core/ingestion/filesystem-walker.js +0 -11
- package/dist/core/ingestion/finalize-orchestrator.js +14 -2
- package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +21 -0
- package/dist/core/ingestion/import-resolvers/configs/swift.js +72 -11
- package/dist/core/ingestion/import-resolvers/python.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/standard.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.js +6 -5
- package/dist/core/ingestion/import-resolvers/utils.d.ts +2 -5
- package/dist/core/ingestion/import-resolvers/utils.js +1 -9
- package/dist/core/ingestion/language-provider.d.ts +39 -119
- package/dist/core/ingestion/language-provider.js +0 -2
- package/dist/core/ingestion/languages/c/capture-side-channel.d.ts +62 -0
- package/dist/core/ingestion/languages/c/capture-side-channel.js +65 -0
- package/dist/core/ingestion/languages/c/captures.js +41 -23
- package/dist/core/ingestion/languages/c/import-decomposer.d.ts +9 -0
- package/dist/core/ingestion/languages/c/import-decomposer.js +15 -0
- package/dist/core/ingestion/languages/c/import-target.js +52 -9
- package/dist/core/ingestion/languages/c/index.d.ts +2 -1
- package/dist/core/ingestion/languages/c/index.js +2 -1
- package/dist/core/ingestion/languages/c/query.js +15 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +47 -4
- package/dist/core/ingestion/languages/c/static-linkage.d.ts +8 -0
- package/dist/core/ingestion/languages/c/static-linkage.js +46 -1
- package/dist/core/ingestion/languages/c-cpp.js +16 -7
- package/dist/core/ingestion/languages/cobol/captures.js +25 -2
- package/dist/core/ingestion/languages/cpp/adl.d.ts +88 -4
- package/dist/core/ingestion/languages/cpp/adl.js +380 -160
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +2 -8
- package/dist/core/ingestion/languages/cpp/capture-side-channel.d.ts +65 -0
- package/dist/core/ingestion/languages/cpp/capture-side-channel.js +78 -0
- package/dist/core/ingestion/languages/cpp/captures.js +162 -54
- package/dist/core/ingestion/languages/cpp/file-local-linkage.d.ts +18 -52
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +49 -1
- package/dist/core/ingestion/languages/cpp/import-decomposer.d.ts +7 -0
- package/dist/core/ingestion/languages/cpp/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/cpp/index.d.ts +1 -0
- package/dist/core/ingestion/languages/cpp/index.js +1 -0
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +8 -0
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +21 -0
- package/dist/core/ingestion/languages/cpp/query.js +21 -0
- package/dist/core/ingestion/languages/cpp/range-bindings.js +20 -5
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +52 -5
- package/dist/core/ingestion/languages/cpp/two-phase-lookup.d.ts +20 -0
- package/dist/core/ingestion/languages/cpp/two-phase-lookup.js +83 -3
- package/dist/core/ingestion/languages/csharp/captures.js +205 -41
- package/dist/core/ingestion/languages/csharp/index.d.ts +3 -4
- package/dist/core/ingestion/languages/csharp/index.js +3 -4
- package/dist/core/ingestion/languages/csharp/interpret.js +17 -3
- package/dist/core/ingestion/languages/csharp/namespace-siblings.d.ts +17 -7
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +129 -124
- package/dist/core/ingestion/languages/csharp/qualified-type-names.d.ts +14 -0
- package/dist/core/ingestion/languages/csharp/qualified-type-names.js +59 -0
- package/dist/core/ingestion/languages/csharp/query.js +13 -0
- package/dist/core/ingestion/languages/csharp/receiver-binding.js +10 -6
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -1
- package/dist/core/ingestion/languages/csharp.js +0 -5
- package/dist/core/ingestion/languages/dart/arity-metadata.d.ts +25 -0
- package/dist/core/ingestion/languages/dart/arity-metadata.js +35 -0
- package/dist/core/ingestion/languages/dart/arity.d.ts +19 -0
- package/dist/core/ingestion/languages/dart/arity.js +31 -0
- package/dist/core/ingestion/languages/dart/built-ins.d.ts +11 -0
- package/dist/core/ingestion/languages/dart/built-ins.js +34 -0
- package/dist/core/ingestion/languages/dart/cache-stats.d.ts +13 -0
- package/dist/core/ingestion/languages/dart/cache-stats.js +24 -0
- package/dist/core/ingestion/languages/dart/captures.d.ts +29 -0
- package/dist/core/ingestion/languages/dart/captures.js +445 -0
- package/dist/core/ingestion/languages/dart/expand-wildcards.d.ts +13 -0
- package/dist/core/ingestion/languages/dart/expand-wildcards.js +31 -0
- package/dist/core/ingestion/languages/dart/import-target.d.ts +15 -0
- package/dist/core/ingestion/languages/dart/import-target.js +65 -0
- package/dist/core/ingestion/languages/dart/index.d.ts +28 -0
- package/dist/core/ingestion/languages/dart/index.js +28 -0
- package/dist/core/ingestion/languages/dart/interpret.d.ts +24 -0
- package/dist/core/ingestion/languages/dart/interpret.js +95 -0
- package/dist/core/ingestion/languages/dart/merge-bindings.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/merge-bindings.js +39 -0
- package/dist/core/ingestion/languages/dart/query.d.ts +26 -0
- package/dist/core/ingestion/languages/dart/query.js +142 -0
- package/dist/core/ingestion/languages/dart/receiver-binding.d.ts +24 -0
- package/dist/core/ingestion/languages/dart/receiver-binding.js +87 -0
- package/dist/core/ingestion/languages/dart/scope-resolver.d.ts +29 -0
- package/dist/core/ingestion/languages/dart/scope-resolver.js +194 -0
- package/dist/core/ingestion/languages/dart/signature-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/dart/signature-bindings.js +51 -0
- package/dist/core/ingestion/languages/dart/simple-hooks.d.ts +20 -0
- package/dist/core/ingestion/languages/dart/simple-hooks.js +47 -0
- package/dist/core/ingestion/languages/dart.d.ts +0 -1
- package/dist/core/ingestion/languages/dart.js +15 -29
- package/dist/core/ingestion/languages/go/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/go/arity-metadata.js +31 -1
- package/dist/core/ingestion/languages/go/captures.js +162 -3
- package/dist/core/ingestion/languages/go/interface-impls.js +476 -50
- package/dist/core/ingestion/languages/go/interpret.js +21 -11
- package/dist/core/ingestion/languages/go/method-owners.js +20 -8
- package/dist/core/ingestion/languages/go/query.js +15 -7
- package/dist/core/ingestion/languages/go/range-binding.js +24 -9
- package/dist/core/ingestion/languages/go/receiver-binding.js +1 -1
- package/dist/core/ingestion/languages/go/scope-resolver.js +2 -2
- package/dist/core/ingestion/languages/go/simple-hooks.js +10 -5
- package/dist/core/ingestion/languages/go/type-binding.d.ts +1 -0
- package/dist/core/ingestion/languages/go/type-binding.js +40 -2
- package/dist/core/ingestion/languages/go.d.ts +0 -1
- package/dist/core/ingestion/languages/go.js +0 -5
- package/dist/core/ingestion/languages/index.d.ts +0 -5
- package/dist/core/ingestion/languages/index.js +0 -3
- package/dist/core/ingestion/languages/java/captures.js +252 -23
- package/dist/core/ingestion/languages/java/interpret.js +12 -6
- package/dist/core/ingestion/languages/java/package-siblings.js +18 -5
- package/dist/core/ingestion/languages/java/query.js +16 -1
- package/dist/core/ingestion/languages/java/scope-resolver.d.ts +2 -8
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -8
- package/dist/core/ingestion/languages/java.js +0 -5
- package/dist/core/ingestion/languages/javascript/captures.js +185 -11
- package/dist/core/ingestion/languages/javascript/query.js +107 -1
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +57 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +60 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +213 -22
- package/dist/core/ingestion/languages/kotlin/companion-scopes.d.ts +7 -0
- package/dist/core/ingestion/languages/kotlin/companion-scopes.js +10 -0
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/query.js +30 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.d.ts +5 -7
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +22 -7
- package/dist/core/ingestion/languages/kotlin.js +8 -5
- package/dist/core/ingestion/languages/php/captures.js +135 -19
- package/dist/core/ingestion/languages/php/import-decomposer.js +21 -63
- package/dist/core/ingestion/languages/php/index.d.ts +3 -4
- package/dist/core/ingestion/languages/php/index.js +3 -4
- package/dist/core/ingestion/languages/php/query.js +5 -0
- package/dist/core/ingestion/languages/php/receiver-binding.js +8 -4
- package/dist/core/ingestion/languages/php.js +0 -4
- package/dist/core/ingestion/languages/python/captures.js +128 -13
- package/dist/core/ingestion/languages/python/depends-references.js +1 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +4 -5
- package/dist/core/ingestion/languages/python/import-target.js +108 -16
- package/dist/core/ingestion/languages/python/index-stats.d.ts +18 -0
- package/dist/core/ingestion/languages/python/index-stats.js +25 -0
- package/dist/core/ingestion/languages/python/index.d.ts +3 -4
- package/dist/core/ingestion/languages/python/index.js +3 -4
- package/dist/core/ingestion/languages/python/query.js +17 -0
- package/dist/core/ingestion/languages/python/scope-resolver.js +7 -6
- package/dist/core/ingestion/languages/python.d.ts +0 -2
- package/dist/core/ingestion/languages/python.js +0 -7
- package/dist/core/ingestion/languages/ruby/captures.js +174 -31
- package/dist/core/ingestion/languages/ruby/import-target.js +2 -1
- package/dist/core/ingestion/languages/ruby/interpret.js +2 -1
- package/dist/core/ingestion/languages/ruby/query.js +10 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +61 -11
- package/dist/core/ingestion/languages/ruby.js +4 -53
- package/dist/core/ingestion/languages/rust/captures.js +95 -13
- package/dist/core/ingestion/languages/rust/query.js +64 -1
- package/dist/core/ingestion/languages/rust/range-binding.js +40 -12
- package/dist/core/ingestion/languages/rust/receiver-binding.js +9 -0
- package/dist/core/ingestion/languages/rust/scope-resolver.js +75 -1
- package/dist/core/ingestion/languages/rust.d.ts +0 -2
- package/dist/core/ingestion/languages/rust.js +0 -6
- package/dist/core/ingestion/languages/swift/arity-metadata.d.ts +24 -0
- package/dist/core/ingestion/languages/swift/arity-metadata.js +41 -0
- package/dist/core/ingestion/languages/swift/arity.d.ts +29 -0
- package/dist/core/ingestion/languages/swift/arity.js +42 -0
- package/dist/core/ingestion/languages/swift/base-type.d.ts +20 -0
- package/dist/core/ingestion/languages/swift/base-type.js +27 -0
- package/dist/core/ingestion/languages/swift/cache-stats.d.ts +15 -0
- package/dist/core/ingestion/languages/swift/cache-stats.js +26 -0
- package/dist/core/ingestion/languages/swift/captures.d.ts +35 -0
- package/dist/core/ingestion/languages/swift/captures.js +495 -0
- package/dist/core/ingestion/languages/swift/implicit-imports.d.ts +34 -0
- package/dist/core/ingestion/languages/swift/implicit-imports.js +57 -0
- package/dist/core/ingestion/languages/swift/import-decomposer.d.ts +24 -0
- package/dist/core/ingestion/languages/swift/import-decomposer.js +84 -0
- package/dist/core/ingestion/languages/swift/import-target.d.ts +33 -0
- package/dist/core/ingestion/languages/swift/import-target.js +81 -0
- package/dist/core/ingestion/languages/swift/index.d.ts +37 -0
- package/dist/core/ingestion/languages/swift/index.js +37 -0
- package/dist/core/ingestion/languages/swift/interpret.d.ts +15 -0
- package/dist/core/ingestion/languages/swift/interpret.js +89 -0
- package/dist/core/ingestion/languages/swift/merge-bindings.d.ts +20 -0
- package/dist/core/ingestion/languages/swift/merge-bindings.js +48 -0
- package/dist/core/ingestion/languages/swift/query.d.ts +46 -0
- package/dist/core/ingestion/languages/swift/query.js +194 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +40 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +161 -0
- package/dist/core/ingestion/languages/swift/scope-resolver.d.ts +50 -0
- package/dist/core/ingestion/languages/swift/scope-resolver.js +189 -0
- package/dist/core/ingestion/languages/swift/sibling-type-bindings.d.ts +34 -0
- package/dist/core/ingestion/languages/swift/sibling-type-bindings.js +65 -0
- package/dist/core/ingestion/languages/swift/signature-bindings.d.ts +25 -0
- package/dist/core/ingestion/languages/swift/signature-bindings.js +66 -0
- package/dist/core/ingestion/languages/swift/simple-hooks.d.ts +37 -0
- package/dist/core/ingestion/languages/swift/simple-hooks.js +60 -0
- package/dist/core/ingestion/languages/swift/target-grouping.d.ts +51 -0
- package/dist/core/ingestion/languages/swift/target-grouping.js +93 -0
- package/dist/core/ingestion/languages/swift/target-siblings.d.ts +30 -0
- package/dist/core/ingestion/languages/swift/target-siblings.js +71 -0
- package/dist/core/ingestion/languages/swift.d.ts +0 -5
- package/dist/core/ingestion/languages/swift.js +11 -87
- package/dist/core/ingestion/languages/typescript/array-callback.d.ts +3 -29
- package/dist/core/ingestion/languages/typescript/array-callback.js +4 -43
- package/dist/core/ingestion/languages/typescript/captures.js +147 -17
- package/dist/core/ingestion/languages/typescript/index.d.ts +3 -4
- package/dist/core/ingestion/languages/typescript/index.js +3 -4
- package/dist/core/ingestion/languages/typescript/query.d.ts +2 -3
- package/dist/core/ingestion/languages/typescript/query.js +125 -4
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +0 -1
- package/dist/core/ingestion/languages/typescript.d.ts +2 -3
- package/dist/core/ingestion/languages/typescript.js +46 -23
- package/dist/core/ingestion/languages/vue/captures.d.ts +46 -0
- package/dist/core/ingestion/languages/vue/captures.js +67 -0
- package/dist/core/ingestion/languages/vue/import-target.d.ts +27 -0
- package/dist/core/ingestion/languages/vue/import-target.js +58 -0
- package/dist/core/ingestion/languages/vue/index.d.ts +49 -0
- package/dist/core/ingestion/languages/vue/index.js +49 -0
- package/dist/core/ingestion/languages/vue/scope-resolver.d.ts +55 -0
- package/dist/core/ingestion/languages/vue/scope-resolver.js +292 -0
- package/dist/core/ingestion/languages/vue.js +12 -4
- package/dist/core/ingestion/local-symbol-pruner.d.ts +11 -0
- package/dist/core/ingestion/local-symbol-pruner.js +63 -0
- package/dist/core/ingestion/method-extractors/configs/dart.js +14 -1
- package/dist/core/ingestion/method-extractors/configs/jvm.js +37 -20
- package/dist/core/ingestion/method-extractors/configs/php.js +0 -1
- package/dist/core/ingestion/method-extractors/configs/swift.js +11 -4
- package/dist/core/ingestion/method-types.d.ts +2 -2
- package/dist/core/ingestion/model/index.d.ts +0 -3
- package/dist/core/ingestion/model/index.js +0 -8
- package/dist/core/ingestion/model/resolve.d.ts +7 -43
- package/dist/core/ingestion/model/resolve.js +7 -226
- package/dist/core/ingestion/model/scope-resolution-indexes.d.ts +46 -1
- package/dist/core/ingestion/model/semantic-model.d.ts +4 -6
- package/dist/core/ingestion/model/semantic-model.js +1 -1
- package/dist/core/ingestion/model/symbol-table.d.ts +3 -4
- package/dist/core/ingestion/model/symbol-table.js +3 -4
- package/dist/core/ingestion/parsing-processor.d.ts +30 -24
- package/dist/core/ingestion/parsing-processor.js +76 -640
- package/dist/core/ingestion/pipeline-phases/communities.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/communities.js +5 -2
- package/dist/core/ingestion/pipeline-phases/cross-file.d.ts +9 -8
- package/dist/core/ingestion/pipeline-phases/cross-file.js +16 -12
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/mro.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/mro.js +2 -2
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +44 -22
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +426 -565
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +13 -33
- package/dist/core/ingestion/pipeline-phases/parse.js +2 -2
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/processes.js +5 -3
- package/dist/core/ingestion/pipeline-phases/prune-local-symbols.d.ts +14 -0
- package/dist/core/ingestion/pipeline-phases/prune-local-symbols.js +26 -0
- package/dist/core/ingestion/pipeline.d.ts +27 -19
- package/dist/core/ingestion/pipeline.js +4 -2
- package/dist/core/ingestion/resolve-references.js +15 -3
- package/dist/core/ingestion/route-extractors/laravel.d.ts +10 -0
- package/dist/core/ingestion/route-extractors/laravel.js +88 -9
- package/dist/core/ingestion/scope-extractor-bridge.d.ts +2 -1
- package/dist/core/ingestion/scope-extractor-bridge.js +2 -2
- package/dist/core/ingestion/scope-extractor.js +13 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +181 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +21 -10
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +10 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +7 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +58 -6
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +24 -5
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +68 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +189 -29
- package/dist/core/ingestion/scope-resolution/passes/imported-return-types.js +21 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1 -1
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +8 -11
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +171 -50
- package/dist/core/ingestion/scope-resolution/pipeline/registry.d.ts +3 -4
- package/dist/core/ingestion/scope-resolution/pipeline/registry.js +9 -4
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +28 -5
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +191 -24
- package/dist/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +31 -0
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +72 -0
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +440 -39
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +18 -2
- package/dist/core/ingestion/scope-resolution/workspace-index.js +94 -7
- package/dist/core/ingestion/tree-sitter-queries.d.ts +14 -14
- package/dist/core/ingestion/tree-sitter-queries.js +380 -158
- package/dist/core/ingestion/ts-js-hoc-utils.d.ts +12 -0
- package/dist/core/ingestion/ts-js-hoc-utils.js +105 -0
- package/dist/core/ingestion/type-env.d.ts +2 -1
- package/dist/core/ingestion/type-env.js +6 -8
- package/dist/core/ingestion/type-extractors/c-cpp.js +8 -10
- package/dist/core/ingestion/type-extractors/csharp.js +18 -34
- package/dist/core/ingestion/type-extractors/go.js +2 -10
- package/dist/core/ingestion/type-extractors/jvm.js +6 -5
- package/dist/core/ingestion/type-extractors/php.js +1 -1
- package/dist/core/ingestion/type-extractors/python.js +1 -1
- package/dist/core/ingestion/type-extractors/ruby.js +2 -2
- package/dist/core/ingestion/type-extractors/rust.js +0 -16
- package/dist/core/ingestion/type-extractors/shared.d.ts +2 -2
- package/dist/core/ingestion/type-extractors/shared.js +25 -11
- package/dist/core/ingestion/type-extractors/swift.js +5 -5
- package/dist/core/ingestion/type-extractors/types.d.ts +1 -1
- package/dist/core/ingestion/type-extractors/typescript.js +1 -1
- package/dist/core/ingestion/utils/ast-helpers.d.ts +119 -1
- package/dist/core/ingestion/utils/ast-helpers.js +260 -13
- package/dist/core/ingestion/utils/callable-labels.d.ts +13 -0
- package/dist/core/ingestion/utils/callable-labels.js +14 -0
- package/dist/core/ingestion/utils/deferred-resolution-profile.d.ts +10 -0
- package/dist/core/ingestion/utils/deferred-resolution-profile.js +30 -0
- package/dist/core/ingestion/utils/heap-probe.d.ts +20 -0
- package/dist/core/ingestion/utils/heap-probe.js +39 -0
- package/dist/core/ingestion/utils/heritage-marker.d.ts +33 -0
- package/dist/core/ingestion/utils/heritage-marker.js +41 -0
- package/dist/core/ingestion/utils/qualified-name.d.ts +37 -0
- package/dist/core/ingestion/utils/qualified-name.js +67 -0
- package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +49 -0
- package/dist/core/ingestion/variable-extractors/configs/dart.js +76 -62
- package/dist/core/ingestion/variable-extractors/configs/go.js +74 -7
- package/dist/core/ingestion/variable-extractors/configs/jvm.js +35 -8
- package/dist/core/ingestion/variable-extractors/generic.js +40 -12
- package/dist/core/ingestion/variable-types.d.ts +9 -0
- package/dist/core/ingestion/vue-sfc-extractor.d.ts +97 -7
- package/dist/core/ingestion/vue-sfc-extractor.js +433 -11
- package/dist/core/ingestion/workers/parse-worker.d.ts +0 -11
- package/dist/core/ingestion/workers/parse-worker.js +358 -187
- package/dist/core/ingestion/workers/worker-pool.d.ts +78 -9
- package/dist/core/ingestion/workers/worker-pool.js +346 -49
- package/dist/core/lbug/csv-generator.js +20 -2
- package/dist/core/lbug/lbug-adapter.js +29 -10
- package/dist/core/lbug/native-check.js +17 -5
- package/dist/core/lbug/pool-adapter.d.ts +0 -19
- package/dist/core/lbug/pool-adapter.js +40 -77
- package/dist/core/lbug/query-result-utils.d.ts +19 -0
- package/dist/core/lbug/query-result-utils.js +28 -0
- package/dist/core/run-analyze.d.ts +9 -2
- package/dist/core/run-analyze.js +24 -3
- package/dist/core/tree-sitter/parser-loader.d.ts +13 -0
- package/dist/core/tree-sitter/parser-loader.js +4 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +70 -3
- package/dist/core/tree-sitter/safe-parse.js +214 -11
- package/dist/core/wiki/generator.js +13 -5
- package/dist/core/wiki/graph-queries.d.ts +3 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- package/dist/core/wiki/llm-client.d.ts +1 -1
- package/dist/core/wiki/llm-client.js +7 -2
- package/dist/core/wiki/local-cli-client.d.ts +2 -1
- package/dist/core/wiki/local-cli-client.js +62 -4
- package/dist/mcp/compatible-stdio-transport.d.ts +3 -0
- package/dist/mcp/compatible-stdio-transport.js +22 -0
- package/dist/mcp/core/embedder.d.ts +1 -1
- package/dist/mcp/core/embedder.js +13 -1
- package/dist/mcp/local/local-backend.d.ts +37 -5
- package/dist/mcp/local/local-backend.js +227 -129
- package/dist/mcp/resources.js +3 -3
- package/dist/mcp/server.js +9 -1
- package/dist/storage/git.d.ts +11 -0
- package/dist/storage/git.js +30 -0
- package/dist/storage/parse-cache.d.ts +23 -1
- package/dist/storage/parse-cache.js +138 -32
- package/dist/storage/parsedfile-store.d.ts +142 -0
- package/dist/storage/parsedfile-store.js +367 -0
- package/dist/storage/repo-manager.d.ts +2 -1
- package/dist/storage/scope-index-store.d.ts +114 -0
- package/dist/storage/scope-index-store.js +236 -0
- package/dist/types/pipeline.d.ts +6 -3
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +2 -1
- package/hooks/claude/gitnexus-hook.cjs +2 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +323 -0
- package/package.json +4 -5
- package/scripts/bench-scope-resolution.ts +1 -3
- package/scripts/cross-platform-tests.ts +4 -1
- package/skills/gitnexus-cli.md +8 -6
- package/skills/gitnexus-debugging.md +15 -15
- package/skills/gitnexus-exploring.md +11 -11
- package/skills/gitnexus-guide.md +1 -1
- package/skills/gitnexus-impact-analysis.md +10 -10
- package/skills/gitnexus-pr-review.md +19 -19
- package/skills/gitnexus-refactoring.md +25 -25
- package/web/assets/{agent-BRX-afm3.js → agent-EkX7webX.js} +156 -131
- package/web/assets/{architectureDiagram-UL44E2DR-B1oYB8-c.js → architectureDiagram-UL44E2DR-BoczH8cv.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-SPC6pgWI.js → chunk-LCXTWHL2-By5HB3b-.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-DZXr4Yv3.js → chunk-RG4AUYOV-BQE_DkpL.js} +1 -1
- package/web/assets/{classDiagram-KGZ6W3CR-BqpOj8L9.js → classDiagram-KGZ6W3CR-Dj_02GUH.js} +1 -1
- package/web/assets/{classDiagram-v2-72OJOZXJ-FmElywK2.js → classDiagram-v2-72OJOZXJ-D-NArMpf.js} +1 -1
- package/web/assets/{diagram-3NCE3AQN-BWtJXMDq.js → diagram-3NCE3AQN-VXtXDO95.js} +1 -1
- package/web/assets/{diagram-GF46GFSD-Hh-fChxU.js → diagram-GF46GFSD-B1qab2Ah.js} +1 -1
- package/web/assets/{diagram-QXG6HAR7-DYeQHxGU.js → diagram-QXG6HAR7-BSCHGzzT.js} +1 -1
- package/web/assets/{diagram-WEQXMOUZ-DYGU4T0y.js → diagram-WEQXMOUZ-DHtknmNT.js} +1 -1
- package/web/assets/{erDiagram-L5TCEMPS-bN3wlP2A.js → erDiagram-L5TCEMPS-Db-IYTmm.js} +1 -1
- package/web/assets/{flowDiagram-H6V6AXG4-YACVtF3-.js → flowDiagram-H6V6AXG4-BHDoyVoW.js} +1 -1
- package/web/assets/{index-BhnAdWTt.js → index-BR0IhgbR.js} +10 -10
- package/web/assets/{infoDiagram-3YFTVSEB-BWBzD28-.js → infoDiagram-3YFTVSEB-6h8wbWEe.js} +1 -1
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-B8qYT-j9.js → ishikawaDiagram-BNXS4ZKH-Dx2OkPk1.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-BeoPr5Tl.js → kanban-definition-75IXJCU3-CIIEZfqV.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CdLLN_so.js → mindmap-definition-2TDM6QVE-DUAqydRq.js} +1 -1
- package/web/assets/{pieDiagram-CU6KROY3-DEd2a_k_.js → pieDiagram-CU6KROY3-BntYuYZa.js} +1 -1
- package/web/assets/{requirementDiagram-JXO7QTGE-QNeTo5C_.js → requirementDiagram-JXO7QTGE-QCD6I29n.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-BHC7q7yJ.js → sequenceDiagram-VS2MUI6T-DScFwLz2.js} +1 -1
- package/web/assets/{stateDiagram-7D4R322I-KONnc2Px.js → stateDiagram-7D4R322I-AkRAm6Hl.js} +1 -1
- package/web/assets/{stateDiagram-v2-36443NZ5-C2QfuMlu.js → stateDiagram-v2-36443NZ5-BCK1vigR.js} +1 -1
- package/web/assets/{timeline-definition-O6YCAMPW-D4t4NJx1.js → timeline-definition-O6YCAMPW-BvpIVXjX.js} +1 -1
- package/web/assets/{vennDiagram-MWXL3ELB-6bctC9Yg.js → vennDiagram-MWXL3ELB-BYGWk6dK.js} +1 -1
- package/web/assets/{wardleyDiagram-CUQ6CDDI-BPZYNTvC.js → wardleyDiagram-CUQ6CDDI-Dk1z7H2T.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-lBI9O6DW.js → xychartDiagram-N2JHSOCM-2N6NCSWN.js} +1 -1
- package/web/index.html +1 -1
- package/dist/_shared/scope-resolution/shadow/aggregate.d.ts +0 -63
- package/dist/_shared/scope-resolution/shadow/aggregate.d.ts.map +0 -1
- package/dist/_shared/scope-resolution/shadow/aggregate.js +0 -122
- package/dist/_shared/scope-resolution/shadow/aggregate.js.map +0 -1
- package/dist/_shared/scope-resolution/shadow/diff.d.ts +0 -59
- package/dist/_shared/scope-resolution/shadow/diff.d.ts.map +0 -1
- package/dist/_shared/scope-resolution/shadow/diff.js +0 -79
- package/dist/_shared/scope-resolution/shadow/diff.js.map +0 -1
- package/dist/core/ingestion/ast-cache.d.ts +0 -26
- package/dist/core/ingestion/ast-cache.js +0 -48
- package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +0 -13
- package/dist/core/ingestion/heritage-extractors/configs/go.js +0 -20
- package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +0 -18
- package/dist/core/ingestion/heritage-extractors/configs/ruby.js +0 -65
- package/dist/core/ingestion/heritage-extractors/generic.d.ts +0 -23
- package/dist/core/ingestion/heritage-extractors/generic.js +0 -47
- package/dist/core/ingestion/heritage-processor.d.ts +0 -54
- package/dist/core/ingestion/heritage-processor.js +0 -367
- package/dist/core/ingestion/heritage-types.d.ts +0 -73
- package/dist/core/ingestion/heritage-types.js +0 -2
- package/dist/core/ingestion/import-processor.d.ts +0 -23
- package/dist/core/ingestion/import-processor.js +0 -377
- package/dist/core/ingestion/model/heritage-map.d.ts +0 -105
- package/dist/core/ingestion/model/heritage-map.js +0 -294
- package/dist/core/ingestion/model/resolution-context.d.ts +0 -93
- package/dist/core/ingestion/model/resolution-context.js +0 -337
- package/dist/core/ingestion/named-bindings/csharp.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/csharp.js +0 -37
- package/dist/core/ingestion/named-bindings/java.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/java.js +0 -29
- package/dist/core/ingestion/named-bindings/kotlin.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/kotlin.js +0 -36
- package/dist/core/ingestion/named-bindings/php.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/php.js +0 -61
- package/dist/core/ingestion/named-bindings/python.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/python.js +0 -49
- package/dist/core/ingestion/named-bindings/rust.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/rust.js +0 -66
- package/dist/core/ingestion/named-bindings/types.d.ts +0 -16
- package/dist/core/ingestion/named-bindings/types.js +0 -6
- package/dist/core/ingestion/named-bindings/typescript.d.ts +0 -3
- package/dist/core/ingestion/named-bindings/typescript.js +0 -58
- package/dist/core/ingestion/pipeline-phases/cross-file-impl.d.ts +0 -17
- package/dist/core/ingestion/pipeline-phases/cross-file-impl.js +0 -209
- package/dist/core/ingestion/pipeline-phases/orm-extraction.d.ts +0 -22
- package/dist/core/ingestion/pipeline-phases/orm-extraction.js +0 -92
- package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.d.ts +0 -70
- package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.js +0 -312
- package/dist/core/ingestion/registry-primary-flag.d.ts +0 -89
- package/dist/core/ingestion/registry-primary-flag.js +0 -122
- package/dist/core/ingestion/shadow-harness.d.ts +0 -113
- package/dist/core/ingestion/shadow-harness.js +0 -148
- package/dist/core/ingestion/utils/ruby-self-call.d.ts +0 -52
- package/dist/core/ingestion/utils/ruby-self-call.js +0 -59
- package/scripts/ci-list-migrated-languages.ts +0 -24
- package/scripts/run-parity.ts +0 -128
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dart `ScopeResolver` registered in `SCOPE_RESOLVERS` and consumed by the
|
|
3
|
+
* generic `runScopeResolution` orchestrator (RFC #909 Ring 3, issue #939).
|
|
4
|
+
*
|
|
5
|
+
* Closest reference: Swift (`swiftScopeResolver`) — both are statically typed,
|
|
6
|
+
* have no `new` keyword, and model `Type(...)` as a reference to the type.
|
|
7
|
+
*
|
|
8
|
+
* ## Dart specifics
|
|
9
|
+
*
|
|
10
|
+
* - **`implements` / `with`.** Dart can implement (and mixes in) ordinary
|
|
11
|
+
* classes, so the edge type cannot be decided from the target's symbol
|
|
12
|
+
* kind (the generic `preEmitInheritanceEdges` pre-pass routes
|
|
13
|
+
* `Interface`/`Trait` → IMPLEMENTS, everything else → EXTENDS). `extends`
|
|
14
|
+
* is captured as `@reference.inherits` and rides the generic pre-pass
|
|
15
|
+
* (target is a class → EXTENDS); `implements`/`with` are carried as
|
|
16
|
+
* `__heritage__:` side-effect imports and emitted here as IMPLEMENTS by
|
|
17
|
+
* `emitDartHeritageEdges`. METHOD_IMPLEMENTS then falls out of the shared
|
|
18
|
+
* MRO/interface-dispatch phase.
|
|
19
|
+
* - **Mixin MRO.** `buildDartMro` augments the EXTENDS chain with mixin /
|
|
20
|
+
* interface ancestors (IMPLEMENTS edges) so mixed-in members participate
|
|
21
|
+
* in method lookup (PHP/Ruby trait pattern).
|
|
22
|
+
* - **No `new`.** `Type(...)` resolves to the Class node
|
|
23
|
+
* (`constructorCallTargetsClass`); the cross-file global free-call
|
|
24
|
+
* fallback is allowed (`allowGlobalFreeCallFallback`).
|
|
25
|
+
* - **Statically typed** → `fieldFallbackOnMethodLookup: false` (the
|
|
26
|
+
* field-walk heuristic over-connects when types are reliable).
|
|
27
|
+
*/
|
|
28
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
29
|
+
import { buildMro, defaultLinearize } from '../../scope-resolution/passes/mro.js';
|
|
30
|
+
import { populateClassOwnedMembers, isClassLike } from '../../scope-resolution/scope/walkers.js';
|
|
31
|
+
import { resolveDefGraphId } from '../../scope-resolution/graph-bridge/ids.js';
|
|
32
|
+
import { generateId } from '../../../../lib/utils.js';
|
|
33
|
+
import { dartProvider } from '../dart.js';
|
|
34
|
+
import { dartArityCompatibility, dartMergeBindings, resolveDartImportTarget } from './index.js';
|
|
35
|
+
import { decodeMarker } from '../../utils/heritage-marker.js';
|
|
36
|
+
import { expandDartWildcardNames } from './expand-wildcards.js';
|
|
37
|
+
/**
|
|
38
|
+
* Resolve a class simple name to a graph id with FILE AFFINITY: prefer a
|
|
39
|
+
* definition in `preferredFile`, then a workspace-unique match, otherwise
|
|
40
|
+
* refuse to guess (return undefined). This avoids the cross-file simple-name
|
|
41
|
+
* collision a global last-write-wins map produces — two files each declaring
|
|
42
|
+
* `Logger` where one `implements Logger` must bind its OWN file's `Logger`.
|
|
43
|
+
*/
|
|
44
|
+
function pickClassByName(name, preferredFile, defsByName) {
|
|
45
|
+
const cands = defsByName.get(name);
|
|
46
|
+
if (cands === undefined || cands.length === 0)
|
|
47
|
+
return undefined;
|
|
48
|
+
const sameFile = cands.find((c) => c.filePath === preferredFile);
|
|
49
|
+
if (sameFile !== undefined)
|
|
50
|
+
return sameFile.graphId;
|
|
51
|
+
if (cands.length === 1)
|
|
52
|
+
return cands[0].graphId;
|
|
53
|
+
return undefined; // ambiguous across files, none same-file — don't emit a wrong edge
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Emit IMPLEMENTS edges for Dart `implements`/`with` clauses, carried from
|
|
57
|
+
* `captures.ts` as `__heritage__:<kind>:<base>:<child>` side-effect imports.
|
|
58
|
+
* The marker lives in the implementing class's `ParsedFile`, so both the child
|
|
59
|
+
* and base names are resolved with same-file affinity (see `pickClassByName`),
|
|
60
|
+
* which keeps cross-file same-name classes from collapsing (mirror of Ruby's
|
|
61
|
+
* `emitRubyMixinEdges`, with the #1951-style file-affinity hardening).
|
|
62
|
+
*/
|
|
63
|
+
function emitDartHeritageEdges(graph, parsedFiles, nodeLookup) {
|
|
64
|
+
const defsByName = new Map();
|
|
65
|
+
for (const parsed of parsedFiles) {
|
|
66
|
+
for (const def of parsed.localDefs) {
|
|
67
|
+
if (!isClassLike(def.type))
|
|
68
|
+
continue;
|
|
69
|
+
const graphId = resolveDefGraphId(parsed.filePath, def, nodeLookup);
|
|
70
|
+
if (graphId === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
const simpleName = def.qualifiedName?.split('.').pop() ?? def.qualifiedName ?? '';
|
|
73
|
+
if (simpleName === '')
|
|
74
|
+
continue;
|
|
75
|
+
let list = defsByName.get(simpleName);
|
|
76
|
+
if (list === undefined) {
|
|
77
|
+
list = [];
|
|
78
|
+
defsByName.set(simpleName, list);
|
|
79
|
+
}
|
|
80
|
+
list.push({ graphId, filePath: parsed.filePath });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Pre-seed with existing IMPLEMENTS edges (reason-qualified) so a class that
|
|
84
|
+
// both `implements X` and `with X` keeps both distinct edges.
|
|
85
|
+
const emitted = new Set();
|
|
86
|
+
for (const rel of graph.iterRelationshipsByType('IMPLEMENTS')) {
|
|
87
|
+
emitted.add(`${rel.sourceId}->${rel.targetId}:${rel.reason}`);
|
|
88
|
+
}
|
|
89
|
+
for (const parsed of parsedFiles) {
|
|
90
|
+
for (const imp of parsed.parsedImports) {
|
|
91
|
+
const raw = imp.targetRaw;
|
|
92
|
+
if (typeof raw !== 'string')
|
|
93
|
+
continue;
|
|
94
|
+
const decoded = decodeMarker(raw);
|
|
95
|
+
if (decoded?.kind !== 'heritage')
|
|
96
|
+
continue;
|
|
97
|
+
const parts = decoded.fields;
|
|
98
|
+
if (parts.length < 3)
|
|
99
|
+
continue;
|
|
100
|
+
const [kind, baseName, childName] = parts;
|
|
101
|
+
const childId = pickClassByName(childName, parsed.filePath, defsByName);
|
|
102
|
+
const baseId = pickClassByName(baseName, parsed.filePath, defsByName);
|
|
103
|
+
if (childId === undefined || baseId === undefined || childId === baseId)
|
|
104
|
+
continue;
|
|
105
|
+
const key = `${childId}->${baseId}:${kind}`;
|
|
106
|
+
if (emitted.has(key))
|
|
107
|
+
continue;
|
|
108
|
+
emitted.add(key);
|
|
109
|
+
graph.addRelationship({
|
|
110
|
+
id: generateId('IMPLEMENTS', key),
|
|
111
|
+
sourceId: childId,
|
|
112
|
+
targetId: baseId,
|
|
113
|
+
type: 'IMPLEMENTS',
|
|
114
|
+
confidence: 0.9,
|
|
115
|
+
reason: kind,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Dart MRO: the EXTENDS superclass chain (`defaultLinearize`) augmented with
|
|
122
|
+
* mixin / interface ancestors discovered via IMPLEMENTS edges, so mixed-in and
|
|
123
|
+
* interface-default members participate in method lookup. Mixins are appended
|
|
124
|
+
* after the superclass chain (first-seen approximates Dart linearization for
|
|
125
|
+
* dispatch purposes).
|
|
126
|
+
*/
|
|
127
|
+
function buildDartMro(graph, parsedFiles, nodeLookup) {
|
|
128
|
+
const mro = buildMro(graph, parsedFiles, nodeLookup, defaultLinearize);
|
|
129
|
+
const defIdByGraphId = new Map();
|
|
130
|
+
for (const parsed of parsedFiles) {
|
|
131
|
+
for (const def of parsed.localDefs) {
|
|
132
|
+
if (!isClassLike(def.type))
|
|
133
|
+
continue;
|
|
134
|
+
const graphId = resolveDefGraphId(parsed.filePath, def, nodeLookup);
|
|
135
|
+
if (graphId !== undefined)
|
|
136
|
+
defIdByGraphId.set(graphId, def.nodeId);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const implsByChild = new Map();
|
|
140
|
+
for (const rel of graph.iterRelationshipsByType('IMPLEMENTS')) {
|
|
141
|
+
const child = defIdByGraphId.get(rel.sourceId);
|
|
142
|
+
const base = defIdByGraphId.get(rel.targetId);
|
|
143
|
+
if (child === undefined || base === undefined)
|
|
144
|
+
continue;
|
|
145
|
+
let set = implsByChild.get(child);
|
|
146
|
+
if (set === undefined) {
|
|
147
|
+
set = new Set();
|
|
148
|
+
implsByChild.set(child, set);
|
|
149
|
+
}
|
|
150
|
+
set.add(base);
|
|
151
|
+
}
|
|
152
|
+
for (const [childDefId, impls] of implsByChild) {
|
|
153
|
+
const extendsChain = mro.get(childDefId) ?? [];
|
|
154
|
+
const seen = new Set(extendsChain);
|
|
155
|
+
const merged = [...extendsChain];
|
|
156
|
+
for (const base of impls) {
|
|
157
|
+
if (!seen.has(base)) {
|
|
158
|
+
seen.add(base);
|
|
159
|
+
merged.push(base);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
mro.set(childDefId, merged);
|
|
163
|
+
}
|
|
164
|
+
return mro;
|
|
165
|
+
}
|
|
166
|
+
export const dartScopeResolver = {
|
|
167
|
+
language: SupportedLanguages.Dart,
|
|
168
|
+
languageProvider: dartProvider,
|
|
169
|
+
importEdgeReason: 'dart-scope: import',
|
|
170
|
+
resolveImportTarget: (targetRaw, fromFile, allFilePaths) => resolveDartImportTarget(targetRaw, fromFile, allFilePaths),
|
|
171
|
+
// Dart `import` is whole-library: every public top-level symbol of the
|
|
172
|
+
// target enters scope. Enumerating them lets `propagateImportedReturnTypes`
|
|
173
|
+
// mirror imported functions' return types into the importer.
|
|
174
|
+
expandsWildcardTo: (targetModuleScope, parsedFiles) => expandDartWildcardNames(targetModuleScope, parsedFiles),
|
|
175
|
+
// Dart shadowing: local declarations hide imports.
|
|
176
|
+
mergeBindings: (existing, incoming) => [...dartMergeBindings([...existing, ...incoming])],
|
|
177
|
+
// Adapter: dartArityCompatibility uses (def, callsite); contract is (callsite, def).
|
|
178
|
+
arityCompatibility: (callsite, def) => dartArityCompatibility(def, callsite),
|
|
179
|
+
buildMro: (graph, parsedFiles, nodeLookup) => buildDartMro(graph, parsedFiles, nodeLookup),
|
|
180
|
+
// Methods/fields are owned by their enclosing class/mixin/extension.
|
|
181
|
+
populateOwners: (parsed) => populateClassOwnedMembers(parsed),
|
|
182
|
+
// `super.method()` dispatches through the superclass + mixin chain.
|
|
183
|
+
isSuperReceiver: (text) => text.trim() === 'super',
|
|
184
|
+
// `implements` / `with` IMPLEMENTS edges (extends rides the generic
|
|
185
|
+
// inherits pre-pass; these need an explicit, kind-independent edge type).
|
|
186
|
+
emitHeritageEdges: (graph, parsedFiles, nodeLookup) => emitDartHeritageEdges(graph, parsedFiles, nodeLookup),
|
|
187
|
+
// Dart is statically typed — the field-fallback heuristic over-connects.
|
|
188
|
+
fieldFallbackOnMethodLookup: false,
|
|
189
|
+
propagatesReturnTypesAcrossImports: true,
|
|
190
|
+
// No `new`: bare `Foo()` resolves to the type; with cross-file imports the
|
|
191
|
+
// callee is reachable workspace-wide.
|
|
192
|
+
allowGlobalFreeCallFallback: true,
|
|
193
|
+
constructorCallTargetsClass: true,
|
|
194
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize parameter-type and return-type bindings for a Dart function /
|
|
3
|
+
* method. Mirror of `languages/swift/signature-bindings.ts`:
|
|
4
|
+
*
|
|
5
|
+
* - Parameter bindings (`@type-binding.parameter`) are anchored on the
|
|
6
|
+
* `function_body` node so they land in the (synthesized) Function scope
|
|
7
|
+
* — the receiver of `param.method()` resolves against the param's type.
|
|
8
|
+
* - The return-type binding (`@type-binding.return`) is anchored on the
|
|
9
|
+
* declaration node and carries the function name → return type; the
|
|
10
|
+
* `bindingScopeFor` hook hoists it to the Module scope so callers (and
|
|
11
|
+
* `propagateImportedReturnTypes`) see `var u = getUser(); u.m()` resolve.
|
|
12
|
+
*
|
|
13
|
+
* Reuses `dartMethodConfig.extractParameters/extractName/extractReturnType`,
|
|
14
|
+
* which descend the `method_signature`/`declaration` wrapper internally.
|
|
15
|
+
*/
|
|
16
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
17
|
+
import type { CaptureMatch } from '../../../../_shared/index.js';
|
|
18
|
+
/**
|
|
19
|
+
* `declNode` is the declaration wrapper. `bodyNode` is the resolved sibling
|
|
20
|
+
* `function_body` (or `null` for a bodyless/abstract declaration, in which
|
|
21
|
+
* case only the return binding is emitted).
|
|
22
|
+
*/
|
|
23
|
+
export declare function synthesizeDartSignatureBindings(declNode: SyntaxNode, bodyNode: SyntaxNode | null): CaptureMatch[];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize parameter-type and return-type bindings for a Dart function /
|
|
3
|
+
* method. Mirror of `languages/swift/signature-bindings.ts`:
|
|
4
|
+
*
|
|
5
|
+
* - Parameter bindings (`@type-binding.parameter`) are anchored on the
|
|
6
|
+
* `function_body` node so they land in the (synthesized) Function scope
|
|
7
|
+
* — the receiver of `param.method()` resolves against the param's type.
|
|
8
|
+
* - The return-type binding (`@type-binding.return`) is anchored on the
|
|
9
|
+
* declaration node and carries the function name → return type; the
|
|
10
|
+
* `bindingScopeFor` hook hoists it to the Module scope so callers (and
|
|
11
|
+
* `propagateImportedReturnTypes`) see `var u = getUser(); u.m()` resolve.
|
|
12
|
+
*
|
|
13
|
+
* Reuses `dartMethodConfig.extractParameters/extractName/extractReturnType`,
|
|
14
|
+
* which descend the `method_signature`/`declaration` wrapper internally.
|
|
15
|
+
*/
|
|
16
|
+
import { nodeToCapture, syntheticCapture } from '../../utils/ast-helpers.js';
|
|
17
|
+
import { dartMethodConfig } from '../../method-extractors/configs/dart.js';
|
|
18
|
+
function buildBindingMatch(anchor, sourceTag, name, typeText) {
|
|
19
|
+
return {
|
|
20
|
+
[sourceTag]: nodeToCapture(sourceTag, anchor),
|
|
21
|
+
'@type-binding.name': syntheticCapture('@type-binding.name', anchor, name),
|
|
22
|
+
'@type-binding.type': syntheticCapture('@type-binding.type', anchor, typeText),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `declNode` is the declaration wrapper. `bodyNode` is the resolved sibling
|
|
27
|
+
* `function_body` (or `null` for a bodyless/abstract declaration, in which
|
|
28
|
+
* case only the return binding is emitted).
|
|
29
|
+
*/
|
|
30
|
+
export function synthesizeDartSignatureBindings(declNode, bodyNode) {
|
|
31
|
+
const out = [];
|
|
32
|
+
if (bodyNode !== null) {
|
|
33
|
+
const params = dartMethodConfig.extractParameters?.(declNode) ?? [];
|
|
34
|
+
for (const p of params) {
|
|
35
|
+
if (p.type === null || p.name === '')
|
|
36
|
+
continue;
|
|
37
|
+
out.push(buildBindingMatch(bodyNode, '@type-binding.parameter', p.name, p.type));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const returnType = dartMethodConfig.extractReturnType?.(declNode);
|
|
41
|
+
const funcName = dartMethodConfig.extractName?.(declNode);
|
|
42
|
+
if (funcName !== undefined &&
|
|
43
|
+
funcName !== '' &&
|
|
44
|
+
returnType !== undefined &&
|
|
45
|
+
returnType !== '' &&
|
|
46
|
+
returnType !== 'void' &&
|
|
47
|
+
returnType !== 'dynamic') {
|
|
48
|
+
out.push(buildBindingMatch(declNode, '@type-binding.return', funcName, returnType));
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small explicit Dart scope-resolution hooks:
|
|
3
|
+
*
|
|
4
|
+
* - `dartBindingScopeFor` — (1) hoists `@type-binding.return` bindings to
|
|
5
|
+
* the Module scope so chain-follow + `propagateImportedReturnTypes` see
|
|
6
|
+
* them; (2) hoists function/method/constructor declaration NAMES to the
|
|
7
|
+
* enclosing parent scope. The second case is Dart-specific: because
|
|
8
|
+
* `function_signature`/`function_body` are siblings, the synthesized
|
|
9
|
+
* Function scope starts AT the declaration, so the central auto-hoist
|
|
10
|
+
* (which fires only when the declaration anchor range equals the scope
|
|
11
|
+
* range) does not trigger; without this the function name would bind
|
|
12
|
+
* inside its own body instead of being visible to callers/siblings.
|
|
13
|
+
* - `dartImportOwningScope` — imports attach to the Module scope only.
|
|
14
|
+
* - `dartReceiverBinding` — the implicit `this`/`super` receiver of a
|
|
15
|
+
* Function scope.
|
|
16
|
+
*/
|
|
17
|
+
import type { ParsedImport, Scope, ScopeId, ScopeTree, TypeRef, CaptureMatch } from '../../../../_shared/index.js';
|
|
18
|
+
export declare function dartBindingScopeFor(decl: CaptureMatch, innermost: Scope, tree: ScopeTree): ScopeId | null;
|
|
19
|
+
export declare function dartImportOwningScope(_imp: ParsedImport, innermost: Scope, _tree: ScopeTree): ScopeId | null;
|
|
20
|
+
export declare function dartReceiverBinding(functionScope: Scope): TypeRef | null;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small explicit Dart scope-resolution hooks:
|
|
3
|
+
*
|
|
4
|
+
* - `dartBindingScopeFor` — (1) hoists `@type-binding.return` bindings to
|
|
5
|
+
* the Module scope so chain-follow + `propagateImportedReturnTypes` see
|
|
6
|
+
* them; (2) hoists function/method/constructor declaration NAMES to the
|
|
7
|
+
* enclosing parent scope. The second case is Dart-specific: because
|
|
8
|
+
* `function_signature`/`function_body` are siblings, the synthesized
|
|
9
|
+
* Function scope starts AT the declaration, so the central auto-hoist
|
|
10
|
+
* (which fires only when the declaration anchor range equals the scope
|
|
11
|
+
* range) does not trigger; without this the function name would bind
|
|
12
|
+
* inside its own body instead of being visible to callers/siblings.
|
|
13
|
+
* - `dartImportOwningScope` — imports attach to the Module scope only.
|
|
14
|
+
* - `dartReceiverBinding` — the implicit `this`/`super` receiver of a
|
|
15
|
+
* Function scope.
|
|
16
|
+
*/
|
|
17
|
+
export function dartBindingScopeFor(decl, innermost, tree) {
|
|
18
|
+
// (1) Return-type bindings hoist to the Module scope.
|
|
19
|
+
if (decl['@type-binding.return'] !== undefined) {
|
|
20
|
+
let cur = innermost;
|
|
21
|
+
while (cur !== undefined && cur.kind !== 'Module') {
|
|
22
|
+
const parentId = cur.parent;
|
|
23
|
+
if (parentId === null)
|
|
24
|
+
break;
|
|
25
|
+
cur = tree.getScope(parentId);
|
|
26
|
+
}
|
|
27
|
+
if (cur !== undefined && cur.kind === 'Module')
|
|
28
|
+
return cur.id;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// (2) Function/method/constructor names are visible in the enclosing scope.
|
|
32
|
+
if (decl['@declaration.function'] !== undefined ||
|
|
33
|
+
decl['@declaration.method'] !== undefined ||
|
|
34
|
+
decl['@declaration.constructor'] !== undefined) {
|
|
35
|
+
if (innermost.kind === 'Function' && innermost.parent !== null)
|
|
36
|
+
return innermost.parent;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
export function dartImportOwningScope(_imp, innermost, _tree) {
|
|
41
|
+
return innermost.kind === 'Module' ? innermost.id : null;
|
|
42
|
+
}
|
|
43
|
+
export function dartReceiverBinding(functionScope) {
|
|
44
|
+
if (functionScope.kind !== 'Function')
|
|
45
|
+
return null;
|
|
46
|
+
return functionScope.typeBindings.get('this') ?? functionScope.typeBindings.get('super') ?? null;
|
|
47
|
+
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Dart Language Provider
|
|
3
3
|
*
|
|
4
4
|
* Dart traits:
|
|
5
|
-
* - importSemantics: 'wildcard-leaf' (Dart imports bring everything public into scope)
|
|
6
5
|
* - exportChecker: public if no leading underscore
|
|
7
6
|
* - Dart SDK imports (dart:*) and external packages are skipped
|
|
8
7
|
* - enclosingFunctionFinder: Dart's tree-sitter grammar places function_body
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Dart Language Provider
|
|
3
3
|
*
|
|
4
4
|
* Dart traits:
|
|
5
|
-
* - importSemantics: 'wildcard-leaf' (Dart imports bring everything public into scope)
|
|
6
5
|
* - exportChecker: public if no leading underscore
|
|
7
6
|
* - Dart SDK imports (dart:*) and external packages are skipped
|
|
8
7
|
* - enclosingFunctionFinder: Dart's tree-sitter grammar places function_body
|
|
@@ -27,7 +26,8 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
|
27
26
|
import { dartVariableConfig } from '../variable-extractors/configs/dart.js';
|
|
28
27
|
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
29
28
|
import { dartCallConfig } from '../call-extractors/configs/dart.js';
|
|
30
|
-
import {
|
|
29
|
+
import { emitDartScopeCaptures, interpretDartImport, interpretDartTypeBinding, dartBindingScopeFor, dartImportOwningScope, dartReceiverBinding, dartMergeBindings, dartArityCompatibility, } from './dart/index.js';
|
|
30
|
+
import { DART_BUILT_INS } from './dart/built-ins.js';
|
|
31
31
|
/**
|
|
32
32
|
* Resolve the enclosing function from a `function_body` node by looking at its
|
|
33
33
|
* previous sibling. In Dart's tree-sitter grammar, function_signature and
|
|
@@ -59,30 +59,6 @@ const dartEnclosingFunctionFinder = (node) => {
|
|
|
59
59
|
const funcName = target.childForFieldName?.('name')?.text ?? null;
|
|
60
60
|
return funcName ? { funcName, label } : null;
|
|
61
61
|
};
|
|
62
|
-
const BUILT_INS = new Set([
|
|
63
|
-
'setState',
|
|
64
|
-
'mounted',
|
|
65
|
-
'debugPrint',
|
|
66
|
-
'runApp',
|
|
67
|
-
'showDialog',
|
|
68
|
-
'showModalBottomSheet',
|
|
69
|
-
'Navigator',
|
|
70
|
-
'push',
|
|
71
|
-
'pushNamed',
|
|
72
|
-
'pushReplacement',
|
|
73
|
-
'pop',
|
|
74
|
-
'maybePop',
|
|
75
|
-
'ScaffoldMessenger',
|
|
76
|
-
'showSnackBar',
|
|
77
|
-
'deactivate',
|
|
78
|
-
'reassemble',
|
|
79
|
-
'debugDumpApp',
|
|
80
|
-
'debugDumpRenderTree',
|
|
81
|
-
'then',
|
|
82
|
-
'catchError',
|
|
83
|
-
'whenComplete',
|
|
84
|
-
'listen',
|
|
85
|
-
]);
|
|
86
62
|
export const dartProvider = defineLanguage({
|
|
87
63
|
id: SupportedLanguages.Dart,
|
|
88
64
|
extensions: ['.dart'],
|
|
@@ -126,13 +102,23 @@ export const dartProvider = defineLanguage({
|
|
|
126
102
|
typeConfig: dartConfig,
|
|
127
103
|
exportChecker: dartExportChecker,
|
|
128
104
|
importResolver: createImportResolver(dartImportConfig),
|
|
129
|
-
importSemantics: 'wildcard-leaf',
|
|
130
105
|
callExtractor: createCallExtractor(dartCallConfig),
|
|
131
106
|
fieldExtractor: createFieldExtractor(dartFieldConfig),
|
|
132
107
|
methodExtractor: createMethodExtractor(dartMethodConfig),
|
|
133
108
|
variableExtractor: createVariableExtractor(dartVariableConfig),
|
|
134
109
|
classExtractor: createClassExtractor(dartClassConfig),
|
|
135
|
-
heritageExtractor: createHeritageExtractor(SupportedLanguages.Dart),
|
|
136
110
|
enclosingFunctionFinder: dartEnclosingFunctionFinder,
|
|
137
|
-
builtInNames:
|
|
111
|
+
builtInNames: DART_BUILT_INS,
|
|
112
|
+
// ── Scope-based resolution hooks (RFC #909 Ring 3, issue #939) ──────────────
|
|
113
|
+
// Parsing-side surface consumed by `ScopeExtractor` once per file. The
|
|
114
|
+
// emit-side `ScopeResolver` lives in `dart/scope-resolver.ts`; the same
|
|
115
|
+
// function references flow through both interfaces.
|
|
116
|
+
emitScopeCaptures: emitDartScopeCaptures,
|
|
117
|
+
interpretImport: interpretDartImport,
|
|
118
|
+
interpretTypeBinding: interpretDartTypeBinding,
|
|
119
|
+
bindingScopeFor: dartBindingScopeFor,
|
|
120
|
+
importOwningScope: dartImportOwningScope,
|
|
121
|
+
receiverBinding: dartReceiverBinding,
|
|
122
|
+
mergeBindings: (_scope, bindings) => dartMergeBindings(bindings),
|
|
123
|
+
arityCompatibility: dartArityCompatibility,
|
|
138
124
|
});
|
|
@@ -3,6 +3,7 @@ export interface GoArityMetadata {
|
|
|
3
3
|
readonly parameterCount?: number;
|
|
4
4
|
readonly requiredParameterCount?: number;
|
|
5
5
|
readonly parameterTypes?: readonly string[];
|
|
6
|
+
readonly returnType?: string;
|
|
6
7
|
}
|
|
7
8
|
export declare function computeGoDeclarationArity(node: SyntaxNode): GoArityMetadata;
|
|
8
9
|
export declare function computeGoCallArity(callNode: SyntaxNode): number;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
export function computeGoDeclarationArity(node) {
|
|
2
2
|
const params = node.childForFieldName('parameters');
|
|
3
|
+
const returnType = extractGoReturnType(node);
|
|
3
4
|
if (params === null)
|
|
4
|
-
return {};
|
|
5
|
+
return returnType === undefined ? {} : { returnType };
|
|
6
|
+
return {
|
|
7
|
+
...computeGoParameterMetadata(params),
|
|
8
|
+
...(returnType === undefined ? {} : { returnType }),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function computeGoParameterMetadata(params) {
|
|
5
12
|
let count = 0;
|
|
6
13
|
let required = 0;
|
|
7
14
|
const types = [];
|
|
@@ -35,3 +42,26 @@ export function computeGoCallArity(callNode) {
|
|
|
35
42
|
return 0;
|
|
36
43
|
return args.namedChildCount;
|
|
37
44
|
}
|
|
45
|
+
function extractGoReturnType(node) {
|
|
46
|
+
const result = node.childForFieldName('result');
|
|
47
|
+
if (result === null)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (result.type !== 'parameter_list')
|
|
50
|
+
return result.text;
|
|
51
|
+
const returnTypes = [];
|
|
52
|
+
for (const child of result.namedChildren) {
|
|
53
|
+
if (child.type !== 'parameter_declaration')
|
|
54
|
+
continue;
|
|
55
|
+
const typeNode = child.childForFieldName('type');
|
|
56
|
+
if (typeNode === null)
|
|
57
|
+
continue;
|
|
58
|
+
const names = child.namedChildren.filter((c) => c.type === 'identifier');
|
|
59
|
+
const n = Math.max(1, names.length);
|
|
60
|
+
for (let i = 0; i < n; i++) {
|
|
61
|
+
returnTypes.push(typeNode.text);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (returnTypes.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
return returnTypes.length === 1 ? returnTypes[0] : `(${returnTypes.join(', ')})`;
|
|
67
|
+
}
|