gitnexus 1.6.10-rc.99 → 1.6.10
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 +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +77 -2
- package/dist/core/index-freshness.js +109 -2
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +65 -19
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +14 -2
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +19 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +598 -16
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +77 -32
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/query.js +15 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +211 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- 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/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.js +29 -0
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +39 -1
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +39 -6
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +87 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +267 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +214 -29
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +309 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/error-D9MtuG9s.js +1 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +16 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -17,10 +17,17 @@ export function interpretPythonImport(captures) {
|
|
|
17
17
|
// `@import.name` : the imported symbol name (or module name for plain imports)
|
|
18
18
|
// `@import.alias` : the local alias name (for `as` forms)
|
|
19
19
|
// `@import.source`: the module path (always present except for `dynamic`)
|
|
20
|
+
// `@import.publishes`: present iff the statement is at module level
|
|
20
21
|
const kindCap = captures['@import.kind'];
|
|
21
22
|
const nameCap = captures['@import.name'];
|
|
22
23
|
const aliasCap = captures['@import.alias'];
|
|
23
24
|
const sourceCap = captures['@import.source'];
|
|
25
|
+
// Python has no dedicated re-export form: a module-level `from m import x`
|
|
26
|
+
// binds `x` AND publishes it as `<this module>.x`. See `reexportsName` on
|
|
27
|
+
// `ParsedImport` for the contract, and `import-decomposer.ts` for why the
|
|
28
|
+
// marker — not this function — decides whether the statement is at module
|
|
29
|
+
// level.
|
|
30
|
+
const republishes = captures['@import.publishes'] !== undefined;
|
|
24
31
|
const kind = kindCap?.text;
|
|
25
32
|
if (kind === undefined)
|
|
26
33
|
return null;
|
|
@@ -56,10 +63,14 @@ export function interpretPythonImport(captures) {
|
|
|
56
63
|
localName: nameCap.text,
|
|
57
64
|
importedName: nameCap.text,
|
|
58
65
|
targetRaw: sourceCap.text,
|
|
66
|
+
...(republishes ? { reexportsName: true } : {}),
|
|
59
67
|
};
|
|
60
68
|
}
|
|
61
69
|
case 'from-alias': {
|
|
62
|
-
// `from m import x as y`
|
|
70
|
+
// `from m import x as y` — republished under the alias (`<module>.y`).
|
|
71
|
+
// PEP 484 treats `import x as x` as an explicit re-export; Python's
|
|
72
|
+
// runtime namespace republishes every module-level form, so the flag
|
|
73
|
+
// follows module level rather than the redundant-alias case.
|
|
63
74
|
if (sourceCap === undefined || nameCap === undefined || aliasCap === undefined)
|
|
64
75
|
return null;
|
|
65
76
|
return {
|
|
@@ -68,6 +79,7 @@ export function interpretPythonImport(captures) {
|
|
|
68
79
|
importedName: nameCap.text,
|
|
69
80
|
alias: aliasCap.text,
|
|
70
81
|
targetRaw: sourceCap.text,
|
|
82
|
+
...(republishes ? { reexportsName: true } : {}),
|
|
71
83
|
};
|
|
72
84
|
}
|
|
73
85
|
case 'wildcard': {
|
|
@@ -118,12 +130,18 @@ export function interpretPythonTypeBinding(captures) {
|
|
|
118
130
|
// `Registry.lookup` Step 2 treats them identically.
|
|
119
131
|
else if (captures['@type-binding.cls'] !== undefined)
|
|
120
132
|
source = 'self';
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
133
|
+
// Before the instance-field arm, not after it: `self.x = Outer()` (#2807)
|
|
134
|
+
// carries BOTH markers, and its type is inferred from the CONSTRUCTOR CALL —
|
|
135
|
+
// the weakest of the three tiers — so a class that also annotates the field
|
|
136
|
+
// keeps the annotation. Testing constructor first is what lets the
|
|
137
|
+
// instance-field arm below stay flat; the two orders agree on every input,
|
|
138
|
+
// since they differ only where both markers are present and both then say
|
|
139
|
+
// 'constructor-inferred'.
|
|
125
140
|
else if (captures['@type-binding.constructor'] !== undefined)
|
|
126
141
|
source = 'constructor-inferred';
|
|
142
|
+
else if (captures['@type-binding.instance-field'] !== undefined)
|
|
143
|
+
source =
|
|
144
|
+
captures['@type-binding.parameter'] !== undefined ? 'parameter-annotation' : 'annotation';
|
|
127
145
|
else if (captures['@type-binding.annotation'] !== undefined)
|
|
128
146
|
source = 'annotation';
|
|
129
147
|
else if (captures['@type-binding.alias'] !== undefined)
|
|
@@ -139,6 +157,41 @@ function stripForwardRefQuotes(text) {
|
|
|
139
157
|
}
|
|
140
158
|
return text;
|
|
141
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Container bases whose SINGLE type argument is the element type.
|
|
162
|
+
*
|
|
163
|
+
* The single source of truth for both the matcher below and the property test
|
|
164
|
+
* that asserts every one of them is also declined as a user generic — the two
|
|
165
|
+
* lists drifting apart is the defect this arrangement exists to make
|
|
166
|
+
* impossible. Order is significant only in that it is the regex alternation
|
|
167
|
+
* order; keep additions grouped with their family.
|
|
168
|
+
*/
|
|
169
|
+
export const SINGLE_ARG_CONTAINERS = [
|
|
170
|
+
'list',
|
|
171
|
+
'List',
|
|
172
|
+
'set',
|
|
173
|
+
'Set',
|
|
174
|
+
'tuple',
|
|
175
|
+
'Tuple',
|
|
176
|
+
'Iterable',
|
|
177
|
+
'Iterator',
|
|
178
|
+
'Sequence',
|
|
179
|
+
'Generator',
|
|
180
|
+
'AsyncIterable',
|
|
181
|
+
'AsyncIterator',
|
|
182
|
+
];
|
|
183
|
+
/** Container bases whose SECOND type argument is the value type. See {@link SINGLE_ARG_CONTAINERS}. */
|
|
184
|
+
export const MAPPING_CONTAINERS = [
|
|
185
|
+
'dict',
|
|
186
|
+
'Dict',
|
|
187
|
+
'Mapping',
|
|
188
|
+
'MutableMapping',
|
|
189
|
+
'OrderedDict',
|
|
190
|
+
'DefaultDict',
|
|
191
|
+
];
|
|
192
|
+
const QUALIFIER = '(?:[A-Za-z_][A-Za-z0-9_]*\\.)?';
|
|
193
|
+
const SINGLE_ARG_CONTAINER_RE = new RegExp(`^${QUALIFIER}(?:${SINGLE_ARG_CONTAINERS.join('|')})\\[([^,\\]]+)\\]$`);
|
|
194
|
+
const MAPPING_CONTAINER_RE = new RegExp(`^${QUALIFIER}(?:${MAPPING_CONTAINERS.join('|')})\\[[^,\\]]+,\\s*([^\\]]+)\\]$`);
|
|
142
195
|
/**
|
|
143
196
|
* Unwrap a single-arg generic collection wrapper — `list[User]`,
|
|
144
197
|
* `set[User]`, `Iterable[User]`, `Sequence[User]`, `Iterator[User]`,
|
|
@@ -151,7 +204,7 @@ function stripForwardRefQuotes(text) {
|
|
|
151
204
|
* resolution time.
|
|
152
205
|
*/
|
|
153
206
|
function stripGeneric(text) {
|
|
154
|
-
const single = text.match(
|
|
207
|
+
const single = text.match(SINGLE_ARG_CONTAINER_RE);
|
|
155
208
|
if (single !== null)
|
|
156
209
|
return single[1].trim();
|
|
157
210
|
// dict[K, V] / Dict[K, V] / Mapping[K, V] — strip to value type V.
|
|
@@ -161,11 +214,200 @@ function stripGeneric(text) {
|
|
|
161
214
|
// only shape worth handling. Match a top-level K up to the first
|
|
162
215
|
// comma and a V to the closing bracket; nested generics in V (e.g.
|
|
163
216
|
// `dict[str, list[User]]`) are left for a downstream strip pass.
|
|
164
|
-
const dict = text.match(
|
|
217
|
+
const dict = text.match(MAPPING_CONTAINER_RE);
|
|
165
218
|
if (dict !== null)
|
|
166
219
|
return dict[1].trim();
|
|
220
|
+
// A subscripted type the two allow-lists above did NOT claim is a
|
|
221
|
+
// user-defined GENERIC, not a container: `Repo[User]`, `Handler[Req, Res]`.
|
|
222
|
+
// Its base names one declaration — `Repo[User]` and `Repo[Order]` are the
|
|
223
|
+
// same `class Repo(Generic[T])` — so reduce to that base, exactly as Java's
|
|
224
|
+
// and Swift's interpreters already do for their `<…>` spelling (#2833).
|
|
225
|
+
//
|
|
226
|
+
// Guarded by a DENY set rather than reached by fallthrough, because "the two
|
|
227
|
+
// rules above did not match" is NOT the same as "not a container". Two
|
|
228
|
+
// measured counterexamples, both of which this branch got wrong before the
|
|
229
|
+
// guard existed:
|
|
230
|
+
// - `dict[str, list[User]]` — the dict rule's value group cannot span a
|
|
231
|
+
// nested `]`, so it declines and the shape falls through. Reducing it to
|
|
232
|
+
// `dict` destroys the value type the dict rule explicitly leaves "for a
|
|
233
|
+
// downstream strip pass"; the annotation must survive intact instead.
|
|
234
|
+
// - `Callable[[int], User]`, `Literal["a"]`, `Annotated[int, F()]`,
|
|
235
|
+
// `Union[A, B]`, `tuple[int, ...]` — typing SPECIAL FORMS, not classes.
|
|
236
|
+
// Reducing them yields a bare `Callable`/`Literal`/`Union`, which binds
|
|
237
|
+
// to a workspace class of that name if one exists — a fabricated edge,
|
|
238
|
+
// and those names are ordinary enough for a real codebase to declare.
|
|
239
|
+
// Anything named here keeps its as-written text and resolves as it did
|
|
240
|
+
// before #2833.
|
|
241
|
+
//
|
|
242
|
+
// Only reached for genuine annotations: every Python `@type-binding.type`
|
|
243
|
+
// capture is a `(type)`, `(identifier)`, `(attribute)` or `(dotted_name)`
|
|
244
|
+
// node, so a subscripted VALUE expression (`arr[0]`) never arrives here.
|
|
245
|
+
//
|
|
246
|
+
// The as-written spelling is not lost — `scope-extractor` keeps it on
|
|
247
|
+
// `TypeRef.declaredSpelling` whenever it differs from the reduced name,
|
|
248
|
+
// which is what the receiver fold's index step reads.
|
|
249
|
+
const userGeneric = text.match(/^((?:[A-Za-z_][A-Za-z0-9_]*\.)*[A-Za-z_][A-Za-z0-9_]*)\[.+\]$/s);
|
|
250
|
+
if (userGeneric !== null) {
|
|
251
|
+
const qualified = userGeneric[1].trim();
|
|
252
|
+
const base = qualified.slice(qualified.lastIndexOf('.') + 1);
|
|
253
|
+
if (!isNotAUserGenericBase(base))
|
|
254
|
+
return qualified;
|
|
255
|
+
}
|
|
167
256
|
return text;
|
|
168
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Whether a subscripted annotation's base names a Python type-system construct
|
|
260
|
+
* rather than a workspace class — see {@link NOT_A_USER_GENERIC_SPELLINGS}.
|
|
261
|
+
*
|
|
262
|
+
* CASE-FOLDED, and that is the load-bearing part. PEP 585 gave nearly every
|
|
263
|
+
* container two spellings — the builtin/`collections` one and the `typing`
|
|
264
|
+
* alias (`deque` / `typing.Deque`, `frozenset` / `typing.FrozenSet`,
|
|
265
|
+
* `defaultdict` / `typing.DefaultDict`) — which differ ONLY in case. Matching
|
|
266
|
+
* exactly meant each pair had to be listed twice and any half-pair was a silent
|
|
267
|
+
* escape: `deque` was listed, `Deque` was not, so `self.dq: Deque[User]`
|
|
268
|
+
* reduced to `Deque` and bound to a workspace `class Deque` (#2855). Folding
|
|
269
|
+
* case closes that axis by construction instead of by vigilance.
|
|
270
|
+
*
|
|
271
|
+
* The cost is that a workspace class whose name is a case VARIANT of a stdlib
|
|
272
|
+
* construct (`class deque(Generic[T])`) stops reducing. PEP 8 makes such a
|
|
273
|
+
* class vanishingly rare, and the loss is a missing edge — recoverable — where
|
|
274
|
+
* the gain is not minting a confident wrong one.
|
|
275
|
+
*/
|
|
276
|
+
function isNotAUserGenericBase(base) {
|
|
277
|
+
return NOT_A_USER_GENERIC.has(base.toLowerCase());
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Bases a subscripted annotation may carry that are NOT user-defined generics.
|
|
281
|
+
*
|
|
282
|
+
* SCOPE — the standard library, and deliberately nothing else. The names below
|
|
283
|
+
* are the documented Python type-system surface (`typing`'s deprecated PEP 585
|
|
284
|
+
* aliases and its special forms, plus the stdlib classes those aliases point
|
|
285
|
+
* at); that universe is CLOSED and versioned by CPython, so the list is
|
|
286
|
+
* auditable against
|
|
287
|
+
* <https://docs.python.org/3/library/typing.html#deprecated-aliases>.
|
|
288
|
+
*
|
|
289
|
+
* Third-party generics (`Mapped[int]`, `QuerySet[User]`) are NOT listed. That
|
|
290
|
+
* universe is open, so enumerating it only ever chases the last escape, and
|
|
291
|
+
* denying an ordinary name like `Model` would cost real edges in the many
|
|
292
|
+
* projects that legitimately declare one. Those spellings still reduce to their
|
|
293
|
+
* base, and the base is now admitted only on the grounds `resolveErasedBaseName`
|
|
294
|
+
* applies at resolution time — the file's scope chain binds it, the declaration
|
|
295
|
+
* is in this very file, the index proves the name is a template family, or the
|
|
296
|
+
* file has no cross-file class channel to be absent from. A `Mapped[User]` whose
|
|
297
|
+
* base the file cannot see therefore binds nothing, which is the structural
|
|
298
|
+
* answer this parse-time pass cannot give and no longer has to.
|
|
299
|
+
*
|
|
300
|
+
* Two distinct reasons to decline, both always-correct at this layer:
|
|
301
|
+
* - CONTAINERS, including ones the two rules above do not own. Reducing
|
|
302
|
+
* `deque[User]` to `deque` types a receiver as the container and retargets
|
|
303
|
+
* every call in a for-loop chain, and reducing `dict[str, list[User]]` to
|
|
304
|
+
* `dict` destroys the value type the dict rule leaves for a downstream pass.
|
|
305
|
+
* - `typing` SPECIAL FORMS, which are not classes at all. `Callable`,
|
|
306
|
+
* `Literal`, `Union` reduce to a bare name that binds to a workspace class
|
|
307
|
+
* of that name if one exists — a fabricated edge.
|
|
308
|
+
*
|
|
309
|
+
* Members are listed ONCE per case-insensitive concept: {@link
|
|
310
|
+
* isNotAUserGenericBase} folds case, so the builtin spelling covers its PEP 585
|
|
311
|
+
* `typing` twin (`deque` covers `Deque`, `frozenset` covers `FrozenSet`).
|
|
312
|
+
* Non-generic ABCs (`Hashable`, `Sized`) are omitted — they cannot be written
|
|
313
|
+
* subscripted, so they never reach this branch.
|
|
314
|
+
*
|
|
315
|
+
* Exported for the property test that asserts the case-fold closure holds
|
|
316
|
+
* behaviourally; nothing else should read it.
|
|
317
|
+
*/
|
|
318
|
+
export const NOT_A_USER_GENERIC_SPELLINGS = [
|
|
319
|
+
// ── builtins subscriptable since PEP 585 ──────────────────────────────────
|
|
320
|
+
'list',
|
|
321
|
+
'set',
|
|
322
|
+
'frozenset',
|
|
323
|
+
'tuple',
|
|
324
|
+
'dict',
|
|
325
|
+
'type',
|
|
326
|
+
// ── `collections` ─────────────────────────────────────────────────────────
|
|
327
|
+
'defaultdict',
|
|
328
|
+
'OrderedDict',
|
|
329
|
+
'ChainMap',
|
|
330
|
+
'Counter',
|
|
331
|
+
'deque',
|
|
332
|
+
// ── `collections.abc`, the subscriptable members ──────────────────────────
|
|
333
|
+
'Mapping',
|
|
334
|
+
'MutableMapping',
|
|
335
|
+
'Sequence',
|
|
336
|
+
'MutableSequence',
|
|
337
|
+
'AbstractSet',
|
|
338
|
+
'MutableSet',
|
|
339
|
+
'Collection',
|
|
340
|
+
'Container',
|
|
341
|
+
'Reversible',
|
|
342
|
+
'Iterable',
|
|
343
|
+
'Iterator',
|
|
344
|
+
'Generator',
|
|
345
|
+
'AsyncIterable',
|
|
346
|
+
'AsyncIterator',
|
|
347
|
+
'AsyncGenerator',
|
|
348
|
+
'Awaitable',
|
|
349
|
+
'Coroutine',
|
|
350
|
+
'KeysView',
|
|
351
|
+
'ValuesView',
|
|
352
|
+
'ItemsView',
|
|
353
|
+
'MappingView',
|
|
354
|
+
// ── `contextlib`, and the `typing` aliases to it ──────────────────────────
|
|
355
|
+
'ContextManager',
|
|
356
|
+
'AsyncContextManager',
|
|
357
|
+
'AbstractContextManager',
|
|
358
|
+
'AbstractAsyncContextManager',
|
|
359
|
+
// ── `re`, and the `typing` aliases to it ──────────────────────────────────
|
|
360
|
+
// `Pattern` and `Match` ARE classes, so reducing them is not wrong the way
|
|
361
|
+
// reducing `Callable` is; they are declined because in Python annotations
|
|
362
|
+
// these spellings are overwhelmingly the `re` types, while a workspace class
|
|
363
|
+
// of the same name is a parser's own `Pattern`/`Match` and would be bound
|
|
364
|
+
// with no import evidence whatsoever. Same policy as the receiver-chain
|
|
365
|
+
// resolver's: a missing edge is recoverable, a confident wrong one is not.
|
|
366
|
+
'Pattern',
|
|
367
|
+
'Match',
|
|
368
|
+
// ── I/O streams (`typing.IO` and its two subclasses) ──────────────────────
|
|
369
|
+
'IO',
|
|
370
|
+
'TextIO',
|
|
371
|
+
'BinaryIO',
|
|
372
|
+
// ── stdlib generic classes with ordinary names ────────────────────────────
|
|
373
|
+
// Same policy call as `Pattern`/`Match` above, and the sharpest instance of
|
|
374
|
+
// it: `asyncio.Task[Result]` reduces to `asyncio.Task`, whose dotted-tail
|
|
375
|
+
// fallback then single-matches an unrelated workspace `class Task`.
|
|
376
|
+
'Queue',
|
|
377
|
+
'Task',
|
|
378
|
+
'Future',
|
|
379
|
+
'PathLike',
|
|
380
|
+
// ── `typing` special forms — not classes ──────────────────────────────────
|
|
381
|
+
'Callable',
|
|
382
|
+
'Literal',
|
|
383
|
+
'Annotated',
|
|
384
|
+
'Union',
|
|
385
|
+
'Optional',
|
|
386
|
+
'Final',
|
|
387
|
+
'ClassVar',
|
|
388
|
+
// `typing.Type` is the PEP 585 alias for the builtin `type` listed above, and
|
|
389
|
+
// the case fold already covers it — see the one-entry-per-concept rule.
|
|
390
|
+
'TypeGuard',
|
|
391
|
+
'TypeIs',
|
|
392
|
+
'Unpack',
|
|
393
|
+
'Required',
|
|
394
|
+
'NotRequired',
|
|
395
|
+
'ReadOnly',
|
|
396
|
+
'Concatenate',
|
|
397
|
+
'LiteralString',
|
|
398
|
+
// ── generic machinery: bases and type-parameter declarations ──────────────
|
|
399
|
+
// `Generic[T]`/`Protocol[T]` are written subscripted for real. The three
|
|
400
|
+
// declaration forms are not subscriptable in valid Python, but this
|
|
401
|
+
// interpreter checks no grammar — it reduces whatever text the annotation
|
|
402
|
+
// capture carried — so they are declined defensively.
|
|
403
|
+
'Generic',
|
|
404
|
+
'Protocol',
|
|
405
|
+
'TypeVar',
|
|
406
|
+
'ParamSpec',
|
|
407
|
+
'TypeVarTuple',
|
|
408
|
+
];
|
|
409
|
+
/** Case-folded lookup index over {@link NOT_A_USER_GENERIC_SPELLINGS}. */
|
|
410
|
+
const NOT_A_USER_GENERIC = new Set(NOT_A_USER_GENERIC_SPELLINGS.map((name) => name.toLowerCase()));
|
|
169
411
|
/**
|
|
170
412
|
* Unwrap nullable type annotations so downstream resolution treats
|
|
171
413
|
* `User | None`, `None | User`, and `Optional[User]` identically to
|
|
@@ -20,6 +20,15 @@ const PYTHON_SCOPE_QUERY = `
|
|
|
20
20
|
(function_definition
|
|
21
21
|
name: (identifier) @declaration.name) @declaration.function
|
|
22
22
|
|
|
23
|
+
;; Lambda bindings (\`f = lambda x: x\`). The \`@declaration.function\` anchor
|
|
24
|
+
;; sits on the INNER lambda so its range aligns with \`(lambda) @scope.function\`
|
|
25
|
+
;; above; otherwise the def is owned by the module scope and calls inside the
|
|
26
|
+
;; lambda lose caller attribution. Mirrors the TypeScript arrow patterns (#2687).
|
|
27
|
+
(expression_statement
|
|
28
|
+
(assignment
|
|
29
|
+
left: (identifier) @declaration.name
|
|
30
|
+
right: (lambda) @declaration.function))
|
|
31
|
+
|
|
23
32
|
(assignment
|
|
24
33
|
left: (identifier) @declaration.name) @declaration.variable
|
|
25
34
|
|
|
@@ -21,14 +21,16 @@ import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
|
21
21
|
export declare function synthesizeReceiverTypeBinding(fnNode: SyntaxNode): CaptureMatch | null;
|
|
22
22
|
/**
|
|
23
23
|
* Synthesize class-scope field bindings for the common Python constructor
|
|
24
|
-
* injection
|
|
24
|
+
* injection patterns:
|
|
25
25
|
*
|
|
26
26
|
* def __init__(self, service: Service):
|
|
27
|
-
* self.service = service
|
|
27
|
+
* self.service = service # from the PARAMETER's annotation
|
|
28
|
+
* self.cache: Cache = build() # from the FIELD's own annotation
|
|
29
|
+
* self.outer = Outer() # from the CONSTRUCTOR called (#2807)
|
|
28
30
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
31
|
+
* The three tiers rank in that order — an explicit field annotation beats a
|
|
32
|
+
* parameter annotation, which beats a construction. Anything else is still
|
|
33
|
+
* refused: the receiver resolver needs positive evidence, not a name-only
|
|
34
|
+
* guess from an arbitrary RHS.
|
|
33
35
|
*/
|
|
34
36
|
export declare function synthesizeConstructorFieldTypeBindings(fnNode: SyntaxNode): CaptureMatch[];
|
|
@@ -114,17 +114,79 @@ export function synthesizeReceiverTypeBinding(fnNode) {
|
|
|
114
114
|
'@type-binding.type': syntheticCapture('@type-binding.type', first, className),
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The class name of a direct constructor call — `Outer()` — or `undefined` for
|
|
119
|
+
* anything else. Python has no `new`, so a call is the only syntactic
|
|
120
|
+
* construction form, and a call to a plain name is the shape every other
|
|
121
|
+
* language spells `= new X()`.
|
|
122
|
+
*
|
|
123
|
+
* BARE NAMES ONLY. A dotted callee (`models.User()`, `f.Alpha()`) is refused.
|
|
124
|
+
* The first cut of #2807 returned the callee's full dotted text, on the theory
|
|
125
|
+
* that a dotted name resolves through `QualifiedNameIndex` the way the
|
|
126
|
+
* module-level `u = models.User()` capture in `query.ts` does. Measured on a
|
|
127
|
+
* fixture carrying both shapes, that arm produced no correct edge and did
|
|
128
|
+
* produce wrong ones:
|
|
129
|
+
*
|
|
130
|
+
* - `self.svc = f.Alpha()`, where `Alpha` is a METHOD on an unrelated object
|
|
131
|
+
* and `Alpha` is also a class elsewhere: the dotted lookup matches the
|
|
132
|
+
* TRAILING segment against a same-named class, so `self.svc.ping()` emitted
|
|
133
|
+
* a FABRICATED edge to `Alpha.ping`. The root does not have to be a
|
|
134
|
+
* parameter — a module-level `shared_factory.Alpha()` fabricates the same
|
|
135
|
+
* way — so no test on the root's binding form contains this.
|
|
136
|
+
* - `self.u = models.User()`, the shape the arm was written FOR, emitted no
|
|
137
|
+
* edge with the arm or without it. An instance field's binding lands in
|
|
138
|
+
* CLASS scope, which never reaches the namespace split that makes the
|
|
139
|
+
* module-level local form resolve.
|
|
140
|
+
*
|
|
141
|
+
* Accepted cost, stated plainly: `self.u = models.User()` still does not type
|
|
142
|
+
* its field. It did not before this narrowing either, so nothing that worked is
|
|
143
|
+
* given up — and declining to bind is the doctrine `compound-receiver.ts`
|
|
144
|
+
* states, that a confidently WRONG owner is strictly worse than a missing edge.
|
|
145
|
+
* Re-enabling dotted callees is a RESOLUTION-side change (teach the field path
|
|
146
|
+
* the namespace split that #2826/#2828 is reworking); redoing it here could
|
|
147
|
+
* only re-open the trailing-segment fabrication.
|
|
148
|
+
*
|
|
149
|
+
* This is also why the tier tie-break below can stay last-write-wins: the
|
|
150
|
+
* displacement it used to suffer — `self.conn = Outer()` then
|
|
151
|
+
* `self.conn = Registry.get()`, where the second, dotted, non-type candidate
|
|
152
|
+
* overwrote the real constructor binding at the shared weakest tier and left
|
|
153
|
+
* the field untyped — cannot arise once a dotted callee yields no candidate at
|
|
154
|
+
* all. The weakest tier now ranks only REAL constructions against each other,
|
|
155
|
+
* where the last write in `__init__` genuinely is the live one.
|
|
156
|
+
*/
|
|
157
|
+
function constructorCallTypeName(right, receiverName) {
|
|
158
|
+
if (right === null || right.type !== 'call')
|
|
159
|
+
return undefined;
|
|
160
|
+
const callee = right.childForFieldName('function');
|
|
161
|
+
if (callee === null)
|
|
162
|
+
return undefined;
|
|
163
|
+
// An `attribute` callee is the dotted path refused above; `self.p =
|
|
164
|
+
// self.build()` is one instance of it, and a method call is not a
|
|
165
|
+
// construction.
|
|
166
|
+
if (callee.type !== 'identifier')
|
|
167
|
+
return undefined;
|
|
168
|
+
const text = callee.text.trim();
|
|
169
|
+
if (text.length === 0)
|
|
170
|
+
return undefined;
|
|
171
|
+
// `self.p = self()` invokes the instance's own `__call__`. It is a call to a
|
|
172
|
+
// bare name, but that name is the receiver, not a type.
|
|
173
|
+
if (text === receiverName)
|
|
174
|
+
return undefined;
|
|
175
|
+
return text;
|
|
176
|
+
}
|
|
117
177
|
/**
|
|
118
178
|
* Synthesize class-scope field bindings for the common Python constructor
|
|
119
|
-
* injection
|
|
179
|
+
* injection patterns:
|
|
120
180
|
*
|
|
121
181
|
* def __init__(self, service: Service):
|
|
122
|
-
* self.service = service
|
|
182
|
+
* self.service = service # from the PARAMETER's annotation
|
|
183
|
+
* self.cache: Cache = build() # from the FIELD's own annotation
|
|
184
|
+
* self.outer = Outer() # from the CONSTRUCTOR called (#2807)
|
|
123
185
|
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
186
|
+
* The three tiers rank in that order — an explicit field annotation beats a
|
|
187
|
+
* parameter annotation, which beats a construction. Anything else is still
|
|
188
|
+
* refused: the receiver resolver needs positive evidence, not a name-only
|
|
189
|
+
* guess from an arbitrary RHS.
|
|
128
190
|
*/
|
|
129
191
|
export function synthesizeConstructorFieldTypeBindings(fnNode) {
|
|
130
192
|
if (fnNode.childForFieldName('name')?.text !== '__init__')
|
|
@@ -151,6 +213,17 @@ export function synthesizeConstructorFieldTypeBindings(fnNode) {
|
|
|
151
213
|
if (name !== null && annotation !== null)
|
|
152
214
|
parameterTypes.set(name, annotation.text);
|
|
153
215
|
}
|
|
216
|
+
// Three evidence tiers for one field, strongest first. A later assignment of
|
|
217
|
+
// the SAME tier still wins (last write in `__init__` is the live one), but a
|
|
218
|
+
// weaker one never displaces a stronger: `self.x: Outer = make()` keeps its
|
|
219
|
+
// annotation even if a later branch does `self.x = Other()`.
|
|
220
|
+
//
|
|
221
|
+
// Same-tier last-write-wins is only sound because `constructorCallTypeName`
|
|
222
|
+
// admits nothing but real constructions into the weakest tier — see the note
|
|
223
|
+
// there on the `self.conn = Registry.get()` displacement it used to allow.
|
|
224
|
+
const TIER_EXPLICIT = 2;
|
|
225
|
+
const TIER_PARAMETER = 1;
|
|
226
|
+
const TIER_CONSTRUCTOR = 0;
|
|
154
227
|
const candidates = new Map();
|
|
155
228
|
const stack = [body];
|
|
156
229
|
while (stack.length > 0) {
|
|
@@ -175,21 +248,44 @@ export function synthesizeConstructorFieldTypeBindings(fnNode) {
|
|
|
175
248
|
if (object?.type === 'identifier' && object.text === receiverName && field !== null) {
|
|
176
249
|
const explicitType = node.childForFieldName('type');
|
|
177
250
|
const parameterType = right?.type === 'identifier' ? parameterTypes.get(right.text) : undefined;
|
|
178
|
-
|
|
251
|
+
// `self.x = Outer()` — the type comes from the CONSTRUCTOR being
|
|
252
|
+
// called (#2807). This is not the "arbitrary unannotated RHS" the
|
|
253
|
+
// header warns against: a call to a name that resolves to a class is
|
|
254
|
+
// the same positive evidence every other language reads from
|
|
255
|
+
// `= new X()`, and without it an unannotated instance field could
|
|
256
|
+
// never act as a call receiver at all. Weakest of the three tiers, so
|
|
257
|
+
// an explicit annotation or a parameter annotation still wins.
|
|
258
|
+
const constructedType = explicitType === null && parameterType === undefined
|
|
259
|
+
? constructorCallTypeName(right, receiverName)
|
|
260
|
+
: undefined;
|
|
261
|
+
const typeName = explicitType?.text ?? parameterType ?? constructedType;
|
|
179
262
|
if (typeName !== undefined) {
|
|
180
263
|
const explicit = explicitType !== null;
|
|
264
|
+
const inferredFromConstructor = constructedType !== undefined;
|
|
265
|
+
const tier = explicit
|
|
266
|
+
? TIER_EXPLICIT
|
|
267
|
+
: inferredFromConstructor
|
|
268
|
+
? TIER_CONSTRUCTOR
|
|
269
|
+
: TIER_PARAMETER;
|
|
181
270
|
const existing = candidates.get(field.text);
|
|
182
|
-
if (existing === undefined ||
|
|
271
|
+
if (existing === undefined || tier >= existing.tier) {
|
|
183
272
|
candidates.set(field.text, {
|
|
184
|
-
|
|
273
|
+
tier,
|
|
185
274
|
match: {
|
|
186
275
|
'@type-binding.name': syntheticCapture('@type-binding.name', field, field.text),
|
|
187
276
|
'@type-binding.type': syntheticCapture('@type-binding.type', explicitType ?? right ?? field, typeName),
|
|
277
|
+
// The marker that tells `interpretPythonTypeBinding` which
|
|
278
|
+
// tier this is; an explicit annotation carries neither and
|
|
279
|
+
// reads as `annotation`.
|
|
188
280
|
...(explicit
|
|
189
281
|
? {}
|
|
190
|
-
:
|
|
191
|
-
|
|
192
|
-
|
|
282
|
+
: inferredFromConstructor
|
|
283
|
+
? {
|
|
284
|
+
'@type-binding.constructor': syntheticCapture('@type-binding.constructor', right ?? field, '1'),
|
|
285
|
+
}
|
|
286
|
+
: {
|
|
287
|
+
'@type-binding.parameter': syntheticCapture('@type-binding.parameter', right ?? field, '1'),
|
|
288
|
+
}),
|
|
193
289
|
'@type-binding.instance-field': syntheticCapture('@type-binding.instance-field', node, '1'),
|
|
194
290
|
},
|
|
195
291
|
});
|
|
@@ -14,24 +14,37 @@
|
|
|
14
14
|
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
15
15
|
import { buildMro, defaultLinearize } from '../../scope-resolution/passes/mro.js';
|
|
16
16
|
import { populateClassOwnedMembers } from '../../scope-resolution/scope/walkers.js';
|
|
17
|
+
import { indexOnlyElementType } from '../../type-extractors/shared.js';
|
|
17
18
|
import { pythonProvider } from '../python.js';
|
|
18
|
-
import { pythonArityCompatibility, pythonMergeBindings, resolvePythonImportTarget, } from './index.js';
|
|
19
|
+
import { isPythonImportedModule, pythonNamespaceReceiverPaths, pythonArityCompatibility, pythonMergeBindings, resolvePythonImportTarget, } from './index.js';
|
|
19
20
|
const pythonScopeResolver = {
|
|
21
|
+
// A free call naming a class constructs it: `Service(db).do_work()` (#2708).
|
|
22
|
+
constructionSyntax: { bare: true },
|
|
20
23
|
language: SupportedLanguages.Python,
|
|
21
24
|
languageProvider: pythonProvider,
|
|
22
25
|
importEdgeReason: 'python-scope: import',
|
|
23
|
-
resolveImportTarget: (targetRaw, fromFile, allFilePaths) => {
|
|
26
|
+
resolveImportTarget: (targetRaw, fromFile, allFilePaths, _resolutionConfig, context) => {
|
|
24
27
|
// Pass the orchestrator's stable run-level `ReadonlySet` straight through
|
|
25
28
|
// (no per-import copy). The Python resolver chain only reads the set, and
|
|
26
29
|
// `getPythonFileIndex` memoizes its index on the set's identity via a
|
|
27
30
|
// WeakMap — so the index is built once per run and reused across every
|
|
28
31
|
// import. Copying here (the previous `new Set(allFilePaths)`) handed a
|
|
29
32
|
// fresh identity to every import, defeating that cache (PR #1918 review P1).
|
|
30
|
-
const ws = {
|
|
33
|
+
const ws = {
|
|
34
|
+
fromFile,
|
|
35
|
+
allFilePaths,
|
|
36
|
+
parsedFiles: context?.parsedFiles,
|
|
37
|
+
};
|
|
31
38
|
// `WorkspaceIndex` is an opaque `unknown` placeholder in the
|
|
32
39
|
// shared contract, so `ws` passes structurally without a cast.
|
|
33
|
-
return resolvePythonImportTarget({ kind: '
|
|
40
|
+
return resolvePythonImportTarget(context?.parsedImport ?? { kind: 'namespace', localName: '_', importedName: '_', targetRaw }, ws);
|
|
34
41
|
},
|
|
42
|
+
isNamespaceImport: (parsedImport, targetFile, fromFile) => isPythonImportedModule(parsedImport, targetFile, fromFile),
|
|
43
|
+
// `import a.b.c` binds only `a`, yet makes `a`, `a.b` and `a.b.c` all
|
|
44
|
+
// callable — each naming a different file. Without this the absolute-import
|
|
45
|
+
// style is invisible to the call graph, and the root key points at the leaf
|
|
46
|
+
// module instead of the package (#2826).
|
|
47
|
+
namespaceReceiverPaths: pythonNamespaceReceiverPaths,
|
|
35
48
|
// Python LEGB precedence: local > import/namespace/reexport > wildcard.
|
|
36
49
|
// The per-scope id is unused by pythonMergeBindings (tier ordering
|
|
37
50
|
// is computed purely from BindingRef.origin), so we don't need to
|
|
@@ -45,6 +58,16 @@ const pythonScopeResolver = {
|
|
|
45
58
|
buildMro: (graph, parsedFiles, nodeLookup) => buildMro(graph, parsedFiles, nodeLookup, defaultLinearize),
|
|
46
59
|
populateOwners: (parsed) => populateClassOwnedMembers(parsed),
|
|
47
60
|
isSuperReceiver: (text) => /^super\s*\(/.test(text),
|
|
61
|
+
// Subscript route only — Python spells collection views as method calls
|
|
62
|
+
// (`.values()`), which the compound resolver's call branch already handles.
|
|
63
|
+
//
|
|
64
|
+
// The hook receives the annotation AS WRITTEN (`List[User]`, `Dict[str, User]`),
|
|
65
|
+
// not the name `interpret.ts`'s `stripGeneric` reduced it to, so `undefined`
|
|
66
|
+
// here means "this spelling is not a container" — which is what stops
|
|
67
|
+
// `cfg['k'].run()` on a `__getitem__`-bearing class from folding onto the
|
|
68
|
+
// class itself. Answering the route at all is what keeps `repos[0].save()`
|
|
69
|
+
// resolving.
|
|
70
|
+
elementTypeOf: indexOnlyElementType,
|
|
48
71
|
// Python is dynamically typed — field-fallback heuristic on, return-
|
|
49
72
|
// type propagation across imports on. Both default to true; listed
|
|
50
73
|
// explicitly here for documentation.
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* analysis.
|
|
7
7
|
*/
|
|
8
8
|
import { findAncestorBeforeBoundary, FUNCTION_NODE_TYPES } from '../../utils/ast-helpers.js';
|
|
9
|
+
import { walkToScope } from '../../utils/scope-tree-walk.js';
|
|
9
10
|
const PYTHON_METHOD_CONTAINER_TYPES = new Set(['class_definition']);
|
|
10
11
|
export function pythonFunctionDefinitionLabel(functionNode, defaultLabel) {
|
|
11
12
|
if (defaultLabel !== 'Function')
|
|
@@ -21,14 +22,7 @@ export function pythonFunctionDefinitionLabel(functionNode, defaultLabel) {
|
|
|
21
22
|
* field type on the enclosing Class scope. */
|
|
22
23
|
export function pythonBindingScopeFor(decl, innermost, tree) {
|
|
23
24
|
if (decl['@type-binding.instance-field'] !== undefined) {
|
|
24
|
-
|
|
25
|
-
while (current !== undefined) {
|
|
26
|
-
if (current.kind === 'Class')
|
|
27
|
-
return current.id;
|
|
28
|
-
if (current.parent === null)
|
|
29
|
-
break;
|
|
30
|
-
current = tree.getScope(current.parent);
|
|
31
|
-
}
|
|
25
|
+
return walkToScope(innermost, tree, 'Class');
|
|
32
26
|
}
|
|
33
27
|
return null;
|
|
34
28
|
}
|
|
@@ -28,6 +28,7 @@ import { createPythonCfgVisitor } from '../cfg/visitors/python.js';
|
|
|
28
28
|
import { emitPythonScopeCaptures, pythonFunctionDefinitionLabel, interpretPythonImport, interpretPythonTypeBinding, pythonArityCompatibility, pythonBindingScopeFor, pythonImportOwningScope, pythonMergeBindings, pythonReceiverBinding, resolvePythonImportTarget, } from './python/index.js';
|
|
29
29
|
import { extractDjangoRoutes } from '../route-extractors/django.js';
|
|
30
30
|
import { discoverDjangoRootUrls } from '../route-extractors/django-root-discovery.js';
|
|
31
|
+
import { extractPythonModuleConstants } from '../route-extractors/python-const-resolver.js';
|
|
31
32
|
const BUILT_INS = new Set([
|
|
32
33
|
'print',
|
|
33
34
|
'len',
|
|
@@ -134,4 +135,16 @@ export const pythonProvider = defineLanguage({
|
|
|
134
135
|
receiverBinding: pythonReceiverBinding,
|
|
135
136
|
arityCompatibility: pythonArityCompatibility,
|
|
136
137
|
resolveImportTarget: resolvePythonImportTarget,
|
|
138
|
+
// ── #2391 constant harvest, provider-hook form (#2980): module-level string
|
|
139
|
+
// constants + from-imports for non-literal decorator route paths. Bare-name
|
|
140
|
+
// refs fold through the shared resolver (no foldRoutePathOperands needed).
|
|
141
|
+
// No `moduleConstantHeuristic`: Python harvests unconditionally, exactly as
|
|
142
|
+
// #2391 shipped it. A content gate was tried here and removed on review — it
|
|
143
|
+
// required `NAME` immediately followed by `=`, so it silently dropped the two
|
|
144
|
+
// idiomatic typed-FastAPI shapes (`API: str = "/api"`,
|
|
145
|
+
// `API: Final[str] = "/api"`) and every composed constant whose RHS starts
|
|
146
|
+
// with an identifier (`USERS = BASE + "/users"`), i.e. it REGRESSED routes
|
|
147
|
+
// that already resolve on main. The worker treats a missing heuristic as
|
|
148
|
+
// default-open; only Java opts into a gate, where the cost actually bites.
|
|
149
|
+
extractModuleConstants: extractPythonModuleConstants,
|
|
137
150
|
});
|