gitnexus 1.6.9 → 1.6.10-aptos.0
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 +211 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.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 +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +197 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- 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.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +5 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +28 -0
- package/dist/core/move/consistency.js +98 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +49 -0
- package/dist/core/move/move-ingest.js +320 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +3 -3
- package/dist/core/run-analyze.js +1001 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -35,20 +35,51 @@ import { getTreeSitterBufferSize } from '../../constants.js';
|
|
|
35
35
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
36
36
|
import { encodeMarker } from '../../utils/heritage-marker.js';
|
|
37
37
|
import { DART_BUILT_INS } from './built-ins.js';
|
|
38
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
39
|
+
import { preprocessDartExtensionTypes } from './extension-type-preprocess.js';
|
|
38
40
|
const FUNCTION_DECL_TAGS = [
|
|
39
41
|
'@declaration.function',
|
|
40
42
|
'@declaration.method',
|
|
41
43
|
'@declaration.constructor',
|
|
42
44
|
];
|
|
45
|
+
const DART_CALLABLE_CAPTURE_OPTIONS = {
|
|
46
|
+
functionNodeTypes: new Set(['function_signature', 'function_expression']),
|
|
47
|
+
callNodeTypes: new Set(['selector']),
|
|
48
|
+
parameterListNodeTypes: new Set(['formal_parameter_list', 'arguments']),
|
|
49
|
+
parameterNodeTypes: new Set(['formal_parameter']),
|
|
50
|
+
bindingNodeTypes: new Set(['initialized_variable_definition']),
|
|
51
|
+
assignmentNodeTypes: new Set(['assignment_expression']),
|
|
52
|
+
identifierNodeTypes: new Set(['identifier', 'type_identifier']),
|
|
53
|
+
lexicalFunctionOwner: (node) => dartLexicalFunctionOwner(node),
|
|
54
|
+
isCallNode: (node) => node.namedChild(0)?.type === 'argument_part',
|
|
55
|
+
extractCallCallee: (node) => dartCallableCallee(node) ?? undefined,
|
|
56
|
+
callSiteNode: (node) => dartCallableCallee(node) ?? undefined,
|
|
57
|
+
callableProtocolMethods: new Set(['call']),
|
|
58
|
+
};
|
|
59
|
+
function dartLexicalFunctionOwner(input) {
|
|
60
|
+
let node = input;
|
|
61
|
+
while (node !== null) {
|
|
62
|
+
if (node.type === 'function_signature' || node.type === 'function_expression')
|
|
63
|
+
return node;
|
|
64
|
+
if (node.type === 'function_body') {
|
|
65
|
+
const signature = node.previousNamedSibling;
|
|
66
|
+
if (signature?.type === 'function_signature')
|
|
67
|
+
return signature;
|
|
68
|
+
}
|
|
69
|
+
node = node.parent;
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
43
73
|
export function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
74
|
+
const parseText = preprocessDartExtensionTypes(sourceText);
|
|
44
75
|
let tree;
|
|
45
76
|
if (cachedTree !== undefined && cachedTree !== null) {
|
|
46
77
|
tree = cachedTree;
|
|
47
78
|
recordCacheHit();
|
|
48
79
|
}
|
|
49
80
|
else {
|
|
50
|
-
tree = parseSourceSafe(getDartParser(),
|
|
51
|
-
bufferSize: getTreeSitterBufferSize(
|
|
81
|
+
tree = parseSourceSafe(getDartParser(), parseText, undefined, {
|
|
82
|
+
bufferSize: getTreeSitterBufferSize(parseText),
|
|
52
83
|
});
|
|
53
84
|
recordCacheMiss();
|
|
54
85
|
}
|
|
@@ -132,9 +163,25 @@ export function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
132
163
|
emitHeritage(node, out);
|
|
133
164
|
return;
|
|
134
165
|
}
|
|
166
|
+
if (node.type === 'extension_declaration') {
|
|
167
|
+
emitExtensionImplementsHeritage(node, out);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
135
170
|
});
|
|
171
|
+
out.push(...synthesizeCallableFlowCaptures(root, DART_CALLABLE_CAPTURE_OPTIONS));
|
|
136
172
|
return out;
|
|
137
173
|
}
|
|
174
|
+
function dartCallableCallee(selector) {
|
|
175
|
+
if (selector.namedChild(0)?.type !== 'argument_part')
|
|
176
|
+
return null;
|
|
177
|
+
const previous = selector.previousNamedSibling;
|
|
178
|
+
if (previous?.type === 'identifier')
|
|
179
|
+
return previous;
|
|
180
|
+
if (previous?.type !== 'selector')
|
|
181
|
+
return null;
|
|
182
|
+
const inner = previous.namedChild(0);
|
|
183
|
+
return inner !== null && ASSIGNABLE_SELECTORS.has(inner.type) ? selectorName(inner) : null;
|
|
184
|
+
}
|
|
138
185
|
// ─── Function scope synthesis ───────────────────────────────────────────────
|
|
139
186
|
/**
|
|
140
187
|
* The sibling `function_body` of a declaration, or null (abstract/bodyless).
|
|
@@ -434,6 +481,47 @@ function emitHeritage(classNode, out) {
|
|
|
434
481
|
emitHeritageMarkers(interfaces, 'implements', className, out);
|
|
435
482
|
}
|
|
436
483
|
}
|
|
484
|
+
function emitExtensionImplementsHeritage(extensionNode, out) {
|
|
485
|
+
const nameNode = extensionNode.childForFieldName('name');
|
|
486
|
+
if (nameNode === null)
|
|
487
|
+
return;
|
|
488
|
+
const bodyStart = extensionNode.text.indexOf('{');
|
|
489
|
+
const header = bodyStart === -1 ? extensionNode.text : extensionNode.text.slice(0, bodyStart);
|
|
490
|
+
const implementsIndex = header.indexOf('implements');
|
|
491
|
+
if (implementsIndex === -1)
|
|
492
|
+
return;
|
|
493
|
+
const className = nameNode.text;
|
|
494
|
+
const interfaces = header.slice(implementsIndex + 'implements'.length);
|
|
495
|
+
for (const rawInterface of splitTopLevelCommaList(interfaces)) {
|
|
496
|
+
const target = /^[ \t]*([A-Za-z_$][A-Za-z0-9_$]*)/.exec(rawInterface)?.[1];
|
|
497
|
+
if (target === undefined)
|
|
498
|
+
continue;
|
|
499
|
+
const payload = encodeMarker('heritage', ['implements', target, className]);
|
|
500
|
+
out.push({ '@import.heritage': syntheticCapture('@import.heritage', nameNode, payload) });
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
function splitTopLevelCommaList(text) {
|
|
504
|
+
const parts = [];
|
|
505
|
+
let start = 0;
|
|
506
|
+
let angleDepth = 0;
|
|
507
|
+
for (let i = 0; i < text.length; i++) {
|
|
508
|
+
const ch = text[i];
|
|
509
|
+
if (ch === '<') {
|
|
510
|
+
angleDepth++;
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
if (ch === '>' && angleDepth > 0) {
|
|
514
|
+
angleDepth--;
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (ch === ',' && angleDepth === 0) {
|
|
518
|
+
parts.push(text.slice(start, i));
|
|
519
|
+
start = i + 1;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
parts.push(text.slice(start));
|
|
523
|
+
return parts;
|
|
524
|
+
}
|
|
437
525
|
function emitHeritageMarkers(container, kind, className, out) {
|
|
438
526
|
for (let i = 0; i < container.namedChildCount; i++) {
|
|
439
527
|
const c = container.namedChild(i);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rewrites Dart 3.3 `extension type Name(Type value)` headers into ordinary
|
|
3
|
+
* extension headers before tree-sitter sees the source. The vendored grammar
|
|
4
|
+
* currently recovers these declarations through an ERROR subtree, while the
|
|
5
|
+
* existing Dart ingestion path already handles `extension Name on Type`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function preprocessDartExtensionTypes(sourceText: string): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const DART_EXTENSION_TYPE_HEADER = /\b(extension)([ \t]+type[ \t]+(?:const[ \t]+)?)([A-Za-z_$][A-Za-z0-9_$]*)([ \t]*<[^()\r\n]*>)?([ \t]*)\(([^()\r\n]*)\)/g;
|
|
2
|
+
function representationType(representation) {
|
|
3
|
+
const trimmed = representation.trim();
|
|
4
|
+
const match = /^(.*\S)\s+[A-Za-z_$][A-Za-z0-9_$]*$/.exec(trimmed);
|
|
5
|
+
const typeName = match?.[1]?.trim();
|
|
6
|
+
return typeName && typeName.length > 0 ? typeName : null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Rewrites Dart 3.3 `extension type Name(Type value)` headers into ordinary
|
|
10
|
+
* extension headers before tree-sitter sees the source. The vendored grammar
|
|
11
|
+
* currently recovers these declarations through an ERROR subtree, while the
|
|
12
|
+
* existing Dart ingestion path already handles `extension Name on Type`.
|
|
13
|
+
*/
|
|
14
|
+
export function preprocessDartExtensionTypes(sourceText) {
|
|
15
|
+
return sourceText.replace(DART_EXTENSION_TYPE_HEADER, (match, extensionKeyword, extensionTypeGap, name, typeParameters, beforeRepresentation, representation) => {
|
|
16
|
+
const typeName = representationType(representation);
|
|
17
|
+
if (typeName === null)
|
|
18
|
+
return match;
|
|
19
|
+
const representationSpanLength = beforeRepresentation.length + representation.length + 2;
|
|
20
|
+
const rewrittenRepresentation = ` on ${typeName}`;
|
|
21
|
+
if (rewrittenRepresentation.length > representationSpanLength)
|
|
22
|
+
return match;
|
|
23
|
+
return (extensionKeyword +
|
|
24
|
+
' '.repeat(extensionTypeGap.length) +
|
|
25
|
+
name +
|
|
26
|
+
(typeParameters ?? '') +
|
|
27
|
+
rewrittenRepresentation +
|
|
28
|
+
' '.repeat(representationSpanLength - rewrittenRepresentation.length));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -29,6 +29,7 @@ import { createCallExtractor } from '../call-extractors/generic.js';
|
|
|
29
29
|
import { dartCallConfig } from '../call-extractors/configs/dart.js';
|
|
30
30
|
import { emitDartScopeCaptures, interpretDartImport, interpretDartTypeBinding, dartBindingScopeFor, dartImportOwningScope, dartReceiverBinding, dartMergeBindings, dartArityCompatibility, } from './dart/index.js';
|
|
31
31
|
import { DART_BUILT_INS } from './dart/built-ins.js';
|
|
32
|
+
import { preprocessDartExtensionTypes } from './dart/extension-type-preprocess.js';
|
|
32
33
|
/**
|
|
33
34
|
* Resolve the enclosing function from a `function_body` node by looking at its
|
|
34
35
|
* previous sibling. In Dart's tree-sitter grammar, function_signature and
|
|
@@ -100,6 +101,7 @@ export const dartProvider = defineLanguage({
|
|
|
100
101
|
},
|
|
101
102
|
],
|
|
102
103
|
treeSitterQueries: DART_QUERIES,
|
|
104
|
+
preprocessSource: preprocessDartExtensionTypes,
|
|
103
105
|
typeConfig: dartConfig,
|
|
104
106
|
exportChecker: dartExportChecker,
|
|
105
107
|
importResolver: createImportResolver(dartImportConfig),
|
|
@@ -7,6 +7,39 @@ import { synthesizeGoReceiverBinding } from './receiver-binding.js';
|
|
|
7
7
|
import { synthesizeGoTypeBindings, extractSimpleTypeNameText } from './type-binding.js';
|
|
8
8
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
9
9
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
10
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
11
|
+
const GO_CALLABLE_CAPTURE_OPTIONS = {
|
|
12
|
+
functionNodeTypes: new Set(['function_declaration', 'method_declaration', 'func_literal']),
|
|
13
|
+
callNodeTypes: new Set(['call_expression']),
|
|
14
|
+
parameterListNodeTypes: new Set(['parameter_list', 'argument_list']),
|
|
15
|
+
parameterNodeTypes: new Set(['parameter_declaration', 'variadic_parameter_declaration']),
|
|
16
|
+
bindingNodeTypes: new Set(['short_var_declaration', 'var_spec']),
|
|
17
|
+
assignmentNodeTypes: new Set(['assignment_statement']),
|
|
18
|
+
identifierNodeTypes: new Set(['identifier', 'field_identifier', 'package_identifier']),
|
|
19
|
+
// Multi-value forms (`a, b := f, g`) pair LHS/RHS expression_list entries
|
|
20
|
+
// positionally — the shared field fallback cross-wired first-LHS with
|
|
21
|
+
// last-RHS and synthesized a garbage comma-joined qualified name (#2522
|
|
22
|
+
// review). A length mismatch (multi-return call RHS) recognizes the node
|
|
23
|
+
// but emits nothing.
|
|
24
|
+
extractAssignment: (node) => {
|
|
25
|
+
if (node.type !== 'short_var_declaration' && node.type !== 'assignment_statement') {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const left = node.childForFieldName('left');
|
|
29
|
+
const right = node.childForFieldName('right');
|
|
30
|
+
if (left === null || right === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (left.type !== 'expression_list' || right.type !== 'expression_list')
|
|
33
|
+
return undefined;
|
|
34
|
+
const destinations = left.namedChildren.filter((child) => child !== null);
|
|
35
|
+
const sources = right.namedChildren.filter((child) => child !== null);
|
|
36
|
+
if (destinations.length <= 1 && sources.length <= 1)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (destinations.length !== sources.length)
|
|
39
|
+
return [];
|
|
40
|
+
return destinations.map((destination, index) => ({ destination, source: sources[index] }));
|
|
41
|
+
},
|
|
42
|
+
};
|
|
10
43
|
export function emitGoScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
11
44
|
let tree = cachedTree;
|
|
12
45
|
if (tree === undefined) {
|
|
@@ -136,6 +169,7 @@ export function emitGoScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
136
169
|
});
|
|
137
170
|
}
|
|
138
171
|
out.push(...synthesizeGoInheritanceReferences(tree.rootNode));
|
|
172
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, GO_CALLABLE_CAPTURE_OPTIONS));
|
|
139
173
|
return out;
|
|
140
174
|
}
|
|
141
175
|
/**
|
|
@@ -26,6 +26,7 @@ export declare const providers: {
|
|
|
26
26
|
dart: LanguageProvider;
|
|
27
27
|
vue: LanguageProvider;
|
|
28
28
|
cobol: LanguageProvider;
|
|
29
|
+
move: LanguageProvider;
|
|
29
30
|
};
|
|
30
31
|
/** Get provider by language enum (always succeeds for SupportedLanguages). */
|
|
31
32
|
export declare function getProvider(language: SupportedLanguages): LanguageProvider;
|
|
@@ -22,6 +22,7 @@ import { swiftProvider } from './swift.js';
|
|
|
22
22
|
import { dartProvider } from './dart.js';
|
|
23
23
|
import { vueProvider } from './vue.js';
|
|
24
24
|
import { cobolProvider } from './cobol.js';
|
|
25
|
+
import { moveProvider } from './move.js';
|
|
25
26
|
export const providers = {
|
|
26
27
|
[SupportedLanguages.JavaScript]: javascriptProvider,
|
|
27
28
|
[SupportedLanguages.TypeScript]: typescriptProvider,
|
|
@@ -39,6 +40,7 @@ export const providers = {
|
|
|
39
40
|
[SupportedLanguages.Dart]: dartProvider,
|
|
40
41
|
[SupportedLanguages.Vue]: vueProvider,
|
|
41
42
|
[SupportedLanguages.Cobol]: cobolProvider,
|
|
43
|
+
[SupportedLanguages.Move]: moveProvider,
|
|
42
44
|
};
|
|
43
45
|
/** Get provider by language enum (always succeeds for SupportedLanguages). */
|
|
44
46
|
export function getProvider(language) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function isSpringApplicationConfig(filePath) {
|
|
2
|
+
const base = filePath.replaceAll('\\', '/').split('/').pop() ?? '';
|
|
3
|
+
return /^application(?:-[^.]+)?\.(?:properties|ya?ml)$/i.test(base);
|
|
4
|
+
}
|
|
5
|
+
/** Durable completeness contract for Java Spring configuration bindings. */
|
|
6
|
+
export const SPRING_CONFIG_BINDINGS_FEATURE = {
|
|
7
|
+
id: 'spring.config-bindings',
|
|
8
|
+
version: 1,
|
|
9
|
+
// Java sources need consumer extraction even without config files (missing
|
|
10
|
+
// placeholders still get unresolved markers). Config-only repositories also
|
|
11
|
+
// need a one-time rebuild to backfill language-agnostic Property nodes.
|
|
12
|
+
appliesTo: (filePaths) => filePaths.some((filePath) => filePath.toLowerCase().endsWith('.java') || isSpringApplicationConfig(filePath)),
|
|
13
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ParsedFile } from '../../../../_shared/index.js';
|
|
2
|
+
import { type ClassAnnotationFact } from '../../frameworks/spring/bean-candidates.js';
|
|
3
|
+
import { type JvmPackageFact } from '../jvm/package-facts.js';
|
|
4
|
+
import type { JavaSpringConfigConsumerFact } from './spring-config-bindings.js';
|
|
5
|
+
export type JavaClassAnnotationFact = ClassAnnotationFact;
|
|
6
|
+
export interface JavaCaptureSideChannel {
|
|
7
|
+
readonly kind: 'java';
|
|
8
|
+
readonly packageFact: JvmPackageFact;
|
|
9
|
+
readonly classAnnotations: readonly JavaClassAnnotationFact[];
|
|
10
|
+
readonly springConfigConsumers?: readonly JavaSpringConfigConsumerFact[];
|
|
11
|
+
}
|
|
12
|
+
/** Clear facts retained by a prior workspace pass in a long-lived process. */
|
|
13
|
+
export declare function clearJavaClassAnnotationFacts(): void;
|
|
14
|
+
/** Store the annotation syntax collected by Java's existing scope-query traversal. */
|
|
15
|
+
export declare function setJavaClassAnnotationFacts(filePath: string, facts: readonly JavaClassAnnotationFact[]): void;
|
|
16
|
+
export declare function setJavaSpringConfigConsumerFacts(filePath: string, facts: readonly JavaSpringConfigConsumerFact[]): void;
|
|
17
|
+
export declare function getJavaSpringConfigConsumerFacts(filePath: string): readonly JavaSpringConfigConsumerFact[];
|
|
18
|
+
/** Snapshot worker-local Java annotation facts for ParsedFile serialization. */
|
|
19
|
+
export declare function collectJavaCaptureSideChannel(filePath: string): JavaCaptureSideChannel | undefined;
|
|
20
|
+
export declare function getJavaClassAnnotationFacts(filePath: string): readonly JavaClassAnnotationFact[];
|
|
21
|
+
/** Restore worker-collected facts before Java's post-resolution hook runs. */
|
|
22
|
+
export declare function applyJavaCaptureSideChannel(parsed: ParsedFile): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createClassAnnotationFactStore, } from '../../frameworks/spring/bean-candidates.js';
|
|
2
|
+
import { isJvmPackageFact, UNKNOWN_JVM_PACKAGE_FACT, } from '../jvm/package-facts.js';
|
|
3
|
+
import { getJavaPackageFact, setJavaPackageFact } from './package-facts.js';
|
|
4
|
+
const classAnnotations = createClassAnnotationFactStore();
|
|
5
|
+
const springConfigConsumers = new Map();
|
|
6
|
+
/** Clear facts retained by a prior workspace pass in a long-lived process. */
|
|
7
|
+
export function clearJavaClassAnnotationFacts() {
|
|
8
|
+
classAnnotations.clear();
|
|
9
|
+
springConfigConsumers.clear();
|
|
10
|
+
}
|
|
11
|
+
/** Store the annotation syntax collected by Java's existing scope-query traversal. */
|
|
12
|
+
export function setJavaClassAnnotationFacts(filePath, facts) {
|
|
13
|
+
classAnnotations.set(filePath, facts);
|
|
14
|
+
}
|
|
15
|
+
export function setJavaSpringConfigConsumerFacts(filePath, facts) {
|
|
16
|
+
if (facts.length === 0)
|
|
17
|
+
springConfigConsumers.delete(filePath);
|
|
18
|
+
else
|
|
19
|
+
springConfigConsumers.set(filePath, facts);
|
|
20
|
+
}
|
|
21
|
+
export function getJavaSpringConfigConsumerFacts(filePath) {
|
|
22
|
+
return springConfigConsumers.get(filePath) ?? [];
|
|
23
|
+
}
|
|
24
|
+
/** Snapshot worker-local Java annotation facts for ParsedFile serialization. */
|
|
25
|
+
export function collectJavaCaptureSideChannel(filePath) {
|
|
26
|
+
const facts = classAnnotations.get(filePath);
|
|
27
|
+
const configConsumers = springConfigConsumers.get(filePath) ?? [];
|
|
28
|
+
const packageFact = getJavaPackageFact(filePath);
|
|
29
|
+
if (facts.length === 0 && configConsumers.length === 0 && packageFact === undefined) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
kind: 'java',
|
|
34
|
+
packageFact: packageFact ?? UNKNOWN_JVM_PACKAGE_FACT,
|
|
35
|
+
classAnnotations: facts,
|
|
36
|
+
...(configConsumers.length > 0 ? { springConfigConsumers: configConsumers } : {}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function getJavaClassAnnotationFacts(filePath) {
|
|
40
|
+
return classAnnotations.get(filePath);
|
|
41
|
+
}
|
|
42
|
+
/** Restore worker-collected facts before Java's post-resolution hook runs. */
|
|
43
|
+
export function applyJavaCaptureSideChannel(parsed) {
|
|
44
|
+
const data = parsed.captureSideChannel;
|
|
45
|
+
if (data === undefined ||
|
|
46
|
+
data === null ||
|
|
47
|
+
typeof data !== 'object' ||
|
|
48
|
+
data.kind !== 'java' ||
|
|
49
|
+
!Array.isArray(data.classAnnotations)) {
|
|
50
|
+
setJavaClassAnnotationFacts(parsed.filePath, []);
|
|
51
|
+
setJavaSpringConfigConsumerFacts(parsed.filePath, []);
|
|
52
|
+
setJavaPackageFact(parsed.filePath, UNKNOWN_JVM_PACKAGE_FACT);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
setJavaClassAnnotationFacts(parsed.filePath, data.classAnnotations);
|
|
56
|
+
setJavaSpringConfigConsumerFacts(parsed.filePath, Array.isArray(data.springConfigConsumers) ? data.springConfigConsumers : []);
|
|
57
|
+
setJavaPackageFact(parsed.filePath, isJvmPackageFact(data.packageFact) ? data.packageFact : UNKNOWN_JVM_PACKAGE_FACT);
|
|
58
|
+
}
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* 3. **Arity metadata** on method/constructor declarations.
|
|
12
12
|
* 4. **Reference arity** on call sites.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* The returned captures are deterministic. Class-annotation facts are also
|
|
15
|
+
* recorded for the worker side-channel consumed after scope resolution.
|
|
15
16
|
*/
|
|
16
|
-
import type
|
|
17
|
-
export declare function emitJavaScopeCaptures(sourceText: string,
|
|
17
|
+
import { type CaptureMatch } from '../../../../_shared/index.js';
|
|
18
|
+
export declare function emitJavaScopeCaptures(sourceText: string, filePath: string, cachedTree?: unknown): readonly CaptureMatch[];
|
|
@@ -1,19 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Drives the Java scope query against tree-sitter-java and groups raw
|
|
5
|
-
* matches into `CaptureMatch[]` for the central extractor. Layers:
|
|
6
|
-
*
|
|
7
|
-
* 1. **Decomposed import declarations** — each `import_declaration`
|
|
8
|
-
* is re-emitted with `@import.kind/source/name` markers.
|
|
9
|
-
* 2. **Receiver binding synthesis** — `this`/`super` type-bindings
|
|
10
|
-
* on instance methods.
|
|
11
|
-
* 3. **Arity metadata** on method/constructor declarations.
|
|
12
|
-
* 4. **Reference arity** on call sites.
|
|
13
|
-
*
|
|
14
|
-
* Pure given the input source text. No I/O, no globals consulted.
|
|
15
|
-
*/
|
|
16
|
-
import { nodeIfType, nodeToCapture, syntheticCapture } from '../../utils/ast-helpers.js';
|
|
1
|
+
import { materializeClassAnnotationFacts, recordClassAnnotationCapture, } from '../../frameworks/spring/bean-candidates.js';
|
|
2
|
+
import { nodeIfType, nodeToCapture, synthesizeJavaAnonymousClassName, syntheticCapture, } from '../../utils/ast-helpers.js';
|
|
17
3
|
import { splitImportDeclaration } from './import-decomposer.js';
|
|
18
4
|
import { computeJavaArityMetadata } from './arity-metadata.js';
|
|
19
5
|
import { synthesizeJavaReceiverBinding } from './receiver-binding.js';
|
|
@@ -21,10 +7,32 @@ import { getJavaParser, getJavaScopeQuery } from './query.js';
|
|
|
21
7
|
import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
|
|
22
8
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
23
9
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
10
|
+
import { setJavaClassAnnotationFacts, setJavaSpringConfigConsumerFacts, } from './capture-side-channel.js';
|
|
11
|
+
import { captureJavaPackageFact } from './package-facts.js';
|
|
12
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
13
|
+
import { captureJavaSpringConfigConsumerFacts } from './spring-config-bindings.js';
|
|
24
14
|
/** Declaration anchors that carry function-like arity metadata. */
|
|
25
15
|
const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.constructor'];
|
|
26
16
|
/** tree-sitter-java node types that the method extractor accepts. */
|
|
27
17
|
const FUNCTION_NODE_TYPES = ['method_declaration', 'constructor_declaration'];
|
|
18
|
+
const JAVA_CALLABLE_CAPTURE_OPTIONS = {
|
|
19
|
+
functionNodeTypes: new Set([...FUNCTION_NODE_TYPES, 'lambda_expression']),
|
|
20
|
+
callNodeTypes: new Set(['method_invocation']),
|
|
21
|
+
parameterListNodeTypes: new Set(['formal_parameters', 'argument_list']),
|
|
22
|
+
parameterNodeTypes: new Set(['formal_parameter', 'spread_parameter', 'receiver_parameter']),
|
|
23
|
+
bindingNodeTypes: new Set(['variable_declarator']),
|
|
24
|
+
assignmentNodeTypes: new Set(['assignment_expression']),
|
|
25
|
+
identifierNodeTypes: new Set(['identifier', 'type_identifier']),
|
|
26
|
+
callableReferenceNodeTypes: new Set(['method_reference']),
|
|
27
|
+
// java.util.function SAM names, MINUS 'get' and 'test': those two collide
|
|
28
|
+
// with ubiquitous non-functional APIs (Map/List/Optional/Future.get,
|
|
29
|
+
// Predicate-unrelated test methods), emitting a spurious callable-object
|
|
30
|
+
// invoke fact for every container access (#2522 review). Supplier.get /
|
|
31
|
+
// Predicate.test dispatch is deliberately traded away until the check can
|
|
32
|
+
// gate on the receiver's declared type.
|
|
33
|
+
callableProtocolMethods: new Set(['run', 'apply', 'accept', 'call']),
|
|
34
|
+
normalizeQualifiedName: (raw) => raw.replaceAll('::', '.'),
|
|
35
|
+
};
|
|
28
36
|
/** Suppress read.member emissions when the field_access is already
|
|
29
37
|
* covered by a method_invocation (object of a call) or an
|
|
30
38
|
* assignment_expression (write target). */
|
|
@@ -39,7 +47,7 @@ function shouldEmitReadMember(memberNode) {
|
|
|
39
47
|
return true;
|
|
40
48
|
}
|
|
41
49
|
}
|
|
42
|
-
export function emitJavaScopeCaptures(sourceText,
|
|
50
|
+
export function emitJavaScopeCaptures(sourceText, filePath, cachedTree) {
|
|
43
51
|
let tree = cachedTree;
|
|
44
52
|
if (tree === undefined) {
|
|
45
53
|
tree = parseSourceSafe(getJavaParser(), sourceText, undefined, {
|
|
@@ -50,8 +58,10 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
50
58
|
else {
|
|
51
59
|
recordCacheHit();
|
|
52
60
|
}
|
|
61
|
+
captureJavaPackageFact(filePath, tree.rootNode);
|
|
53
62
|
const rawMatches = getJavaScopeQuery().matches(tree.rootNode);
|
|
54
63
|
const out = [];
|
|
64
|
+
const classAnnotations = new Map();
|
|
55
65
|
for (const m of rawMatches) {
|
|
56
66
|
const grouped = {};
|
|
57
67
|
// Parallel tag -> captured SyntaxNode map. The tree-sitter query already
|
|
@@ -70,6 +80,12 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
70
80
|
}
|
|
71
81
|
if (Object.keys(grouped).length === 0)
|
|
72
82
|
continue;
|
|
83
|
+
const annotatedClass = grouped['@class-annotation.class'];
|
|
84
|
+
const annotationName = grouped['@class-annotation.name'];
|
|
85
|
+
if (annotatedClass !== undefined && annotationName !== undefined) {
|
|
86
|
+
recordClassAnnotationCapture(classAnnotations, filePath, annotatedClass, annotationName.text);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
73
89
|
// Decompose each `import_declaration`. `@import.statement` is captured
|
|
74
90
|
// directly on the `import_declaration` node.
|
|
75
91
|
if (grouped['@import.statement'] !== undefined) {
|
|
@@ -95,6 +111,24 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
95
111
|
grouped['@reference.receiver'] !== undefined) {
|
|
96
112
|
continue;
|
|
97
113
|
}
|
|
114
|
+
// Normalize a `new`-expression receiver to its constructed type's simple
|
|
115
|
+
// name: `new Local().inner()` binds the WHOLE `object_creation_expression`
|
|
116
|
+
// as `@reference.receiver`, so its raw text is `"new Local()"` — a string
|
|
117
|
+
// that can never match a scope binding, so the compound-receiver resolver
|
|
118
|
+
// silently falls through to name-only fallback resolution and picks the
|
|
119
|
+
// wrong same-named method on a collision (#2564). Rewriting the text to
|
|
120
|
+
// just `Local` lets Case 2 (class-name / static receiver) in
|
|
121
|
+
// receiver-bound-calls.ts resolve it via its normal MRO walk. Mirrors the
|
|
122
|
+
// established `normalizePhpReceiver` precedent (php/captures.ts) — a
|
|
123
|
+
// language-local capture rewrite, no shared-pipeline change.
|
|
124
|
+
if (grouped['@reference.receiver'] !== undefined) {
|
|
125
|
+
const receiverNode = nodeIfType(nodeMap['@reference.receiver'], 'object_creation_expression');
|
|
126
|
+
const typeNode = receiverNode?.childForFieldName('type');
|
|
127
|
+
const simpleName = typeNode ? javaBaseSimpleNameOf(typeNode) : undefined;
|
|
128
|
+
if (simpleName !== undefined) {
|
|
129
|
+
grouped['@reference.receiver'] = syntheticCapture('@reference.receiver', receiverNode, simpleName);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
98
132
|
// Filter read.member when it's a child of method_invocation or assignment.
|
|
99
133
|
// `@reference.read.member` is captured directly on the `field_access` node.
|
|
100
134
|
if (grouped['@reference.read.member'] !== undefined) {
|
|
@@ -161,12 +195,147 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
161
195
|
}
|
|
162
196
|
out.push(grouped);
|
|
163
197
|
}
|
|
198
|
+
setJavaClassAnnotationFacts(filePath, materializeClassAnnotationFacts(classAnnotations));
|
|
199
|
+
setJavaSpringConfigConsumerFacts(filePath, captureJavaSpringConfigConsumerFacts(tree.rootNode, filePath));
|
|
164
200
|
return [
|
|
165
201
|
...resolveVarTypeBindings(out),
|
|
166
202
|
...synthesizeJavaInheritanceReferences(tree.rootNode),
|
|
167
203
|
...synthesizeJavaExplicitConstructorReferences(tree.rootNode),
|
|
204
|
+
...synthesizeJavaAnonymousClassDeclarations(tree.rootNode),
|
|
205
|
+
...synthesizeCallableFlowCaptures(tree.rootNode, JAVA_CALLABLE_CAPTURE_OPTIONS),
|
|
168
206
|
];
|
|
169
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Synthesize `@declaration.class` matches for anonymous class bodies
|
|
210
|
+
* (`new Runnable() { ... }`), named by the same javac-style authority
|
|
211
|
+
* (`synthesizeJavaAnonymousClassName` → `Worker$N`) the structure phase
|
|
212
|
+
* uses — the two layers agree by construction (#2550).
|
|
213
|
+
*
|
|
214
|
+
* The anchor is the `class_body` node: it shares its range with the
|
|
215
|
+
* `(object_creation_expression (class_body) @scope.class)` scope rule in
|
|
216
|
+
* query.ts, so the def is owned by that Class scope's `ownedDefs`
|
|
217
|
+
* (making `populateClassOwnedMembers` stamp `ownerId` on the anonymous
|
|
218
|
+
* class's methods) and the name auto-hoists to the enclosing scope —
|
|
219
|
+
* exactly the binding shape a named class declaration produces.
|
|
220
|
+
*/
|
|
221
|
+
function synthesizeJavaAnonymousClassDeclarations(rootNode) {
|
|
222
|
+
const out = [];
|
|
223
|
+
for (const oce of rootNode.descendantsOfType('object_creation_expression')) {
|
|
224
|
+
const name = synthesizeJavaAnonymousClassName(oce);
|
|
225
|
+
if (name === undefined)
|
|
226
|
+
continue;
|
|
227
|
+
const body = oce.namedChildren.find((c) => c.type === 'class_body');
|
|
228
|
+
if (body === undefined)
|
|
229
|
+
continue;
|
|
230
|
+
out.push({
|
|
231
|
+
'@declaration.class': nodeToCapture('@declaration.class', body),
|
|
232
|
+
'@declaration.name': syntheticCapture('@declaration.name', body, name),
|
|
233
|
+
});
|
|
234
|
+
// Inheritance: the anonymous class extends/implements its constructed
|
|
235
|
+
// type. Anchor the `@reference.inherits` on the `class_body` — its
|
|
236
|
+
// range equals the anonymous Class scope, so the reference site's
|
|
237
|
+
// enclosing class resolves to the SYNTHESIZED `Worker$N` def (anchoring
|
|
238
|
+
// on the constructed-type node would sit OUTSIDE the anonymous scope
|
|
239
|
+
// and mis-attribute the edge to the lexically enclosing class). The
|
|
240
|
+
// synthetic `@reference.name` carries the base's simple name; a JDK
|
|
241
|
+
// type with no repo def simply resolves to nothing (no edge). Without
|
|
242
|
+
// this edge `mroFor(Worker$N)` is empty and the #2550 instance-
|
|
243
|
+
// ownership gate suppressed TRUE bare calls to inherited methods
|
|
244
|
+
// inside the anonymous body (empirically caught in review).
|
|
245
|
+
const constructedType = oce.childForFieldName?.('type');
|
|
246
|
+
const baseSimpleName = constructedType !== null && constructedType !== undefined
|
|
247
|
+
? javaBaseSimpleNameOf(constructedType)
|
|
248
|
+
: undefined;
|
|
249
|
+
if (baseSimpleName !== undefined) {
|
|
250
|
+
out.push({
|
|
251
|
+
'@reference.inherits': nodeToCapture('@reference.inherits', body),
|
|
252
|
+
'@reference.name': syntheticCapture('@reference.name', body, baseSimpleName),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Receiver typeBinding: `Runnable handler = new Runnable() { ... }`
|
|
256
|
+
// binds `handler` to the ANONYMOUS class (`Worker$1`), not the declared
|
|
257
|
+
// interface — the instance is what `handler.run()` dispatches into, and
|
|
258
|
+
// the declared type is frequently a JDK interface with no repo def.
|
|
259
|
+
// Appended after the raw matches, so it overwrites the declared-type
|
|
260
|
+
// binding the `@type-binding.annotation` query rule produced for the
|
|
261
|
+
// same variable (pass-4 applies bindings in match order; last wins).
|
|
262
|
+
const declarator = oce.parent;
|
|
263
|
+
if (declarator !== null && declarator.type === 'variable_declarator') {
|
|
264
|
+
const varName = declarator.childForFieldName?.('name');
|
|
265
|
+
const declNode = declarator.parent ?? declarator;
|
|
266
|
+
if (varName !== null && varName !== undefined) {
|
|
267
|
+
out.push({
|
|
268
|
+
'@type-binding.annotation': nodeToCapture('@type-binding.annotation', declNode),
|
|
269
|
+
'@type-binding.name': nodeToCapture('@type-binding.name', varName),
|
|
270
|
+
'@type-binding.type': syntheticCapture('@type-binding.type', oce, name),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Enum constant bodies (`enum E { A { ... } }`) — javac's other
|
|
276
|
+
// anonymous shape (#2555). Same synthesis, same body anchor; the
|
|
277
|
+
// constant's class extends its HOST ENUM (javac semantics), so the
|
|
278
|
+
// inherits reference names the enum — giving `mroFor(E$N) ∋ E` and
|
|
279
|
+
// keeping bare calls from the body to the enum's own helpers alive
|
|
280
|
+
// through the ownership gate's MRO arm.
|
|
281
|
+
for (const constant of rootNode.descendantsOfType('enum_constant')) {
|
|
282
|
+
const hostEnum = javaEnclosingEnumNameOf(constant);
|
|
283
|
+
const bodyNode = constant.childForFieldName?.('body');
|
|
284
|
+
const isBodied = bodyNode !== null && bodyNode !== undefined && bodyNode.type === 'class_body';
|
|
285
|
+
const bodiedName = synthesizeJavaAnonymousClassName(constant);
|
|
286
|
+
if (bodiedName !== undefined && isBodied) {
|
|
287
|
+
out.push({
|
|
288
|
+
'@declaration.class': nodeToCapture('@declaration.class', bodyNode),
|
|
289
|
+
'@declaration.name': syntheticCapture('@declaration.name', bodyNode, bodiedName),
|
|
290
|
+
});
|
|
291
|
+
if (hostEnum !== undefined) {
|
|
292
|
+
out.push({
|
|
293
|
+
'@reference.inherits': nodeToCapture('@reference.inherits', bodyNode),
|
|
294
|
+
'@reference.name': syntheticCapture('@reference.name', bodyNode, hostEnum),
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Receiver dispatch (#2561): `E.CONST.method()` resolves through the
|
|
299
|
+
// generic compound-receiver chain walk, which looks up each dotted
|
|
300
|
+
// segment via the owning class scope's `typeBindings` map — the same
|
|
301
|
+
// mechanism a field declaration uses (`private User user;` binds
|
|
302
|
+
// `user` on the class scope). Binding the constant's own simple name
|
|
303
|
+
// there — to its synthesized `E$N` class when bodied (MRO includes E,
|
|
304
|
+
// so members inherited from the enum still resolve), or to the host
|
|
305
|
+
// enum itself when body-less — makes `E.CONST.method()` resolve with
|
|
306
|
+
// no changes to the shared receiver-binding machinery.
|
|
307
|
+
//
|
|
308
|
+
// A bodied constant binds ONLY to its `E$N` class, never the host enum:
|
|
309
|
+
// if name synthesis fails on a malformed/error-recovery tree (`bodiedName`
|
|
310
|
+
// undefined despite a real body), emit nothing rather than silently
|
|
311
|
+
// misattributing an OVERRIDING constant's receiver to the enum's own
|
|
312
|
+
// (non-overridden) method — a wrong edge is worse than no edge. Mirrors
|
|
313
|
+
// the `object_creation_expression` branch, which skips on synthesis
|
|
314
|
+
// failure. `hostEnum` is used only for genuinely body-less constants.
|
|
315
|
+
const constantNameNode = constant.childForFieldName?.('name');
|
|
316
|
+
const constantType = isBodied ? bodiedName : hostEnum;
|
|
317
|
+
if (constantNameNode !== null && constantNameNode !== undefined && constantType !== undefined) {
|
|
318
|
+
out.push({
|
|
319
|
+
'@type-binding.annotation': nodeToCapture('@type-binding.annotation', constant),
|
|
320
|
+
'@type-binding.name': nodeToCapture('@type-binding.name', constantNameNode),
|
|
321
|
+
'@type-binding.type': syntheticCapture('@type-binding.type', constant, constantType),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return out;
|
|
326
|
+
}
|
|
327
|
+
/** Simple name of the enum_declaration enclosing an enum_constant, or
|
|
328
|
+
* undefined (grammar guarantees one exists in well-formed source). */
|
|
329
|
+
function javaEnclosingEnumNameOf(constant) {
|
|
330
|
+
let cursor = constant.parent;
|
|
331
|
+
while (cursor !== null) {
|
|
332
|
+
if (cursor.type === 'enum_declaration') {
|
|
333
|
+
return cursor.childForFieldName?.('name')?.text ?? undefined;
|
|
334
|
+
}
|
|
335
|
+
cursor = cursor.parent;
|
|
336
|
+
}
|
|
337
|
+
return undefined;
|
|
338
|
+
}
|
|
170
339
|
/**
|
|
171
340
|
* Synthesize `@reference.call.constructor` captures for explicit constructor
|
|
172
341
|
* invocations — `super(...)` and `this(...)` (F38 #1928). tree-sitter-java
|
|
@@ -357,6 +526,13 @@ function emitJavaInheritanceBase(out, base) {
|
|
|
357
526
|
});
|
|
358
527
|
}
|
|
359
528
|
/** Resolve a Java base-type node to its bare simple-name identifier node. */
|
|
529
|
+
/** Simple name of a constructed/base type node, reusing the same node
|
|
530
|
+
* shapes `javaBaseLookupNameNode` handles (`Runnable`, `a.b.Base`,
|
|
531
|
+
* `Box<T>`). Returns undefined when the node is none of those. */
|
|
532
|
+
function javaBaseSimpleNameOf(typeNode) {
|
|
533
|
+
const nameNode = javaBaseLookupNameNode(typeNode);
|
|
534
|
+
return nameNode === null ? undefined : nameNode.text;
|
|
535
|
+
}
|
|
360
536
|
function javaBaseLookupNameNode(node) {
|
|
361
537
|
switch (node.type) {
|
|
362
538
|
case 'type_identifier':
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type JvmPackageFact, type JvmPackageSyntaxNode } from '../jvm/package-facts.js';
|
|
2
|
+
export declare const clearJavaPackageFacts: () => void;
|
|
3
|
+
export declare const captureJavaPackageFact: (filePath: string, root: JvmPackageSyntaxNode) => void;
|
|
4
|
+
export declare const setJavaPackageFact: (filePath: string, fact: JvmPackageFact) => void;
|
|
5
|
+
export declare const getJavaPackageFact: (filePath: string) => JvmPackageFact | undefined;
|