gitnexus 1.6.11-rc.8 → 1.6.11
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 +95 -26
- package/dist/_shared/graph/types.d.ts +81 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- 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 -1
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +1 -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 +4 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +4 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +15 -0
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +4 -0
- package/dist/cli/ai-context.js +90 -14
- package/dist/cli/analyze-config.js +14 -0
- package/dist/cli/analyze-options.d.ts +14 -0
- package/dist/cli/analyze-watch.d.ts +20 -0
- package/dist/cli/analyze-watch.js +434 -0
- package/dist/cli/analyze.js +27 -9
- package/dist/cli/auto-sync.d.ts +1 -0
- package/dist/cli/auto-sync.js +107 -0
- package/dist/cli/command-banner.d.ts +15 -0
- package/dist/cli/command-banner.js +42 -0
- package/dist/cli/detect-changes-format.js +21 -0
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.js +14 -0
- package/dist/cli/group.js +7 -1
- package/dist/cli/help-i18n.js +4 -0
- package/dist/cli/i18n/en.d.ts +18 -3
- package/dist/cli/i18n/en.js +18 -3
- package/dist/cli/i18n/resources.d.ts +33 -3
- package/dist/cli/i18n/zh-CN.d.ts +15 -0
- package/dist/cli/i18n/zh-CN.js +18 -3
- package/dist/cli/index.js +34 -7
- package/dist/cli/mcp.d.ts +15 -0
- package/dist/cli/mcp.js +44 -0
- package/dist/cli/optional-grammars.d.ts +3 -2
- package/dist/cli/optional-grammars.js +19 -3
- package/dist/cli/setup.js +41 -15
- package/dist/cli/update-notice.d.ts +34 -0
- package/dist/cli/update-notice.js +91 -0
- package/dist/cli/update.d.ts +21 -0
- package/dist/cli/update.js +93 -0
- package/dist/cli/watch.d.ts +1 -20
- package/dist/cli/watch.js +5 -371
- package/dist/core/analysis-feature-registry.d.ts +2 -0
- package/dist/core/analysis-feature-registry.js +15 -0
- package/dist/core/analyzer-identity.js +21 -3
- package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
- package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
- package/dist/core/auto-sync/config.d.ts +33 -0
- package/dist/core/auto-sync/config.js +320 -0
- package/dist/core/auto-sync/index.d.ts +6 -0
- package/dist/core/auto-sync/index.js +6 -0
- package/dist/core/auto-sync/path-security.d.ts +9 -0
- package/dist/core/auto-sync/path-security.js +251 -0
- package/dist/core/auto-sync/repo.d.ts +1 -0
- package/dist/core/auto-sync/repo.js +6 -0
- package/dist/core/auto-sync/runner.d.ts +44 -0
- package/dist/core/auto-sync/runner.js +428 -0
- package/dist/core/auto-sync/starter.d.ts +50 -0
- package/dist/core/auto-sync/starter.js +497 -0
- package/dist/core/auto-sync/state.d.ts +37 -0
- package/dist/core/auto-sync/state.js +119 -0
- package/dist/core/group/config-parser.js +8 -1
- package/dist/core/group/cross-impact.d.ts +3 -0
- package/dist/core/group/cross-impact.js +36 -4
- package/dist/core/group/extractors/http-patterns/java.js +22 -8
- package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
- package/dist/core/group/extractors/http-patterns/node.js +145 -8
- package/dist/core/group/extractors/http-patterns/python.js +11 -7
- package/dist/core/group/extractors/http-route-extractor.js +63 -17
- package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
- package/dist/core/group/group-lock.js +5 -6
- package/dist/core/group/normalization.d.ts +38 -1
- package/dist/core/group/normalization.js +59 -3
- package/dist/core/group/service.d.ts +11 -0
- package/dist/core/group/service.js +13 -1
- package/dist/core/group/storage.js +2 -2
- package/dist/core/group/sync.d.ts +24 -1
- package/dist/core/group/sync.js +46 -8
- package/dist/core/group/types.d.ts +13 -0
- package/dist/core/incremental/derived-writeback.d.ts +36 -0
- package/dist/core/incremental/derived-writeback.js +68 -0
- package/dist/core/incremental/spring-config-drift.d.ts +12 -0
- package/dist/core/incremental/spring-config-drift.js +46 -0
- package/dist/core/incremental/subgraph-extract.d.ts +7 -4
- package/dist/core/incremental/subgraph-extract.js +30 -5
- package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
- package/dist/core/ingestion/asyncapi/document.js +758 -0
- package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
- package/dist/core/ingestion/asyncapi/protocol.js +203 -0
- package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
- package/dist/core/ingestion/call-processor.js +3 -1
- package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
- package/dist/core/ingestion/class-extractors/generic.js +4 -1
- package/dist/core/ingestion/class-types.d.ts +6 -2
- package/dist/core/ingestion/destination-key.d.ts +59 -0
- package/dist/core/ingestion/destination-key.js +61 -0
- package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
- package/dist/core/ingestion/entry-point-scoring.js +8 -44
- package/dist/core/ingestion/export-detection.d.ts +37 -0
- package/dist/core/ingestion/export-detection.js +60 -0
- package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
- package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
- package/dist/core/ingestion/field-extractors/generic.js +12 -1
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
- package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
- package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
- package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
- package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
- package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
- package/dist/core/ingestion/import-resolvers/zig.js +193 -0
- package/dist/core/ingestion/language-config.d.ts +177 -0
- package/dist/core/ingestion/language-config.js +719 -0
- package/dist/core/ingestion/language-provider.d.ts +178 -1
- package/dist/core/ingestion/language-provider.js +22 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -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 +1 -1
- package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
- package/dist/core/ingestion/languages/java/captures.js +22 -1
- package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
- package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
- package/dist/core/ingestion/languages/java/spring-di.js +44 -2
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
- package/dist/core/ingestion/languages/java.js +18 -8
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
- package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
- package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
- package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
- package/dist/core/ingestion/languages/kotlin.js +24 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/rust/query.js +8 -8
- package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
- package/dist/core/ingestion/languages/zig/captures.js +2070 -0
- package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
- package/dist/core/ingestion/languages/zig/index.js +4 -0
- package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
- package/dist/core/ingestion/languages/zig/interpret.js +176 -0
- package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
- package/dist/core/ingestion/languages/zig/query.js +426 -0
- package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
- package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
- package/dist/core/ingestion/languages/zig.d.ts +32 -0
- package/dist/core/ingestion/languages/zig.js +130 -0
- package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
- package/dist/core/ingestion/method-extractors/generic.js +16 -4
- package/dist/core/ingestion/method-types.d.ts +10 -4
- package/dist/core/ingestion/model/field-registry.d.ts +3 -3
- package/dist/core/ingestion/model/field-registry.js +11 -7
- package/dist/core/ingestion/model/method-registry.d.ts +3 -3
- package/dist/core/ingestion/model/method-registry.js +13 -8
- package/dist/core/ingestion/model/registration-table.js +3 -0
- package/dist/core/ingestion/model/type-registry.js +8 -4
- package/dist/core/ingestion/pipeline-phases/di.js +47 -14
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
- package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
- package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
- package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
- package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
- package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
- package/dist/core/ingestion/pipeline.d.ts +30 -1
- package/dist/core/ingestion/pipeline.js +52 -14
- package/dist/core/ingestion/resolve-references.js +5 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
- package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
- package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
- package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
- package/dist/core/ingestion/route-extractors/spring.js +9 -5
- package/dist/core/ingestion/scope-extractor.js +8 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
- package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
- package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
- package/dist/core/ingestion/tree-sitter-queries.js +161 -0
- package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
- package/dist/core/ingestion/type-extractors/zig.js +17 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
- package/dist/core/ingestion/utils/ast-helpers.js +124 -6
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
- package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
- package/dist/core/ingestion/utils/test-file-path.js +87 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
- package/dist/core/ingestion/workers/parse-worker.js +85 -14
- package/dist/core/install-context.d.ts +4 -0
- package/dist/core/install-context.js +152 -0
- package/dist/core/lbug/csv-generator.d.ts +10 -1
- package/dist/core/lbug/csv-generator.js +92 -22
- package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
- package/dist/core/lbug/graph-emit-sink.js +4 -2
- package/dist/core/lbug/lbug-adapter.d.ts +100 -5
- package/dist/core/lbug/lbug-adapter.js +236 -24
- package/dist/core/lbug/schema.d.ts +6 -5
- package/dist/core/lbug/schema.js +84 -22
- package/dist/core/net/url-guard.d.ts +6 -0
- package/dist/core/net/url-guard.js +147 -0
- package/dist/core/package-version.d.ts +5 -0
- package/dist/core/package-version.js +10 -0
- package/dist/core/run-analyze.d.ts +21 -4
- package/dist/core/run-analyze.js +426 -117
- package/dist/core/search/fts-indexes.d.ts +19 -1
- package/dist/core/search/fts-indexes.js +28 -1
- package/dist/core/tree-sitter/parser-loader.js +16 -0
- package/dist/core/update-cache.d.ts +39 -0
- package/dist/core/update-cache.js +141 -0
- package/dist/core/update-check.d.ts +31 -0
- package/dist/core/update-check.js +274 -0
- package/dist/mcp/local/local-backend.d.ts +27 -13
- package/dist/mcp/local/local-backend.js +148 -60
- package/dist/mcp/repository-policy.d.ts +5 -1
- package/dist/mcp/repository-policy.js +48 -4
- package/dist/mcp/resources.js +10 -1
- package/dist/mcp/server.js +8 -9
- package/dist/mcp/tools.js +32 -22
- package/dist/server/analyze-launch.d.ts +2 -0
- package/dist/server/analyze-launch.js +2 -0
- package/dist/server/analyze-worker-protocol.d.ts +6 -1
- package/dist/server/analyze-worker.d.ts +1 -0
- package/dist/server/analyze-worker.js +38 -20
- package/dist/server/api.d.ts +5 -1
- package/dist/server/api.js +105 -88
- package/dist/server/git-clone.d.ts +40 -16
- package/dist/server/git-clone.js +253 -199
- package/dist/server/grep-params.d.ts +18 -0
- package/dist/server/grep-params.js +83 -0
- package/dist/server/grep-scan.d.ts +23 -0
- package/dist/server/grep-scan.js +107 -0
- package/dist/server/grep-worker.d.ts +1 -0
- package/dist/server/grep-worker.js +12 -0
- package/dist/server/mcp-http.d.ts +8 -0
- package/dist/server/mcp-http.js +16 -1
- package/dist/server/update-controller.d.ts +29 -0
- package/dist/server/update-controller.js +82 -0
- package/dist/storage/file-lock.d.ts +15 -0
- package/dist/storage/file-lock.js +155 -0
- package/dist/storage/fs-atomic.d.ts +24 -0
- package/dist/storage/fs-atomic.js +86 -2
- package/dist/storage/global-dir.d.ts +2 -0
- package/dist/storage/global-dir.js +6 -0
- package/dist/storage/parse-cache.d.ts +45 -7
- package/dist/storage/parse-cache.js +189 -42
- package/dist/storage/parsedfile-store.d.ts +41 -60
- package/dist/storage/parsedfile-store.js +247 -171
- package/dist/storage/repo-manager.d.ts +10 -4
- package/dist/storage/repo-manager.js +35 -25
- package/dist/storage/repo-meta.d.ts +34 -0
- package/dist/storage/v8-sidecar.d.ts +48 -0
- package/dist/storage/v8-sidecar.js +347 -0
- package/dist/types/pipeline.d.ts +14 -0
- package/dist/utils/process-identity.d.ts +2 -0
- package/dist/utils/process-identity.js +35 -0
- package/package.json +10 -4
- package/scripts/assert-web-assets.mjs +35 -0
- package/scripts/build-web.js +72 -0
- package/scripts/build.js +31 -28
- package/scripts/cross-platform-tests.ts +5 -0
- package/skills/gitnexus-cli.md +5 -1
- package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
- package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
- package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
- package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
- package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
- package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
- package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
- package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
- package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
- package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
- package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
- package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
- package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
- package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
- package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
- package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
- package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
- package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
- package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
- package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
- package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
- package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
- package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
- package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
- package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
- package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
- package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
- package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
- package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
- package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
- package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
- package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
- package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
- package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
- package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
- package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
- package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
- package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
- package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
- package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
- package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
- package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
- package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
- package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
- package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
- package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
- package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
- package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
- package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
- package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
- package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
- package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
- package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
- package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
- package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
- package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
- package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
- package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
- package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
- package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
- package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
- package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
- package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
- package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
- package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
- package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
- package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
- package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
- package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
- package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
- package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
- package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
- package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
- package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
- package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
- package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
- package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
- package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
- package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
- package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
- package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
- package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
- package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
- package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
- package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
- package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
- package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
- package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
- package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
- package/web/assets/src-Df5C1Nz4.js +1 -0
- package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
- package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
- package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
- package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
- package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
- package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
- package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
- package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
- package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
- package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
- package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
- package/web/index.html +19 -17
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
- package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
- package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
- package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
- package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
- package/web/assets/src-C5sx_gMp.js +0 -1
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
- /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lombok accessor synthesizer for Java.
|
|
3
|
+
*
|
|
4
|
+
* Lombok generates getters/setters at compile time. They are absent from the
|
|
5
|
+
* AST, so calls like `obj.getOrderId()` on a `@Data` class would otherwise
|
|
6
|
+
* leave unresolved CALLS edges. This module walks the tree-sitter Java AST
|
|
7
|
+
* and synthesizes Method graph members for the accessors Lombok would emit
|
|
8
|
+
* under the supported subset.
|
|
9
|
+
*
|
|
10
|
+
* ## Supported subset (v1)
|
|
11
|
+
* - Proven `lombok.Data` / `lombok.Getter` / `lombok.Setter` (FQN or import).
|
|
12
|
+
* - Class- or field-level enable; `AccessLevel.NONE` disables.
|
|
13
|
+
* - Default JavaBeans naming; primitive `boolean isX` → `isX` / `setX`.
|
|
14
|
+
* - Access levels PUBLIC/PROTECTED/PRIVATE/PACKAGE.
|
|
15
|
+
* - `@Accessors(chain=true)` modeled as setter return = declaring type.
|
|
16
|
+
* - `@Accessors(fluent=true)` / `prefix=…`: omit affected accessors (names
|
|
17
|
+
* cannot be proven without full Lombok config).
|
|
18
|
+
* - External `lombok.config`: unsupported (may change semantics invisibly).
|
|
19
|
+
*
|
|
20
|
+
* ## Identity
|
|
21
|
+
* Owner lookup uses in-memory AST node ids only. Method ids are derived from
|
|
22
|
+
* the stable declaring-owner graph key (the Class node id's name segment),
|
|
23
|
+
* never from persisted tree-sitter node ids.
|
|
24
|
+
*/
|
|
25
|
+
import { jvmGetterName, jvmSetterName } from '../jvm/beanspec.js';
|
|
26
|
+
import { createExistingMethodIndex, createJvmAccessorSynthesis, hasExistingMethod, rememberExistingMethodRange, } from '../jvm/accessor-synthesis.js';
|
|
27
|
+
const JAVA_TYPE_DECLS = new Set([
|
|
28
|
+
'class_declaration',
|
|
29
|
+
'enum_declaration',
|
|
30
|
+
'interface_declaration',
|
|
31
|
+
'record_declaration',
|
|
32
|
+
]);
|
|
33
|
+
const LOMBOK_ANNOTATION_PACKAGE = new Map([
|
|
34
|
+
['Data', 'lombok'],
|
|
35
|
+
['Getter', 'lombok'],
|
|
36
|
+
['Setter', 'lombok'],
|
|
37
|
+
['Accessors', 'lombok.experimental'],
|
|
38
|
+
['Tolerate', 'lombok.experimental'],
|
|
39
|
+
]);
|
|
40
|
+
export function getterName(fieldName, fieldType) {
|
|
41
|
+
return jvmGetterName(fieldName, fieldType === 'boolean');
|
|
42
|
+
}
|
|
43
|
+
export function setterName(fieldName, fieldType) {
|
|
44
|
+
return jvmSetterName(fieldName, fieldType === 'boolean');
|
|
45
|
+
}
|
|
46
|
+
// ── Provenance / imports ──────────────────────────────────────────────────
|
|
47
|
+
function annotationSimpleName(nameText) {
|
|
48
|
+
return nameText.split('.').pop() ?? nameText;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compilation-unit imports only — Java `import` is never nested in a type body.
|
|
52
|
+
*/
|
|
53
|
+
function collectLombokImports(root) {
|
|
54
|
+
const bySimple = new Map();
|
|
55
|
+
const starPackages = new Set();
|
|
56
|
+
const shadowedSimpleNames = new Set();
|
|
57
|
+
for (const child of root.children) {
|
|
58
|
+
if (!JAVA_TYPE_DECLS.has(child.type) && child.type !== 'annotation_type_declaration')
|
|
59
|
+
continue;
|
|
60
|
+
const name = child.childForFieldName('name')?.text;
|
|
61
|
+
if (name)
|
|
62
|
+
shadowedSimpleNames.add(name);
|
|
63
|
+
}
|
|
64
|
+
for (const child of root.children) {
|
|
65
|
+
if (child.type !== 'import_declaration')
|
|
66
|
+
continue;
|
|
67
|
+
if (/^import\s+static\b/.test(child.text))
|
|
68
|
+
continue;
|
|
69
|
+
const text = child.text
|
|
70
|
+
.replace(/^import\s+/, '')
|
|
71
|
+
.replace(/;\s*$/, '')
|
|
72
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
73
|
+
.replace(/\s+/g, '')
|
|
74
|
+
.trim();
|
|
75
|
+
if (text === 'lombok.*') {
|
|
76
|
+
starPackages.add('lombok');
|
|
77
|
+
}
|
|
78
|
+
else if (text === 'lombok.experimental.*') {
|
|
79
|
+
starPackages.add('lombok.experimental');
|
|
80
|
+
}
|
|
81
|
+
else if (!text.endsWith('.*')) {
|
|
82
|
+
bySimple.set(annotationSimpleName(text), text);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { bySimple, starPackages, shadowedSimpleNames };
|
|
86
|
+
}
|
|
87
|
+
function isProvenLombokAnnotation(nameText, imports) {
|
|
88
|
+
const simple = annotationSimpleName(nameText);
|
|
89
|
+
const packageName = LOMBOK_ANNOTATION_PACKAGE.get(simple);
|
|
90
|
+
if (packageName === undefined)
|
|
91
|
+
return false;
|
|
92
|
+
if (nameText.includes('.'))
|
|
93
|
+
return nameText === `${packageName}.${simple}`;
|
|
94
|
+
const imported = imports.bySimple.get(simple);
|
|
95
|
+
if (imported !== undefined)
|
|
96
|
+
return imported === `${packageName}.${simple}`;
|
|
97
|
+
if (imports.shadowedSimpleNames.has(simple))
|
|
98
|
+
return false;
|
|
99
|
+
return imports.starPackages.has(packageName);
|
|
100
|
+
}
|
|
101
|
+
// ── AccessLevel / Accessors structural parse ──────────────────────────────
|
|
102
|
+
function parseAccessLevelToken(text) {
|
|
103
|
+
const simple = annotationSimpleName(text.trim());
|
|
104
|
+
switch (simple) {
|
|
105
|
+
case 'PUBLIC':
|
|
106
|
+
return 'public';
|
|
107
|
+
case 'PROTECTED':
|
|
108
|
+
return 'protected';
|
|
109
|
+
case 'PRIVATE':
|
|
110
|
+
return 'private';
|
|
111
|
+
case 'PACKAGE':
|
|
112
|
+
case 'MODULE': // treated as package-private for graph metadata
|
|
113
|
+
return 'package';
|
|
114
|
+
case 'NONE':
|
|
115
|
+
return 'none';
|
|
116
|
+
default:
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function findAccessLevelInAnnotation(ann) {
|
|
121
|
+
// Positional: @Getter(AccessLevel.PROTECTED) or @Getter(lombok.AccessLevel.NONE)
|
|
122
|
+
// Named: @Getter(value = AccessLevel.PRIVATE)
|
|
123
|
+
const stack = [...ann.children];
|
|
124
|
+
while (stack.length > 0) {
|
|
125
|
+
const n = stack.pop();
|
|
126
|
+
if (!n)
|
|
127
|
+
break;
|
|
128
|
+
if (n.type === 'field_access' || n.type === 'identifier') {
|
|
129
|
+
const level = parseAccessLevelToken(n.text);
|
|
130
|
+
if (level !== null)
|
|
131
|
+
return level;
|
|
132
|
+
}
|
|
133
|
+
for (const c of n.children)
|
|
134
|
+
stack.push(c);
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
function defaultAccessors() {
|
|
139
|
+
return { fluent: false, hasPrefix: false, chain: false };
|
|
140
|
+
}
|
|
141
|
+
function parseAccessorsAnnotation(ann) {
|
|
142
|
+
const opts = defaultAccessors();
|
|
143
|
+
const stack = [...ann.children];
|
|
144
|
+
while (stack.length > 0) {
|
|
145
|
+
const n = stack.pop();
|
|
146
|
+
if (!n)
|
|
147
|
+
break;
|
|
148
|
+
if (n.type === 'element_value_pair') {
|
|
149
|
+
const key = n.childForFieldName('key')?.text ?? n.children.find((c) => c.type === 'identifier')?.text;
|
|
150
|
+
const valueNode = n.childForFieldName('value') ??
|
|
151
|
+
n.children.find((c) => c.type === 'true' || c.type === 'false' || c.type === 'element_value_array_initializer');
|
|
152
|
+
if (key === 'fluent' && (valueNode?.type === 'true' || valueNode?.type === 'false')) {
|
|
153
|
+
opts.fluent = valueNode.type === 'true';
|
|
154
|
+
}
|
|
155
|
+
if (key === 'chain' && (valueNode?.type === 'true' || valueNode?.type === 'false')) {
|
|
156
|
+
opts.chain = valueNode.type === 'true';
|
|
157
|
+
}
|
|
158
|
+
if (key === 'prefix')
|
|
159
|
+
opts.hasPrefix = true;
|
|
160
|
+
}
|
|
161
|
+
for (const c of n.children)
|
|
162
|
+
stack.push(c);
|
|
163
|
+
}
|
|
164
|
+
const text = ann.text;
|
|
165
|
+
if (/\bprefix\s*=/.test(text))
|
|
166
|
+
opts.hasPrefix = true;
|
|
167
|
+
if (/\bfluent\s*=\s*true\b/.test(text))
|
|
168
|
+
opts.fluent = true;
|
|
169
|
+
if (/\bfluent\s*=\s*false\b/.test(text))
|
|
170
|
+
opts.fluent = false;
|
|
171
|
+
if (/\bchain\s*=\s*true\b/.test(text))
|
|
172
|
+
opts.chain = true;
|
|
173
|
+
if (/\bchain\s*=\s*false\b/.test(text))
|
|
174
|
+
opts.chain = false;
|
|
175
|
+
return opts;
|
|
176
|
+
}
|
|
177
|
+
function parseModifierAnnotations(modifiersNode, imports) {
|
|
178
|
+
const result = {
|
|
179
|
+
getter: null,
|
|
180
|
+
setter: null,
|
|
181
|
+
accessors: defaultAccessors(),
|
|
182
|
+
accessorsPresent: false,
|
|
183
|
+
tolerate: false,
|
|
184
|
+
};
|
|
185
|
+
if (!modifiersNode)
|
|
186
|
+
return result;
|
|
187
|
+
for (const child of modifiersNode.children) {
|
|
188
|
+
if (child.type !== 'marker_annotation' && child.type !== 'annotation')
|
|
189
|
+
continue;
|
|
190
|
+
const nameNode = child.childForFieldName('name');
|
|
191
|
+
const nameText = nameNode?.text ?? '';
|
|
192
|
+
if (!isProvenLombokAnnotation(nameText, imports))
|
|
193
|
+
continue;
|
|
194
|
+
const simple = annotationSimpleName(nameText);
|
|
195
|
+
if (simple === 'Tolerate') {
|
|
196
|
+
result.tolerate = true;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (simple === 'Accessors') {
|
|
200
|
+
result.accessors = parseAccessorsAnnotation(child);
|
|
201
|
+
result.accessorsPresent = true;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (simple === 'Data') {
|
|
205
|
+
result.getter ??= { enabled: true, visibility: 'public' };
|
|
206
|
+
result.setter ??= { enabled: true, visibility: 'public' };
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (simple === 'Getter' || simple === 'Setter') {
|
|
210
|
+
const level = child.type === 'annotation' ? findAccessLevelInAnnotation(child) : null;
|
|
211
|
+
const cfg = level === 'none'
|
|
212
|
+
? { enabled: false, visibility: 'public' }
|
|
213
|
+
: { enabled: true, visibility: level ?? 'public' };
|
|
214
|
+
if (simple === 'Getter')
|
|
215
|
+
result.getter = cfg;
|
|
216
|
+
else
|
|
217
|
+
result.setter = cfg;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
function mergeAccessors(classOpts, fieldOpts, fieldAccessorsPresent) {
|
|
223
|
+
return fieldAccessorsPresent ? fieldOpts : classOpts;
|
|
224
|
+
}
|
|
225
|
+
function effectiveAccessor(classCfg, fieldCfg) {
|
|
226
|
+
if (fieldCfg !== null)
|
|
227
|
+
return fieldCfg;
|
|
228
|
+
return classCfg;
|
|
229
|
+
}
|
|
230
|
+
// ── Field / method collection ─────────────────────────────────────────────
|
|
231
|
+
function parseFieldDeclaration(fieldNode, imports) {
|
|
232
|
+
const typeNode = fieldNode.childForFieldName('type');
|
|
233
|
+
const fieldType = typeNode?.text ?? 'Object';
|
|
234
|
+
const modifiers = fieldNode.children.find((c) => c.type === 'modifiers') ?? null;
|
|
235
|
+
let isStatic = false;
|
|
236
|
+
let isFinal = false;
|
|
237
|
+
if (modifiers) {
|
|
238
|
+
for (const mod of modifiers.children) {
|
|
239
|
+
if (mod.text === 'static')
|
|
240
|
+
isStatic = true;
|
|
241
|
+
else if (mod.text === 'final')
|
|
242
|
+
isFinal = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const fieldAnn = parseModifierAnnotations(modifiers, imports);
|
|
246
|
+
const declarators = [];
|
|
247
|
+
const declaratorField = fieldNode.childForFieldName('declarator');
|
|
248
|
+
if (declaratorField)
|
|
249
|
+
declarators.push(declaratorField);
|
|
250
|
+
for (const child of fieldNode.children) {
|
|
251
|
+
if (child.type === 'variable_declarator' && child !== declaratorField) {
|
|
252
|
+
declarators.push(child);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const startLine = fieldNode.startPosition.row + 1;
|
|
256
|
+
const endLine = fieldNode.endPosition.row + 1;
|
|
257
|
+
const out = [];
|
|
258
|
+
for (const declaratorNode of declarators) {
|
|
259
|
+
const nameNode = declaratorNode.childForFieldName('name');
|
|
260
|
+
if (!nameNode)
|
|
261
|
+
continue;
|
|
262
|
+
out.push({
|
|
263
|
+
name: nameNode.text,
|
|
264
|
+
type: fieldType,
|
|
265
|
+
isStatic,
|
|
266
|
+
isFinal,
|
|
267
|
+
startLine,
|
|
268
|
+
endLine,
|
|
269
|
+
declaratorNode,
|
|
270
|
+
fieldGetter: fieldAnn.getter,
|
|
271
|
+
fieldSetter: fieldAnn.setter,
|
|
272
|
+
accessors: fieldAnn.accessors,
|
|
273
|
+
accessorsPresent: fieldAnn.accessorsPresent,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return out;
|
|
277
|
+
}
|
|
278
|
+
function methodArityRange(methodNode) {
|
|
279
|
+
const params = methodNode.childForFieldName('parameters');
|
|
280
|
+
if (!params)
|
|
281
|
+
return { min: 0, max: 0 };
|
|
282
|
+
let count = 0;
|
|
283
|
+
for (const child of params.namedChildren) {
|
|
284
|
+
if (child.type === 'spread_parameter')
|
|
285
|
+
return { min: count, max: Number.POSITIVE_INFINITY };
|
|
286
|
+
if (child.type === 'formal_parameter')
|
|
287
|
+
count += 1;
|
|
288
|
+
}
|
|
289
|
+
return { min: count, max: count };
|
|
290
|
+
}
|
|
291
|
+
function collectExistingMethods(classBody, imports) {
|
|
292
|
+
const index = createExistingMethodIndex('case-folded');
|
|
293
|
+
if (!classBody)
|
|
294
|
+
return index;
|
|
295
|
+
const scan = (container) => {
|
|
296
|
+
for (const child of container.children) {
|
|
297
|
+
if (child.type === 'enum_body_declarations') {
|
|
298
|
+
scan(child);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (child.type !== 'method_declaration')
|
|
302
|
+
continue;
|
|
303
|
+
const mods = child.children.find((c) => c.type === 'modifiers') ?? null;
|
|
304
|
+
const ann = parseModifierAnnotations(mods, imports);
|
|
305
|
+
if (ann.tolerate)
|
|
306
|
+
continue;
|
|
307
|
+
const nameNode = child.childForFieldName('name');
|
|
308
|
+
if (!nameNode)
|
|
309
|
+
continue;
|
|
310
|
+
const arity = methodArityRange(child);
|
|
311
|
+
rememberExistingMethodRange(index, nameNode.text, arity.min, arity.max);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
scan(classBody);
|
|
315
|
+
return index;
|
|
316
|
+
}
|
|
317
|
+
const TYPE_BODIES = new Set(['class_body', 'enum_body']);
|
|
318
|
+
function findTypeBody(node) {
|
|
319
|
+
return node.children.find((c) => TYPE_BODIES.has(c.type)) ?? null;
|
|
320
|
+
}
|
|
321
|
+
function findLombokClasses(root, imports) {
|
|
322
|
+
const classes = [];
|
|
323
|
+
function walk(node) {
|
|
324
|
+
if (node.type === 'class_declaration' || node.type === 'enum_declaration') {
|
|
325
|
+
const modifiers = node.children.find((c) => c.type === 'modifiers') ?? null;
|
|
326
|
+
const classAnn = parseModifierAnnotations(modifiers, imports);
|
|
327
|
+
const nameNode = node.childForFieldName('name');
|
|
328
|
+
const className = nameNode?.text ?? '';
|
|
329
|
+
if (className) {
|
|
330
|
+
const body = findTypeBody(node);
|
|
331
|
+
const fields = [];
|
|
332
|
+
if (body) {
|
|
333
|
+
const collectFields = (container) => {
|
|
334
|
+
for (const child of container.children) {
|
|
335
|
+
if (child.type === 'field_declaration') {
|
|
336
|
+
for (const f of parseFieldDeclaration(child, imports)) {
|
|
337
|
+
if (f.isStatic)
|
|
338
|
+
continue;
|
|
339
|
+
fields.push(f);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else if (child.type === 'enum_body_declarations') {
|
|
343
|
+
collectFields(child);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
collectFields(body);
|
|
348
|
+
}
|
|
349
|
+
const anyFieldEnable = fields.some((f) => f.fieldGetter?.enabled === true || f.fieldSetter?.enabled === true);
|
|
350
|
+
const classEnable = classAnn.getter?.enabled === true || classAnn.setter?.enabled === true;
|
|
351
|
+
// Class-level NONE alone is not enable — getter/setter configs may be disabled
|
|
352
|
+
if (classEnable || anyFieldEnable) {
|
|
353
|
+
classes.push({
|
|
354
|
+
node,
|
|
355
|
+
name: className,
|
|
356
|
+
classGetter: classAnn.getter,
|
|
357
|
+
classSetter: classAnn.setter,
|
|
358
|
+
classAccessors: classAnn.accessors,
|
|
359
|
+
fields,
|
|
360
|
+
existingMethods: collectExistingMethods(body, imports),
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
for (const child of node.children)
|
|
366
|
+
walk(child);
|
|
367
|
+
}
|
|
368
|
+
walk(root);
|
|
369
|
+
return classes;
|
|
370
|
+
}
|
|
371
|
+
function planAccessors(cls) {
|
|
372
|
+
const planned = [];
|
|
373
|
+
for (const field of cls.fields) {
|
|
374
|
+
const accessors = mergeAccessors(cls.classAccessors, field.accessors, field.accessorsPresent);
|
|
375
|
+
// fluent/prefix change names — omit rather than invent wrong names
|
|
376
|
+
if (accessors.fluent || accessors.hasPrefix)
|
|
377
|
+
continue;
|
|
378
|
+
const getterCfg = effectiveAccessor(cls.classGetter, field.fieldGetter);
|
|
379
|
+
const setterCfg = effectiveAccessor(cls.classSetter, field.fieldSetter);
|
|
380
|
+
if (getterCfg?.enabled) {
|
|
381
|
+
const gName = getterName(field.name, field.type);
|
|
382
|
+
if (!hasExistingMethod(cls.existingMethods, gName, 0)) {
|
|
383
|
+
planned.push({
|
|
384
|
+
kind: 'getter',
|
|
385
|
+
name: gName,
|
|
386
|
+
returnType: field.type,
|
|
387
|
+
parameterTypes: [],
|
|
388
|
+
visibility: getterCfg.visibility,
|
|
389
|
+
isStatic: false,
|
|
390
|
+
isAbstract: false,
|
|
391
|
+
startLine: field.startLine,
|
|
392
|
+
endLine: field.endLine,
|
|
393
|
+
declaratorNode: field.declaratorNode,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (setterCfg?.enabled && !field.isFinal) {
|
|
398
|
+
const sName = setterName(field.name, field.type);
|
|
399
|
+
if (!hasExistingMethod(cls.existingMethods, sName, 1)) {
|
|
400
|
+
// chain=true → setter returns declaring type; never emit void in that case
|
|
401
|
+
const returnType = accessors.chain ? cls.name : 'void';
|
|
402
|
+
planned.push({
|
|
403
|
+
kind: 'setter',
|
|
404
|
+
name: sName,
|
|
405
|
+
returnType,
|
|
406
|
+
parameterTypes: [field.type],
|
|
407
|
+
visibility: setterCfg.visibility,
|
|
408
|
+
isStatic: false,
|
|
409
|
+
isAbstract: false,
|
|
410
|
+
startLine: field.startLine,
|
|
411
|
+
endLine: field.endLine,
|
|
412
|
+
declaratorNode: field.declaratorNode,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return planned;
|
|
418
|
+
}
|
|
419
|
+
function planLombokAccessorOwners(root) {
|
|
420
|
+
const imports = collectLombokImports(root);
|
|
421
|
+
return findLombokClasses(root, imports).map((cls) => ({
|
|
422
|
+
node: cls.node,
|
|
423
|
+
name: cls.name,
|
|
424
|
+
accessors: planAccessors(cls),
|
|
425
|
+
}));
|
|
426
|
+
}
|
|
427
|
+
const lombokAccessorSynthesis = createJvmAccessorSynthesis({
|
|
428
|
+
language: 'java',
|
|
429
|
+
synthetic: 'lombok',
|
|
430
|
+
planOwners: planLombokAccessorOwners,
|
|
431
|
+
});
|
|
432
|
+
// ── Main API ──────────────────────────────────────────────────────────────
|
|
433
|
+
export function synthesizeLombokAccessors(tree, filePath, classOwnersById) {
|
|
434
|
+
return lombokAccessorSynthesis.synthesize(tree, filePath, classOwnersById);
|
|
435
|
+
}
|
|
436
|
+
/** Scope captures for Lombok accessors (dual-path parity with record components). */
|
|
437
|
+
export function synthesizeLombokAccessorCaptures(rootNode) {
|
|
438
|
+
return lombokAccessorSynthesis.captures(rootNode);
|
|
439
|
+
}
|
|
@@ -19,6 +19,7 @@ import { attachJavaSpringConfigBindings } from './spring-config-bindings.js';
|
|
|
19
19
|
import { attachJavaSpringConditionalMetadata } from './spring-conditionals.js';
|
|
20
20
|
import { attachJavaSpringDiMetadata } from './spring-di.js';
|
|
21
21
|
import { attachJavaSpringNonHttpHandlerMetadata } from './spring-non-http-handlers.js';
|
|
22
|
+
import { attachJavaSpringDynamicLookup } from './spring-dynamic-lookup.js';
|
|
22
23
|
import { applyJavaCaptureSideChannel, clearJavaClassAnnotationFacts, } from './capture-side-channel.js';
|
|
23
24
|
import { clearJavaPackageFacts } from './package-facts.js';
|
|
24
25
|
const javaScopeResolver = {
|
|
@@ -65,6 +66,7 @@ const javaScopeResolver = {
|
|
|
65
66
|
attachJavaSpringDiMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
66
67
|
attachJavaSpringNonHttpHandlerMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
67
68
|
attachJavaSpringConfigBindings(graph, parsedFiles, nodeLookup, indexes, ctx);
|
|
69
|
+
attachJavaSpringDynamicLookup(graph, parsedFiles, nodeLookup, indexes);
|
|
68
70
|
},
|
|
69
71
|
};
|
|
70
72
|
export { javaScopeResolver };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const JVM_PRIMITIVES = {
|
|
2
|
+
B: 'byte',
|
|
3
|
+
C: 'char',
|
|
4
|
+
D: 'double',
|
|
5
|
+
F: 'float',
|
|
6
|
+
I: 'int',
|
|
7
|
+
J: 'long',
|
|
8
|
+
S: 'short',
|
|
9
|
+
Z: 'boolean',
|
|
10
|
+
};
|
|
11
|
+
function normalizedType(value, runtime) {
|
|
12
|
+
let erased = value.trim();
|
|
13
|
+
let arrayDimensions = 0;
|
|
14
|
+
if (erased.endsWith('...')) {
|
|
15
|
+
arrayDimensions++;
|
|
16
|
+
erased = erased.slice(0, -3);
|
|
17
|
+
}
|
|
18
|
+
while (erased.endsWith('[]')) {
|
|
19
|
+
arrayDimensions++;
|
|
20
|
+
erased = erased.slice(0, -2);
|
|
21
|
+
}
|
|
22
|
+
erased = erased.replace(/<.*>$/, '').replaceAll('$', '.').replaceAll('/', '.');
|
|
23
|
+
const simple = erased.slice(erased.lastIndexOf('.') + 1);
|
|
24
|
+
const base = runtime ? (JVM_PRIMITIVES[simple] ?? simple) : simple;
|
|
25
|
+
return `${base}${'[]'.repeat(arrayDimensions)}`;
|
|
26
|
+
}
|
|
27
|
+
function sourceTypeIsUnknown(value) {
|
|
28
|
+
const type = normalizedType(value, false).replace(/(?:\[\])+$/, '');
|
|
29
|
+
return type === '?' || /^[A-Z]$/.test(type);
|
|
30
|
+
}
|
|
31
|
+
function matchesJavaCallable(node, runtime) {
|
|
32
|
+
if (node.label !== 'Method' || node.properties.name !== runtime.name)
|
|
33
|
+
return false;
|
|
34
|
+
const descriptorTypes = runtime.descriptorParameterTypes;
|
|
35
|
+
if (descriptorTypes === undefined)
|
|
36
|
+
return true;
|
|
37
|
+
const parameterCount = node.properties.parameterCount;
|
|
38
|
+
if (typeof parameterCount === 'number' && parameterCount !== descriptorTypes.length)
|
|
39
|
+
return false;
|
|
40
|
+
const sourceTypes = node.properties.parameterTypes;
|
|
41
|
+
if (!Array.isArray(sourceTypes) ||
|
|
42
|
+
sourceTypes.length !== descriptorTypes.length ||
|
|
43
|
+
!sourceTypes.every((type) => typeof type === 'string')) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return sourceTypes.every((sourceType, index) => {
|
|
47
|
+
if (sourceTypeIsUnknown(sourceType))
|
|
48
|
+
return true;
|
|
49
|
+
const source = normalizedType(sourceType, false);
|
|
50
|
+
const descriptor = normalizedType(descriptorTypes[index] ?? '', true);
|
|
51
|
+
if (source === descriptor)
|
|
52
|
+
return true;
|
|
53
|
+
// Java parser metadata currently drops the ellipsis from varargs and also
|
|
54
|
+
// leaves parameterCount open-ended. Only in that shape may T match JVM T[].
|
|
55
|
+
return (typeof parameterCount !== 'number' &&
|
|
56
|
+
descriptor.endsWith('[]') &&
|
|
57
|
+
source === descriptor.slice(0, -2));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export const javaRuntimeSymbolStrategy = {
|
|
61
|
+
matchesCallable: matchesJavaCallable,
|
|
62
|
+
};
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import { type SpringDiAnnotationFact, type SpringDiClassFact, type SpringDiDependencyFact, type SpringDiInjectionSiteFact } from '../../frameworks/spring/di-metadata.js';
|
|
2
|
+
import { type SpringArgumentFact } from '../../frameworks/spring/argument-facts.js';
|
|
2
3
|
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
3
4
|
export interface JavaAnnotationSyntaxFact extends SpringDiAnnotationFact {
|
|
4
5
|
readonly line: number;
|
|
6
|
+
/** Present only for callers that opt in via `javaSpringAnnotationFacts`. */
|
|
7
|
+
readonly args?: readonly SpringArgumentFact[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Options for `javaSpringAnnotationFacts`.
|
|
11
|
+
*
|
|
12
|
+
* The STRUCTURED arguments are opt-in because DI captures every annotated
|
|
13
|
+
* field, constructor, and method in the repository, and none of its consumers
|
|
14
|
+
* reads them. Note what this does and does not save: every fact already carries
|
|
15
|
+
* `text`, the annotation's full source, so the argument TEXT crosses the worker
|
|
16
|
+
* boundary either way. What the opt-in avoids is a second, parsed copy of that
|
|
17
|
+
* same text on facts that would never look at it.
|
|
18
|
+
*/
|
|
19
|
+
export interface JavaSpringAnnotationFactOptions {
|
|
20
|
+
readonly includeArguments?: boolean;
|
|
5
21
|
}
|
|
6
22
|
export type JavaSpringDependencyFact = SpringDiDependencyFact<JavaAnnotationSyntaxFact>;
|
|
7
23
|
type JavaSpringInjectionSiteKind = 'field' | 'constructor' | 'method';
|
|
8
24
|
export type JavaSpringInjectionSiteFact = SpringDiInjectionSiteFact<JavaAnnotationSyntaxFact, JavaSpringInjectionSiteKind>;
|
|
9
25
|
export type JavaSpringDiClassFact = SpringDiClassFact<JavaAnnotationSyntaxFact, JavaSpringInjectionSiteKind>;
|
|
10
|
-
export declare function javaSpringAnnotationFacts(node: SyntaxNode): JavaAnnotationSyntaxFact[];
|
|
26
|
+
export declare function javaSpringAnnotationFacts(node: SyntaxNode, options?: JavaSpringAnnotationFactOptions): JavaAnnotationSyntaxFact[];
|
|
11
27
|
/**
|
|
12
28
|
* Capture one class already surfaced by Java's scope query.
|
|
13
29
|
*
|
|
@@ -1,11 +1,51 @@
|
|
|
1
1
|
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
2
|
import { createSpringDiMetadataAttacher, hasSpringDiRelevantAnnotation, hasSpringStereotypeSyntax, } from '../../frameworks/spring/di-metadata.js';
|
|
3
3
|
import { hasSpringBeanFactorySyntax, } from '../../frameworks/spring/bean-factories.js';
|
|
4
|
+
import { normalizeSpringFactText, } from '../../frameworks/spring/argument-facts.js';
|
|
4
5
|
import { parseSpringInjectionType } from '../../di-extractors/spring.js';
|
|
5
|
-
import { nodeToCapture } from '../../utils/ast-helpers.js';
|
|
6
|
+
import { hasRecoveredSyntax, nodeToCapture } from '../../utils/ast-helpers.js';
|
|
6
7
|
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
7
8
|
import { getJavaSpringDiFacts } from './capture-side-channel.js';
|
|
8
|
-
|
|
9
|
+
const JAVA_COMMENT_NODE_TYPES = new Set(['line_comment', 'block_comment']);
|
|
10
|
+
/**
|
|
11
|
+
* Annotation arguments as written, or `undefined` for a marker annotation.
|
|
12
|
+
*
|
|
13
|
+
* `@Scheduled` yields `undefined` (no argument list in the syntax) while
|
|
14
|
+
* `@Scheduled()` yields `[]` (an empty list was written). Named arguments keep
|
|
15
|
+
* their key, single-element ones stay positional, and array initializers are
|
|
16
|
+
* kept as one raw `{...}` text — splitting or dereferencing them would be
|
|
17
|
+
* resolution, which does not belong at capture time.
|
|
18
|
+
*
|
|
19
|
+
* An argument list that did not parse also yields `undefined`. Error recovery
|
|
20
|
+
* fills gaps with invented nodes — `@KafkaListener(topics = "orders", groupId =`
|
|
21
|
+
* hands back a `groupId` whose value is a `{}` that nobody wrote — and there is
|
|
22
|
+
* no fourth state here for "unreadable". Collapsing it into the marker case is
|
|
23
|
+
* deliberate: both tell a consumer there is nothing here to resolve, which is
|
|
24
|
+
* true, whereas a fabricated value would send it somewhere real and wrong.
|
|
25
|
+
*/
|
|
26
|
+
function javaAnnotationArgumentFacts(annotation) {
|
|
27
|
+
const argumentList = annotation.childForFieldName('arguments');
|
|
28
|
+
if (argumentList === null || hasRecoveredSyntax(argumentList))
|
|
29
|
+
return undefined;
|
|
30
|
+
const args = [];
|
|
31
|
+
for (const child of argumentList.namedChildren) {
|
|
32
|
+
if (JAVA_COMMENT_NODE_TYPES.has(child.type))
|
|
33
|
+
continue;
|
|
34
|
+
if (child.type === 'element_value_pair') {
|
|
35
|
+
const key = child.childForFieldName('key');
|
|
36
|
+
const value = child.childForFieldName('value');
|
|
37
|
+
if (key === null || value === null) {
|
|
38
|
+
args.push({ text: normalizeSpringFactText(child.text) });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
args.push({ name: key.text.trim(), text: normalizeSpringFactText(value.text) });
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
args.push({ text: normalizeSpringFactText(child.text) });
|
|
45
|
+
}
|
|
46
|
+
return args;
|
|
47
|
+
}
|
|
48
|
+
export function javaSpringAnnotationFacts(node, options = {}) {
|
|
9
49
|
const facts = [];
|
|
10
50
|
for (const child of node.namedChildren) {
|
|
11
51
|
if (child.type !== 'modifiers')
|
|
@@ -16,10 +56,12 @@ export function javaSpringAnnotationFacts(node) {
|
|
|
16
56
|
const nameNode = modifier.childForFieldName('name') ?? modifier.firstNamedChild;
|
|
17
57
|
if (nameNode === null)
|
|
18
58
|
continue;
|
|
59
|
+
const args = options.includeArguments === true ? javaAnnotationArgumentFacts(modifier) : undefined;
|
|
19
60
|
facts.push({
|
|
20
61
|
name: nameNode.text.trim(),
|
|
21
62
|
text: modifier.text.trim(),
|
|
22
63
|
line: modifier.startPosition.row + 1,
|
|
64
|
+
...(args === undefined ? {} : { args }),
|
|
23
65
|
});
|
|
24
66
|
}
|
|
25
67
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SpringDynamicLookupFact } from '../../frameworks/spring/dynamic-lookups.js';
|
|
2
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
3
|
+
/** Capture real Java method invocations; comments and literals are never visited as calls. */
|
|
4
|
+
export declare function captureJavaSpringDynamicLookupFact(node: SyntaxNode, filePath: string): SpringDynamicLookupFact | null;
|
|
5
|
+
/** Standalone extractor for focused tests; production reuses scope-query call nodes. */
|
|
6
|
+
export declare function captureJavaSpringDynamicLookupFacts(rootNode: SyntaxNode, filePath: string): SpringDynamicLookupFact[];
|
|
7
|
+
/** Attach Java lookup facts for later resolution by the shared DI phase. */
|
|
8
|
+
export declare const attachJavaSpringDynamicLookup: (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;
|