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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createJvmPackageFactStore, } from '../jvm/package-facts.js';
|
|
2
|
+
const javaPackageFacts = createJvmPackageFactStore({
|
|
3
|
+
packageNodeType: 'package_declaration',
|
|
4
|
+
packageNameNodeTypes: ['scoped_identifier', 'identifier'],
|
|
5
|
+
});
|
|
6
|
+
export const clearJavaPackageFacts = () => javaPackageFacts.clear();
|
|
7
|
+
export const captureJavaPackageFact = (filePath, root) => javaPackageFacts.capture(filePath, root);
|
|
8
|
+
export const setJavaPackageFact = (filePath, fact) => javaPackageFacts.set(filePath, fact);
|
|
9
|
+
export const getJavaPackageFact = (filePath) => javaPackageFacts.get(filePath);
|
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Java package-scope implicit visibility.
|
|
3
|
-
*
|
|
4
|
-
* Classes in the same Java package see each other without explicit
|
|
5
|
-
* `import` statements. This hook groups files by `package` declaration,
|
|
6
|
-
* then injects cross-file class defs into each file's module-scope
|
|
7
|
-
* `bindingAugmentations` and mirrors type-bindings across same-package
|
|
8
|
-
* files — the Java equivalent of C#'s `populateNamespaceSiblings`.
|
|
9
|
-
*/
|
|
10
|
-
import type { ParsedFile } from '../../../../_shared/index.js';
|
|
11
|
-
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
12
|
-
export declare function populateJavaPackageSiblings(parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, ctx: {
|
|
1
|
+
export declare const populateJavaPackageSiblings: (parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes, ctx: {
|
|
13
2
|
readonly fileContents: ReadonlyMap<string, string>;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
};
|
|
17
|
-
}): void;
|
|
3
|
+
}) => void;
|
|
4
|
+
export declare const isJavaPackageSiblingVisibilityIncomplete: (filePath: string) => boolean;
|
|
@@ -1,147 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
import { isClassLike } from '../../scope-resolution/scope/walkers.js';
|
|
11
|
-
import { getJavaParser } from './query.js';
|
|
12
|
-
import { parseSourceSafe, ParseTimeoutError } from '../../../tree-sitter/safe-parse.js';
|
|
13
|
-
import { logger } from '../../../logger.js';
|
|
14
|
-
function extractPackageName(content, filePath, cachedTree) {
|
|
15
|
-
let tree = cachedTree;
|
|
16
|
-
if (tree === undefined) {
|
|
17
|
-
try {
|
|
18
|
-
tree = parseSourceSafe(getJavaParser(), content);
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
if (err instanceof ParseTimeoutError) {
|
|
22
|
-
// Degrade to "no package" so a single pathological file doesn't abort
|
|
23
|
-
// same-package sibling injection for the whole run.
|
|
24
|
-
logger.warn({ file: filePath }, 'java package-siblings: parse timed out, treating as no package');
|
|
25
|
-
return '';
|
|
26
|
-
}
|
|
27
|
-
throw err;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
for (const child of tree.rootNode.namedChildren) {
|
|
31
|
-
if (child.type === 'package_declaration') {
|
|
32
|
-
const scoped = child.namedChildren.find((c) => c.type === 'scoped_identifier' || c.type === 'identifier');
|
|
33
|
-
return scoped?.text ?? '';
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return '';
|
|
37
|
-
}
|
|
38
|
-
export function populateJavaPackageSiblings(parsedFiles, indexes, ctx) {
|
|
39
|
-
const buckets = new Map();
|
|
40
|
-
for (const parsed of parsedFiles) {
|
|
41
|
-
const content = ctx.fileContents.get(parsed.filePath);
|
|
42
|
-
if (content === undefined)
|
|
43
|
-
continue;
|
|
44
|
-
const pkg = extractPackageName(content, parsed.filePath, ctx.treeCache?.get(parsed.filePath));
|
|
45
|
-
let bucket = buckets.get(pkg);
|
|
46
|
-
if (bucket === undefined) {
|
|
47
|
-
bucket = { parsed: [], moduleScopes: [] };
|
|
48
|
-
buckets.set(pkg, bucket);
|
|
49
|
-
}
|
|
50
|
-
bucket.parsed.push(parsed);
|
|
51
|
-
const ms = parsed.scopes.find((s) => s.kind === 'Module');
|
|
52
|
-
if (ms !== undefined) {
|
|
53
|
-
bucket.moduleScopes.push({ filePath: parsed.filePath, scope: ms });
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const augmentations = indexes.bindingAugmentations;
|
|
57
|
-
const MAX_PACKAGE_FILES = 500;
|
|
58
|
-
for (const bucket of buckets.values()) {
|
|
59
|
-
if (bucket.moduleScopes.length < 2)
|
|
60
|
-
continue;
|
|
61
|
-
if (bucket.moduleScopes.length > MAX_PACKAGE_FILES) {
|
|
62
|
-
logger.warn(`[java-package-siblings] skipping package with ${bucket.moduleScopes.length} files (cap=${MAX_PACKAGE_FILES}); same-package implicit visibility disabled for this package`);
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
const classDefs = [];
|
|
66
|
-
for (const parsed of bucket.parsed) {
|
|
67
|
-
const moduleScope = parsed.scopes.find((s) => s.kind === 'Module');
|
|
68
|
-
const moduleScopeId = moduleScope?.id;
|
|
69
|
-
for (const scope of parsed.scopes) {
|
|
70
|
-
if (scope.kind !== 'Class')
|
|
71
|
-
continue;
|
|
72
|
-
if (scope.parent !== moduleScopeId)
|
|
73
|
-
continue;
|
|
74
|
-
for (const def of scope.ownedDefs) {
|
|
75
|
-
if (isClassLike(def.type)) {
|
|
76
|
-
classDefs.push({ def, filePath: parsed.filePath });
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
for (const { filePath, scope } of bucket.moduleScopes) {
|
|
83
|
-
let scopeAug = augmentations.get(scope.id);
|
|
84
|
-
if (scopeAug === undefined) {
|
|
85
|
-
scopeAug = new Map();
|
|
86
|
-
augmentations.set(scope.id, scopeAug);
|
|
87
|
-
}
|
|
88
|
-
const candidates = classDefs.filter((d) => d.filePath !== filePath);
|
|
89
|
-
const proximityCache = new Map();
|
|
90
|
-
for (const c of candidates) {
|
|
91
|
-
if (!proximityCache.has(c.filePath)) {
|
|
92
|
-
proximityCache.set(c.filePath, sharedSegmentCount(c.filePath, filePath));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const sorted = candidates.sort((a, b) => (proximityCache.get(b.filePath) ?? 0) - (proximityCache.get(a.filePath) ?? 0));
|
|
96
|
-
const injectedIds = new Set();
|
|
97
|
-
for (const { def } of sorted) {
|
|
98
|
-
if (injectedIds.has(def.nodeId))
|
|
99
|
-
continue;
|
|
100
|
-
const qn = def.qualifiedName;
|
|
101
|
-
if (qn === undefined)
|
|
102
|
-
continue;
|
|
103
|
-
injectedIds.add(def.nodeId);
|
|
104
|
-
const simpleName = qn.includes('.') ? qn.slice(qn.lastIndexOf('.') + 1) : qn;
|
|
105
|
-
let list = scopeAug.get(simpleName);
|
|
106
|
-
if (list === undefined) {
|
|
107
|
-
list = [];
|
|
108
|
-
scopeAug.set(simpleName, list);
|
|
109
|
-
}
|
|
110
|
-
list.push({ def, origin: 'namespace' });
|
|
111
|
-
}
|
|
112
|
-
const tb = scope.typeBindings;
|
|
113
|
-
for (const sibling of bucket.moduleScopes) {
|
|
114
|
-
if (sibling.filePath === filePath)
|
|
115
|
-
continue;
|
|
116
|
-
for (const [name, ref] of sibling.scope.typeBindings) {
|
|
117
|
-
if (tb.has(name))
|
|
118
|
-
continue;
|
|
119
|
-
tb.set(name, ref);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
for (const sibParsed of bucket.parsed) {
|
|
123
|
-
if (sibParsed.filePath === filePath)
|
|
124
|
-
continue;
|
|
125
|
-
for (const sibScope of sibParsed.scopes) {
|
|
126
|
-
if (sibScope.kind !== 'Class')
|
|
127
|
-
continue;
|
|
128
|
-
for (const [name, ref] of sibScope.typeBindings) {
|
|
129
|
-
if (ref.source === 'self')
|
|
130
|
-
continue;
|
|
131
|
-
if (tb.has(name))
|
|
132
|
-
continue;
|
|
133
|
-
tb.set(name, ref);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function sharedSegmentCount(a, b) {
|
|
141
|
-
const sa = a.replace(/\\/g, '/').split('/');
|
|
142
|
-
const sb = b.replace(/\\/g, '/').split('/');
|
|
143
|
-
let i = 0;
|
|
144
|
-
while (i < sa.length && i < sb.length && sa[i] === sb[i])
|
|
145
|
-
i++;
|
|
146
|
-
return i;
|
|
147
|
-
}
|
|
1
|
+
import { createJvmPackageSiblingVisibility } from '../jvm/package-siblings.js';
|
|
2
|
+
import { getJavaPackageFact } from './package-facts.js';
|
|
3
|
+
const javaPackageSiblingVisibility = createJvmPackageSiblingVisibility({
|
|
4
|
+
languageLabel: 'java',
|
|
5
|
+
getPackageFact: getJavaPackageFact,
|
|
6
|
+
});
|
|
7
|
+
export const populateJavaPackageSiblings = javaPackageSiblingVisibility.populateNamespaceSiblings;
|
|
8
|
+
export const isJavaPackageSiblingVisibilityIncomplete = javaPackageSiblingVisibility.isVisibilityIncomplete;
|
|
@@ -37,6 +37,20 @@ const JAVA_SCOPE_QUERY = `
|
|
|
37
37
|
(record_declaration) @scope.class
|
|
38
38
|
(annotation_type_declaration) @scope.class
|
|
39
39
|
|
|
40
|
+
;; Anonymous class body: \`new Runnable() { public void run() {} }\`.
|
|
41
|
+
;; Without its own scope, a method's auto-hoist (scope-extractor.ts) has
|
|
42
|
+
;; nowhere to stop and leaks the name past the anonymous class into the
|
|
43
|
+
;; enclosing scope -- the same failure mode fixed for TS/JS object
|
|
44
|
+
;; literals (#2545).
|
|
45
|
+
(object_creation_expression
|
|
46
|
+
(class_body) @scope.class)
|
|
47
|
+
|
|
48
|
+
;; Enum constant body: \`enum E { A { public void hook() {} } }\` --
|
|
49
|
+
;; javac's other anonymous-class shape (E$N), same scope-boundary need
|
|
50
|
+
;; and same class_body anchor (#2555).
|
|
51
|
+
(enum_constant
|
|
52
|
+
body: (class_body) @scope.class)
|
|
53
|
+
|
|
40
54
|
(method_declaration) @scope.function
|
|
41
55
|
(constructor_declaration) @scope.function
|
|
42
56
|
|
|
@@ -56,6 +70,15 @@ const JAVA_SCOPE_QUERY = `
|
|
|
56
70
|
(annotation_type_declaration
|
|
57
71
|
name: (identifier) @declaration.name) @declaration.class
|
|
58
72
|
|
|
73
|
+
;; Class annotation syntax is carried to post-resolution enrichment. Keeping
|
|
74
|
+
;; this in the existing scope query avoids a second AST build/traversal.
|
|
75
|
+
(class_declaration
|
|
76
|
+
(modifiers
|
|
77
|
+
[
|
|
78
|
+
(marker_annotation name: (_) @class-annotation.name)
|
|
79
|
+
(annotation name: (_) @class-annotation.name)
|
|
80
|
+
])) @class-annotation.class
|
|
81
|
+
|
|
59
82
|
;; Declarations — methods / constructors
|
|
60
83
|
(method_declaration
|
|
61
84
|
name: (identifier) @declaration.name) @declaration.method
|
|
@@ -13,10 +13,22 @@ import { followChainPostFinalize } from '../../scope-resolution/passes/imported-
|
|
|
13
13
|
import { javaProvider } from '../java.js';
|
|
14
14
|
import { javaArityCompatibility, javaMergeBindings, resolveJavaImportTarget, } from './index.js';
|
|
15
15
|
import { populateJavaPackageSiblings } from './package-siblings.js';
|
|
16
|
+
import { attachSpringBeanCandidateMetadata } from './spring-bean-metadata.js';
|
|
17
|
+
import { attachJavaSpringConfigBindings } from './spring-config-bindings.js';
|
|
18
|
+
import { applyJavaCaptureSideChannel, clearJavaClassAnnotationFacts, } from './capture-side-channel.js';
|
|
19
|
+
import { clearJavaPackageFacts } from './package-facts.js';
|
|
16
20
|
const javaScopeResolver = {
|
|
17
21
|
language: SupportedLanguages.Java,
|
|
18
22
|
languageProvider: javaProvider,
|
|
19
23
|
importEdgeReason: 'java-scope: import',
|
|
24
|
+
loadResolutionConfig: () => {
|
|
25
|
+
// Worker capture facts are process-local and outlive a single analysis in
|
|
26
|
+
// server mode. This hook runs once before each Java workspace pass, before
|
|
27
|
+
// ParsedFile side channels are restored for the current files.
|
|
28
|
+
clearJavaClassAnnotationFacts();
|
|
29
|
+
clearJavaPackageFacts();
|
|
30
|
+
return undefined;
|
|
31
|
+
},
|
|
20
32
|
resolveImportTarget: (targetRaw, fromFile, allFilePaths) => {
|
|
21
33
|
const ws = { fromFile, allFilePaths };
|
|
22
34
|
return resolveJavaImportTarget({ kind: 'named', localName: '_', importedName: '_', targetRaw }, ws);
|
|
@@ -25,14 +37,25 @@ const javaScopeResolver = {
|
|
|
25
37
|
arityCompatibility: (callsite, def) => javaArityCompatibility(def, callsite),
|
|
26
38
|
buildMro: buildJavaMro,
|
|
27
39
|
populateOwners: (parsed) => populateClassOwnedMembers(parsed),
|
|
40
|
+
applyCaptureSideChannel: applyJavaCaptureSideChannel,
|
|
28
41
|
isSuperReceiver: (text) => text.trim() === 'super',
|
|
29
42
|
fieldFallbackOnMethodLookup: false,
|
|
30
43
|
propagatesReturnTypesAcrossImports: true,
|
|
31
44
|
collapseMemberCallsByCallerTarget: true,
|
|
32
45
|
hoistTypeBindingsToModule: true,
|
|
33
46
|
stripReceiverCastExpressions: true,
|
|
47
|
+
// #2550: every Java method belongs to a class instance — a free call may
|
|
48
|
+
// resolve to a Method only when the caller's enclosing class chain
|
|
49
|
+
// (self + MRO) contains the method's owner. Closes the finalize-bucket
|
|
50
|
+
// leak (unqualified `run()` matching an unrelated same-file anonymous
|
|
51
|
+
// class's method). C# is the intended next adopter.
|
|
52
|
+
freeCallsRequireInstanceOwnership: true,
|
|
34
53
|
populateNamespaceSiblings: populateJavaPackageSiblings,
|
|
35
54
|
populateRangeBindings: populateJavaCrossFileReturnTypes,
|
|
55
|
+
emitPostResolutionEdges: (graph, parsedFiles, nodeLookup, indexes, ctx) => {
|
|
56
|
+
attachSpringBeanCandidateMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
57
|
+
attachJavaSpringConfigBindings(graph, parsedFiles, nodeLookup, indexes, ctx);
|
|
58
|
+
},
|
|
36
59
|
};
|
|
37
60
|
export { javaScopeResolver };
|
|
38
61
|
function populateJavaCrossFileReturnTypes(parsedFiles, indexes) {
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/** Java wiring for the language-neutral Spring candidate engine. */
|
|
2
|
+
export declare const attachSpringBeanCandidateMetadata: (graph: import("../../../graph/types.js").KnowledgeGraph, parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], nodeLookup: import("../../scope-resolution/graph-bridge/node-lookup.js").GraphNodeLookup, indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes) => void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createSpringBeanCandidateAttacher } from '../../frameworks/spring/bean-candidates.js';
|
|
2
|
+
import { getJavaClassAnnotationFacts } from './capture-side-channel.js';
|
|
3
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
4
|
+
/** Java wiring for the language-neutral Spring candidate engine. */
|
|
5
|
+
export const attachSpringBeanCandidateMetadata = createSpringBeanCandidateAttacher({
|
|
6
|
+
getClassAnnotationFacts: getJavaClassAnnotationFacts,
|
|
7
|
+
isPackageVisibilityIncomplete: isJavaPackageSiblingVisibilityIncomplete,
|
|
8
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
2
|
+
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
3
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
4
|
+
import { type ParsedFile, type ScopeId } from '../../../../_shared/index.js';
|
|
5
|
+
import { type SpringConfigConsumer } from '../../frameworks/spring/config-bindings.js';
|
|
6
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
7
|
+
export interface JavaSpringConfigConsumerFact {
|
|
8
|
+
readonly consumer: SpringConfigConsumer;
|
|
9
|
+
readonly annotationName: string;
|
|
10
|
+
readonly classScopeId: ScopeId;
|
|
11
|
+
}
|
|
12
|
+
/** Extract statically readable Spring placeholder keys from a Java annotation. */
|
|
13
|
+
export declare function parseValuePlaceholderKeys(annotation: SyntaxNode): string[];
|
|
14
|
+
/** Extract `prefix`/`value` (or the positional value) from the annotation. */
|
|
15
|
+
export declare function parseConfigurationPropertiesPrefix(annotation: SyntaxNode): string | null;
|
|
16
|
+
/** Collect config facts from the Java parser's existing AST (no reparse). */
|
|
17
|
+
export declare function captureJavaSpringConfigConsumerFacts(root: SyntaxNode, filePath: string): JavaSpringConfigConsumerFact[];
|
|
18
|
+
/** Parse Java consumers for focused unit tests; production reuses the worker AST. */
|
|
19
|
+
export declare function extractJavaSpringConfigConsumers(source: string): SpringConfigConsumer[];
|
|
20
|
+
/** Java ScopeResolver post-resolution hook for Spring configuration consumers. */
|
|
21
|
+
export declare function attachJavaSpringConfigBindings(graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], _nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes, _ctx: {
|
|
22
|
+
readonly fileContents: ReadonlyMap<string, string>;
|
|
23
|
+
}): void;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import { bindSpringConfigConsumers, } from '../../frameworks/spring/config-bindings.js';
|
|
3
|
+
import { createSpringAnnotationNameResolver } from '../../frameworks/spring/bean-candidates.js';
|
|
4
|
+
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
5
|
+
import { nodeToCapture } from '../../utils/ast-helpers.js';
|
|
6
|
+
import { getJavaParser } from './query.js';
|
|
7
|
+
import { getJavaSpringConfigConsumerFacts } from './capture-side-channel.js';
|
|
8
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
9
|
+
const VALUE_ANNOTATION = 'org.springframework.beans.factory.annotation.Value';
|
|
10
|
+
const CONFIGURATION_PROPERTIES_ANNOTATION = 'org.springframework.boot.context.properties.ConfigurationProperties';
|
|
11
|
+
function collectJavaImports(root) {
|
|
12
|
+
const exact = new Set();
|
|
13
|
+
const wildcard = new Set();
|
|
14
|
+
const localTypes = new Set();
|
|
15
|
+
for (const node of root.descendantsOfType('import_declaration')) {
|
|
16
|
+
const imported = node.text
|
|
17
|
+
.replace(/^\s*import\s+(?:static\s+)?/, '')
|
|
18
|
+
.replace(/;\s*$/, '')
|
|
19
|
+
.trim();
|
|
20
|
+
if (imported.endsWith('.*'))
|
|
21
|
+
wildcard.add(imported.slice(0, -2));
|
|
22
|
+
else
|
|
23
|
+
exact.add(imported);
|
|
24
|
+
}
|
|
25
|
+
for (const type of [
|
|
26
|
+
'class_declaration',
|
|
27
|
+
'interface_declaration',
|
|
28
|
+
'enum_declaration',
|
|
29
|
+
'record_declaration',
|
|
30
|
+
'annotation_type_declaration',
|
|
31
|
+
]) {
|
|
32
|
+
for (const node of root.descendantsOfType(type)) {
|
|
33
|
+
const name = node.childForFieldName('name')?.text;
|
|
34
|
+
if (name)
|
|
35
|
+
localTypes.add(name);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { exact, wildcard, localTypes };
|
|
39
|
+
}
|
|
40
|
+
function annotationsOn(node) {
|
|
41
|
+
const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
|
|
42
|
+
if (modifiers === undefined)
|
|
43
|
+
return [];
|
|
44
|
+
const annotations = [];
|
|
45
|
+
for (const child of modifiers.namedChildren) {
|
|
46
|
+
if (child.type !== 'annotation' && child.type !== 'marker_annotation')
|
|
47
|
+
continue;
|
|
48
|
+
const name = child.childForFieldName('name')?.text ?? child.firstNamedChild?.text;
|
|
49
|
+
if (name)
|
|
50
|
+
annotations.push({ name, node: child });
|
|
51
|
+
}
|
|
52
|
+
return annotations;
|
|
53
|
+
}
|
|
54
|
+
function resolvesToAnnotation(rawName, canonicalName, imports) {
|
|
55
|
+
if (rawName.includes('.'))
|
|
56
|
+
return rawName === canonicalName;
|
|
57
|
+
if (imports.localTypes.has(rawName))
|
|
58
|
+
return false;
|
|
59
|
+
if (imports.exact.has(canonicalName))
|
|
60
|
+
return true;
|
|
61
|
+
const packageName = canonicalName.slice(0, canonicalName.lastIndexOf('.'));
|
|
62
|
+
return imports.wildcard.has(packageName);
|
|
63
|
+
}
|
|
64
|
+
function decodeJavaStringLiteral(literal) {
|
|
65
|
+
const delimiterLength = literal.startsWith('"""') && literal.endsWith('"""') ? 3 : 1;
|
|
66
|
+
return literal
|
|
67
|
+
.slice(delimiterLength, -delimiterLength)
|
|
68
|
+
.replace(/\\u([0-9a-fA-F]{4})/g, (_match, hex) => String.fromCharCode(Number.parseInt(hex, 16)))
|
|
69
|
+
.replace(/\\(["'\\btnfr])/g, (_match, escaped) => {
|
|
70
|
+
const controls = {
|
|
71
|
+
b: '\b',
|
|
72
|
+
t: '\t',
|
|
73
|
+
n: '\n',
|
|
74
|
+
f: '\f',
|
|
75
|
+
r: '\r',
|
|
76
|
+
};
|
|
77
|
+
return controls[escaped] ?? escaped;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function javaStringLiterals(annotation) {
|
|
81
|
+
return annotation
|
|
82
|
+
.descendantsOfType('string_literal')
|
|
83
|
+
.map((literal) => decodeJavaStringLiteral(literal.text));
|
|
84
|
+
}
|
|
85
|
+
/** Extract statically readable Spring placeholder keys from a Java annotation. */
|
|
86
|
+
export function parseValuePlaceholderKeys(annotation) {
|
|
87
|
+
const keys = new Set();
|
|
88
|
+
for (const literal of javaStringLiterals(annotation)) {
|
|
89
|
+
for (const match of literal.matchAll(/\$\{([^{}]+)\}/g)) {
|
|
90
|
+
const key = match[1].split(':', 1)[0].trim();
|
|
91
|
+
if (/^[A-Za-z0-9_.-]+$/.test(key))
|
|
92
|
+
keys.add(key);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return [...keys];
|
|
96
|
+
}
|
|
97
|
+
/** Extract `prefix`/`value` (or the positional value) from the annotation. */
|
|
98
|
+
export function parseConfigurationPropertiesPrefix(annotation) {
|
|
99
|
+
const named = annotation.descendantsOfType('element_value_pair').find((pair) => {
|
|
100
|
+
const key = pair.childForFieldName('key')?.text;
|
|
101
|
+
return key === 'prefix' || key === 'value';
|
|
102
|
+
});
|
|
103
|
+
const namedValue = named?.childForFieldName('value');
|
|
104
|
+
const argumentsNode = annotation.childForFieldName('arguments');
|
|
105
|
+
const literalNode = (namedValue?.type === 'string_literal'
|
|
106
|
+
? namedValue
|
|
107
|
+
: namedValue?.descendantsOfType('string_literal')[0]) ??
|
|
108
|
+
(named === undefined
|
|
109
|
+
? argumentsNode?.namedChildren.find((child) => child.type === 'string_literal')
|
|
110
|
+
: undefined);
|
|
111
|
+
if (literalNode === undefined)
|
|
112
|
+
return null;
|
|
113
|
+
const prefix = decodeJavaStringLiteral(literalNode.text)
|
|
114
|
+
.trim()
|
|
115
|
+
.replace(/^\.+|\.+$/g, '');
|
|
116
|
+
return /^[A-Za-z0-9_.-]+$/.test(prefix) ? prefix : null;
|
|
117
|
+
}
|
|
118
|
+
function classScopeId(filePath, declaration) {
|
|
119
|
+
return makeScopeId({
|
|
120
|
+
filePath,
|
|
121
|
+
range: nodeToCapture('@scope.class', declaration).range,
|
|
122
|
+
kind: 'Class',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function enclosingClass(node) {
|
|
126
|
+
let current = node.parent;
|
|
127
|
+
while (current !== null) {
|
|
128
|
+
if (current.type === 'class_declaration' || current.type === 'record_declaration') {
|
|
129
|
+
return current;
|
|
130
|
+
}
|
|
131
|
+
current = current.parent;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
/** Collect config facts from the Java parser's existing AST (no reparse). */
|
|
136
|
+
export function captureJavaSpringConfigConsumerFacts(root, filePath) {
|
|
137
|
+
const imports = collectJavaImports(root);
|
|
138
|
+
const facts = [];
|
|
139
|
+
for (const field of root.descendantsOfType('field_declaration')) {
|
|
140
|
+
const annotations = annotationsOn(field).filter((annotation) => resolvesToAnnotation(annotation.name, VALUE_ANNOTATION, imports));
|
|
141
|
+
if (annotations.length === 0)
|
|
142
|
+
continue;
|
|
143
|
+
const owner = enclosingClass(field);
|
|
144
|
+
if (owner === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
for (const declarator of field.namedChildren.filter((child) => child.type === 'variable_declarator')) {
|
|
147
|
+
const fieldName = declarator.childForFieldName('name')?.text;
|
|
148
|
+
if (!fieldName)
|
|
149
|
+
continue;
|
|
150
|
+
for (const annotation of annotations) {
|
|
151
|
+
const keys = parseValuePlaceholderKeys(annotation.node);
|
|
152
|
+
if (keys.length > 0) {
|
|
153
|
+
facts.push({
|
|
154
|
+
consumer: { kind: 'value', fieldName, line: field.startPosition.row + 1, keys },
|
|
155
|
+
annotationName: annotation.name,
|
|
156
|
+
classScopeId: classScopeId(filePath, owner),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const type of ['class_declaration', 'record_declaration']) {
|
|
163
|
+
for (const declaration of root.descendantsOfType(type)) {
|
|
164
|
+
const className = declaration.childForFieldName('name')?.text;
|
|
165
|
+
if (!className)
|
|
166
|
+
continue;
|
|
167
|
+
for (const annotation of annotationsOn(declaration)) {
|
|
168
|
+
if (!resolvesToAnnotation(annotation.name, CONFIGURATION_PROPERTIES_ANNOTATION, imports)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const prefix = parseConfigurationPropertiesPrefix(annotation.node);
|
|
172
|
+
if (prefix !== null) {
|
|
173
|
+
facts.push({
|
|
174
|
+
consumer: {
|
|
175
|
+
kind: 'configuration-properties',
|
|
176
|
+
className,
|
|
177
|
+
line: declaration.startPosition.row + 1,
|
|
178
|
+
prefix,
|
|
179
|
+
},
|
|
180
|
+
annotationName: annotation.name,
|
|
181
|
+
classScopeId: classScopeId(filePath, declaration),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return facts;
|
|
188
|
+
}
|
|
189
|
+
/** Parse Java consumers for focused unit tests; production reuses the worker AST. */
|
|
190
|
+
export function extractJavaSpringConfigConsumers(source) {
|
|
191
|
+
const tree = parseSourceSafe(getJavaParser(), source);
|
|
192
|
+
return captureJavaSpringConfigConsumerFacts(tree.rootNode, '<memory>').map((fact) => fact.consumer);
|
|
193
|
+
}
|
|
194
|
+
/** Java ScopeResolver post-resolution hook for Spring configuration consumers. */
|
|
195
|
+
export function attachJavaSpringConfigBindings(graph, parsedFiles, _nodeLookup, indexes, _ctx) {
|
|
196
|
+
const resolveAnnotation = createSpringAnnotationNameResolver(indexes);
|
|
197
|
+
const recognizedAnnotations = new Set([VALUE_ANNOTATION, CONFIGURATION_PROPERTIES_ANNOTATION]);
|
|
198
|
+
const batches = [];
|
|
199
|
+
for (const parsed of parsedFiles) {
|
|
200
|
+
const consumers = [];
|
|
201
|
+
for (const fact of getJavaSpringConfigConsumerFacts(parsed.filePath)) {
|
|
202
|
+
const classScope = indexes.scopeTree.getScope(fact.classScopeId);
|
|
203
|
+
if (classScope === undefined || classScope.kind !== 'Class')
|
|
204
|
+
continue;
|
|
205
|
+
const expectedAnnotation = fact.consumer.kind === 'value' ? VALUE_ANNOTATION : CONFIGURATION_PROPERTIES_ANNOTATION;
|
|
206
|
+
const enclosingScope = fact.consumer.kind === 'value' ? classScope.id : classScope.parent;
|
|
207
|
+
const resolved = resolveAnnotation(fact.annotationName, parsed, enclosingScope, recognizedAnnotations, isJavaPackageSiblingVisibilityIncomplete(parsed.filePath));
|
|
208
|
+
if (resolved === expectedAnnotation)
|
|
209
|
+
consumers.push(fact.consumer);
|
|
210
|
+
}
|
|
211
|
+
if (consumers.length > 0)
|
|
212
|
+
batches.push({ filePath: parsed.filePath, consumers });
|
|
213
|
+
}
|
|
214
|
+
bindSpringConfigConsumers(graph, batches);
|
|
215
|
+
}
|
|
@@ -26,6 +26,8 @@ import { javaMethodConfig } from '../method-extractors/configs/jvm.js';
|
|
|
26
26
|
import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
27
27
|
import { javaVariableConfig } from '../variable-extractors/configs/jvm.js';
|
|
28
28
|
import { createJavaCfgVisitor } from '../cfg/visitors/java.js';
|
|
29
|
+
import { assertCloneable } from '../workers/clone-safety.js';
|
|
30
|
+
import { collectJavaCaptureSideChannel } from './java/capture-side-channel.js';
|
|
29
31
|
import { emitJavaScopeCaptures, interpretJavaImport, interpretJavaTypeBinding, javaBindingScopeFor, javaImportOwningScope, javaMergeBindings, javaReceiverBinding, javaArityCompatibility, resolveJavaImportTarget, } from './java/index.js';
|
|
30
32
|
const orderJavaSameNameTypeCandidates = ({ callSiteFilePath, candidates, }) => {
|
|
31
33
|
if (!callSiteFilePath.endsWith('.java'))
|
|
@@ -99,6 +101,7 @@ export const javaProvider = defineLanguage({
|
|
|
99
101
|
descriptionExtractor: createLeadingDocDescriptionExtractor(),
|
|
100
102
|
// ── RFC #909 Ring 3: scope-based resolution hooks ──
|
|
101
103
|
emitScopeCaptures: emitJavaScopeCaptures,
|
|
104
|
+
collectCaptureSideChannel: (filePath) => assertCloneable(collectJavaCaptureSideChannel(filePath)),
|
|
102
105
|
// ── PDG: per-function CFG + def/use harvest (#2195 U4) ──
|
|
103
106
|
cfgVisitor: createJavaCfgVisitor(),
|
|
104
107
|
interpretImport: interpretJavaImport,
|
|
@@ -34,6 +34,7 @@ import { synthesizeTsReceiverBinding } from '../typescript/receiver-binding.js';
|
|
|
34
34
|
import { isArrayMethodCallbackArrow } from '../typescript/array-callback.js';
|
|
35
35
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
36
36
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
37
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
37
38
|
import { deriveDefaultExportHocName, isBlockedDefaultExportHoc, isDefaultExportHocFunctionNode, } from '../../ts-js-hoc-utils.js';
|
|
38
39
|
/** JS function-like node types that may carry a synthesized `this` binding.
|
|
39
40
|
* Kept in sync with the `@scope.function` patterns in `query.ts`. */
|
|
@@ -52,6 +53,20 @@ const CALL_TAGS = [
|
|
|
52
53
|
'@reference.call.member',
|
|
53
54
|
'@reference.call.constructor',
|
|
54
55
|
];
|
|
56
|
+
const JS_CALLABLE_CAPTURE_OPTIONS = {
|
|
57
|
+
functionNodeTypes: new Set(FUNCTION_NODE_TYPES),
|
|
58
|
+
callNodeTypes: new Set(['call_expression']),
|
|
59
|
+
parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
|
|
60
|
+
parameterNodeTypes: new Set(['identifier', 'rest_pattern', 'assignment_pattern']),
|
|
61
|
+
bindingNodeTypes: new Set(['variable_declarator']),
|
|
62
|
+
assignmentNodeTypes: new Set(['assignment_expression', 'augmented_assignment_expression']),
|
|
63
|
+
identifierNodeTypes: new Set([
|
|
64
|
+
'identifier',
|
|
65
|
+
'property_identifier',
|
|
66
|
+
'shorthand_property_identifier_pattern',
|
|
67
|
+
'private_property_identifier',
|
|
68
|
+
]),
|
|
69
|
+
};
|
|
55
70
|
function pickFirstDefined(grouped, tags) {
|
|
56
71
|
for (const tag of tags) {
|
|
57
72
|
const cap = grouped[tag];
|
|
@@ -840,5 +855,6 @@ export function emitJsScopeCaptures(sourceText, filePath, cachedTree) {
|
|
|
840
855
|
synthesizeForOfMapTupleBindings(tree.rootNode, out);
|
|
841
856
|
synthesizeInstanceofNarrowings(tree.rootNode, out);
|
|
842
857
|
synthesizeJsInheritanceReferences(tree.rootNode, out);
|
|
858
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, JS_CALLABLE_CAPTURE_OPTIONS));
|
|
843
859
|
return out;
|
|
844
860
|
}
|
|
@@ -66,6 +66,13 @@ const JAVASCRIPT_SCOPE_QUERY = `
|
|
|
66
66
|
(arrow_function) @scope.function
|
|
67
67
|
(method_definition) @scope.function
|
|
68
68
|
|
|
69
|
+
;; Object literals get their own scope boundary -- see the matching
|
|
70
|
+
;; comment in typescript/query.ts (#2545/#2551). Prevents a
|
|
71
|
+
;; method_definition/property-arrow's auto-hoist from leaking its name
|
|
72
|
+
;; past the literal into the enclosing scope, and (unlike Block) keeps
|
|
73
|
+
;; sibling properties from seeing each other as bare identifiers.
|
|
74
|
+
(object) @scope.object
|
|
75
|
+
|
|
69
76
|
;; Declarations — classes
|
|
70
77
|
(class_declaration
|
|
71
78
|
name: (identifier) @declaration.name) @declaration.class
|
|
@@ -457,6 +464,20 @@ const JAVASCRIPT_SCOPE_QUERY = `
|
|
|
457
464
|
(member_expression
|
|
458
465
|
object: (_) @reference.receiver
|
|
459
466
|
property: (property_identifier) @reference.name) @reference.read.member
|
|
467
|
+
|
|
468
|
+
;; Value position (#2437): function identifier as object-literal property
|
|
469
|
+
;; value ({ emitScopeCaptures: emitHook }) or shorthand ({ emitHook }).
|
|
470
|
+
;; Resolution is callable-gated (MethodRegistry) and emits a USES reference;
|
|
471
|
+
;; @reference.property-key feeds the property-dispatch pass, which
|
|
472
|
+
;; synthesizes CALLS at x.<key>() sites. Two separate patterns (tree-sitter
|
|
473
|
+
;; 0.21 alternation hazard); destructuring shorthand is
|
|
474
|
+
;; shorthand_property_identifier_pattern and cannot match.
|
|
475
|
+
(pair
|
|
476
|
+
key: (property_identifier) @reference.property-key
|
|
477
|
+
value: (identifier) @reference.name @reference.value-ref)
|
|
478
|
+
|
|
479
|
+
(object
|
|
480
|
+
(shorthand_property_identifier) @reference.name @reference.property-key @reference.value-ref)
|
|
460
481
|
`;
|
|
461
482
|
/** JSX-only suffix — appended when compiling against the JSX grammar for .jsx files. */
|
|
462
483
|
const JSX_QUERY_SUFFIX = `
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Plain-data JVM package fact captured from the language's existing AST. */
|
|
2
|
+
export type JvmPackageFact = {
|
|
3
|
+
readonly status: 'known';
|
|
4
|
+
readonly packageName: string;
|
|
5
|
+
} | {
|
|
6
|
+
readonly status: 'unknown';
|
|
7
|
+
};
|
|
8
|
+
export declare const UNKNOWN_JVM_PACKAGE_FACT: JvmPackageFact;
|
|
9
|
+
export interface JvmPackageSyntaxNode {
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly text: string;
|
|
12
|
+
readonly hasError: boolean;
|
|
13
|
+
readonly namedChildren: readonly JvmPackageSyntaxNode[];
|
|
14
|
+
}
|
|
15
|
+
export interface JvmPackageFactOptions {
|
|
16
|
+
readonly packageNodeType: string;
|
|
17
|
+
readonly packageNameNodeTypes: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
export interface JvmPackageFactStore {
|
|
20
|
+
clear(): void;
|
|
21
|
+
capture(filePath: string, root: JvmPackageSyntaxNode): void;
|
|
22
|
+
set(filePath: string, fact: JvmPackageFact): void;
|
|
23
|
+
get(filePath: string): JvmPackageFact | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Validate a package fact restored from an opaque worker payload. */
|
|
26
|
+
export declare function isJvmPackageFact(value: unknown): value is JvmPackageFact;
|
|
27
|
+
/**
|
|
28
|
+
* Create one language-local package fact store.
|
|
29
|
+
*
|
|
30
|
+
* Package facts are captured while the language's scope extractor already
|
|
31
|
+
* owns a tree-sitter Tree, then serialized through ParsedFile's side-channel.
|
|
32
|
+
* Resolution hooks consume only this plain data and never parse source again.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createJvmPackageFactStore(options: JvmPackageFactOptions): JvmPackageFactStore;
|
|
35
|
+
export declare function extractJvmPackageFact(root: JvmPackageSyntaxNode, options: JvmPackageFactOptions): JvmPackageFact;
|