codesift-mcp 0.13.1 → 0.15.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 +5 -1
- package/dist/cli/commands-admin.d.ts +18 -0
- package/dist/cli/commands-admin.d.ts.map +1 -0
- package/dist/cli/commands-admin.js +187 -0
- package/dist/cli/commands-admin.js.map +1 -0
- package/dist/cli/commands-daemon.d.ts +42 -0
- package/dist/cli/commands-daemon.d.ts.map +1 -0
- package/dist/cli/commands-daemon.js +163 -0
- package/dist/cli/commands-daemon.js.map +1 -0
- package/dist/cli/commands-index.d.ts +12 -0
- package/dist/cli/commands-index.d.ts.map +1 -0
- package/dist/cli/commands-index.js +133 -0
- package/dist/cli/commands-index.js.map +1 -0
- package/dist/cli/commands-maintenance.d.ts +12 -0
- package/dist/cli/commands-maintenance.d.ts.map +1 -0
- package/dist/cli/commands-maintenance.js +409 -0
- package/dist/cli/commands-maintenance.js.map +1 -0
- package/dist/cli/commands-query.d.ts +21 -0
- package/dist/cli/commands-query.d.ts.map +1 -0
- package/dist/cli/commands-query.js +270 -0
- package/dist/cli/commands-query.js.map +1 -0
- package/dist/cli/commands.d.ts +2 -36
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -854
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/embed-child.js +13 -2
- package/dist/cli/embed-child.js.map +1 -1
- package/dist/cli/hooks/pre-tool-use.d.ts +1 -0
- package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/cli/hooks/pre-tool-use.js +11 -2
- package/dist/cli/hooks/pre-tool-use.js.map +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/formatters-core.d.ts +7 -0
- package/dist/formatters-core.d.ts.map +1 -1
- package/dist/formatters-core.js +14 -3
- package/dist/formatters-core.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +5 -2
- package/dist/instructions.js.map +1 -1
- package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
- package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
- package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
- package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-class-metadata.js +65 -0
- package/dist/parser/extractors/php-class-metadata.js.map +1 -0
- package/dist/parser/extractors/php-doc.d.ts +13 -0
- package/dist/parser/extractors/php-doc.d.ts.map +1 -0
- package/dist/parser/extractors/php-doc.js +39 -0
- package/dist/parser/extractors/php-doc.js.map +1 -0
- package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
- package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-node-metadata.js +132 -0
- package/dist/parser/extractors/php-node-metadata.js.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.js +58 -0
- package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
- package/dist/parser/extractors/php-walker.d.ts +4 -0
- package/dist/parser/extractors/php-walker.d.ts.map +1 -0
- package/dist/parser/extractors/php-walker.js +238 -0
- package/dist/parser/extractors/php-walker.js.map +1 -0
- package/dist/parser/extractors/php.d.ts +2 -33
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +2 -747
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/register-tool-groups/core/search.d.ts.map +1 -1
- package/dist/register-tool-groups/core/search.js +14 -0
- package/dist/register-tool-groups/core/search.js.map +1 -1
- package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
- package/dist/register-tool-groups/core/symbols.js +50 -5
- package/dist/register-tool-groups/core/symbols.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +11 -11
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tools/runtime.d.ts +11 -0
- package/dist/register-tools/runtime.d.ts.map +1 -1
- package/dist/register-tools/runtime.js +40 -0
- package/dist/register-tools/runtime.js.map +1 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +5 -1
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
- package/dist/retrieval/semantic-handlers.js +10 -3
- package/dist/retrieval/semantic-handlers.js.map +1 -1
- package/dist/search/semantic.d.ts +2 -0
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +41 -9
- package/dist/search/semantic.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +54 -2
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +21 -0
- package/dist/storage/_shared.d.ts.map +1 -1
- package/dist/storage/_shared.js +36 -0
- package/dist/storage/_shared.js.map +1 -1
- package/dist/storage/chunk-store.d.ts +14 -2
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +214 -34
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +0 -12
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +69 -9
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/index-cache.d.ts +12 -0
- package/dist/storage/index-cache.d.ts.map +1 -0
- package/dist/storage/index-cache.js +89 -0
- package/dist/storage/index-cache.js.map +1 -0
- package/dist/storage/index-footprint.d.ts +12 -0
- package/dist/storage/index-footprint.d.ts.map +1 -0
- package/dist/storage/index-footprint.js +41 -0
- package/dist/storage/index-footprint.js.map +1 -0
- package/dist/storage/index-json-mutations.d.ts +11 -0
- package/dist/storage/index-json-mutations.d.ts.map +1 -0
- package/dist/storage/index-json-mutations.js +93 -0
- package/dist/storage/index-json-mutations.js.map +1 -0
- package/dist/storage/index-migration.d.ts +22 -0
- package/dist/storage/index-migration.d.ts.map +1 -0
- package/dist/storage/index-migration.js +80 -0
- package/dist/storage/index-migration.js.map +1 -0
- package/dist/storage/index-store.d.ts +26 -55
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +82 -350
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/index-version.d.ts +39 -0
- package/dist/storage/index-version.d.ts.map +1 -0
- package/dist/storage/index-version.js +87 -0
- package/dist/storage/index-version.js.map +1 -0
- package/dist/storage/registry.d.ts +9 -1
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +233 -9
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/shared-embedding-cache.d.ts +23 -3
- package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
- package/dist/storage/shared-embedding-cache.js +300 -45
- package/dist/storage/shared-embedding-cache.js.map +1 -1
- package/dist/storage/sqlite/accessors.d.ts +34 -0
- package/dist/storage/sqlite/accessors.d.ts.map +1 -0
- package/dist/storage/sqlite/accessors.js +178 -0
- package/dist/storage/sqlite/accessors.js.map +1 -0
- package/dist/storage/sqlite/connection.d.ts +43 -0
- package/dist/storage/sqlite/connection.d.ts.map +1 -0
- package/dist/storage/sqlite/connection.js +241 -0
- package/dist/storage/sqlite/connection.js.map +1 -0
- package/dist/storage/sqlite/errors.d.ts +38 -0
- package/dist/storage/sqlite/errors.d.ts.map +1 -0
- package/dist/storage/sqlite/errors.js +150 -0
- package/dist/storage/sqlite/errors.js.map +1 -0
- package/dist/storage/sqlite/index-io.d.ts +49 -0
- package/dist/storage/sqlite/index-io.d.ts.map +1 -0
- package/dist/storage/sqlite/index-io.js +268 -0
- package/dist/storage/sqlite/index-io.js.map +1 -0
- package/dist/storage/sqlite/meta.d.ts +41 -0
- package/dist/storage/sqlite/meta.d.ts.map +1 -0
- package/dist/storage/sqlite/meta.js +28 -0
- package/dist/storage/sqlite/meta.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +64 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +186 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/runtime.d.ts +6 -0
- package/dist/storage/sqlite/runtime.d.ts.map +1 -0
- package/dist/storage/sqlite/runtime.js +31 -0
- package/dist/storage/sqlite/runtime.js.map +1 -0
- package/dist/storage/sqlite/schema.d.ts +34 -0
- package/dist/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/storage/sqlite/schema.js +98 -0
- package/dist/storage/sqlite/schema.js.map +1 -0
- package/dist/storage/sqlite-index-store.d.ts +40 -80
- package/dist/storage/sqlite-index-store.d.ts.map +1 -1
- package/dist/storage/sqlite-index-store.js +32 -577
- package/dist/storage/sqlite-index-store.js.map +1 -1
- package/dist/storage/telemetry/config.d.ts.map +1 -1
- package/dist/storage/telemetry/config.js +15 -3
- package/dist/storage/telemetry/config.js.map +1 -1
- package/dist/storage/telemetry/payload.d.ts.map +1 -1
- package/dist/storage/telemetry/payload.js +4 -1
- package/dist/storage/telemetry/payload.js.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.d.ts +48 -0
- package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
- package/dist/storage/telemetry/retro-aggregator.js +221 -0
- package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
- package/dist/storage/telemetry/sanitizer.d.ts +46 -0
- package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
- package/dist/storage/telemetry/sanitizer.js +25 -0
- package/dist/storage/telemetry/sanitizer.js.map +1 -1
- package/dist/storage/telemetry/uploader.d.ts +3 -1
- package/dist/storage/telemetry/uploader.d.ts.map +1 -1
- package/dist/storage/telemetry/uploader.js +161 -18
- package/dist/storage/telemetry/uploader.js.map +1 -1
- package/dist/storage/workspace-resolver.js +1 -1
- package/dist/storage/workspace-resolver.js.map +1 -1
- package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
- package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-adapters.js +70 -0
- package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
- package/dist/tools/cross-repo-contract-group.d.ts +17 -0
- package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-group.js +89 -0
- package/dist/tools/cross-repo-contract-group.js.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.js +134 -0
- package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.js +86 -0
- package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
- package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
- package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
- package/dist/tools/cross-repo-contract-tools.js +8 -589
- package/dist/tools/cross-repo-contract-tools.js.map +1 -1
- package/dist/tools/cross-repo-contract-types.d.ts +30 -0
- package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-types.js +3 -0
- package/dist/tools/cross-repo-contract-types.js.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.js +347 -0
- package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
- package/dist/tools/index-tools/file-indexer.js +3 -3
- package/dist/tools/index-tools/file-indexer.js.map +1 -1
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.js +51 -3
- package/dist/tools/index-tools/folder-indexer.js.map +1 -1
- package/dist/tools/index-tools/parse.d.ts +12 -3
- package/dist/tools/index-tools/parse.d.ts.map +1 -1
- package/dist/tools/index-tools/parse.js +33 -8
- package/dist/tools/index-tools/parse.js.map +1 -1
- package/dist/tools/index-tools/registry.d.ts +35 -0
- package/dist/tools/index-tools/registry.d.ts.map +1 -1
- package/dist/tools/index-tools/registry.js +167 -3
- package/dist/tools/index-tools/registry.js.map +1 -1
- package/dist/tools/index-tools/state.d.ts +31 -0
- package/dist/tools/index-tools/state.d.ts.map +1 -1
- package/dist/tools/index-tools/state.js +53 -0
- package/dist/tools/index-tools/state.js.map +1 -1
- package/dist/tools/index-tools/types.d.ts +9 -0
- package/dist/tools/index-tools/types.d.ts.map +1 -1
- package/dist/tools/index-tools/watcher.js +3 -3
- package/dist/tools/index-tools/watcher.js.map +1 -1
- package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
- package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
- package/dist/tools/index-tools/worktree-seed.js +302 -0
- package/dist/tools/index-tools/worktree-seed.js.map +1 -0
- package/dist/tools/index-tools.d.ts +2 -2
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +5 -3
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
- package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/graphql.js +54 -0
- package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.js +51 -0
- package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.js +254 -0
- package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
- package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
- package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/queue.js +95 -0
- package/dist/tools/nest-ext-tools/queue.js.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.js +89 -0
- package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
- package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
- package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/scope.js +151 -0
- package/dist/tools/nest-ext-tools/scope.js.map +1 -0
- package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
- package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/shared.js +279 -0
- package/dist/tools/nest-ext-tools/shared.js.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.js +59 -0
- package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.js +70 -0
- package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
- package/dist/tools/nest-ext-tools.d.ts +10 -204
- package/dist/tools/nest-ext-tools.d.ts.map +1 -1
- package/dist/tools/nest-ext-tools.js +10 -749
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/perf-tools.js +2 -2
- package/dist/tools/plan-turn/stale-index.d.ts +32 -0
- package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
- package/dist/tools/plan-turn/stale-index.js +42 -5
- package/dist/tools/plan-turn/stale-index.js.map +1 -1
- package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
- package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
- package/dist/tools/python-constants/constant-match.d.ts +5 -0
- package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
- package/dist/tools/python-constants/constant-match.js +24 -0
- package/dist/tools/python-constants/constant-match.js.map +1 -0
- package/dist/tools/python-constants/file-context.d.ts +5 -0
- package/dist/tools/python-constants/file-context.d.ts.map +1 -0
- package/dist/tools/python-constants/file-context.js +91 -0
- package/dist/tools/python-constants/file-context.js.map +1 -0
- package/dist/tools/python-constants/function-defaults.d.ts +5 -0
- package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
- package/dist/tools/python-constants/function-defaults.js +98 -0
- package/dist/tools/python-constants/function-defaults.js.map +1 -0
- package/dist/tools/python-constants/model.d.ts +78 -0
- package/dist/tools/python-constants/model.d.ts.map +1 -0
- package/dist/tools/python-constants/model.js +2 -0
- package/dist/tools/python-constants/model.js.map +1 -0
- package/dist/tools/python-constants/syntax.d.ts +22 -0
- package/dist/tools/python-constants/syntax.d.ts.map +1 -0
- package/dist/tools/python-constants/syntax.js +93 -0
- package/dist/tools/python-constants/syntax.js.map +1 -0
- package/dist/tools/python-constants/value-resolver.d.ts +6 -0
- package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
- package/dist/tools/python-constants/value-resolver.js +320 -0
- package/dist/tools/python-constants/value-resolver.js.map +1 -0
- package/dist/tools/python-constants-tools.d.ts +3 -45
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js +2 -505
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/route-tools/django.d.ts +8 -0
- package/dist/tools/route-tools/django.d.ts.map +1 -0
- package/dist/tools/route-tools/django.js +52 -0
- package/dist/tools/route-tools/django.js.map +1 -0
- package/dist/tools/route-tools/express.d.ts +5 -0
- package/dist/tools/route-tools/express.d.ts.map +1 -0
- package/dist/tools/route-tools/express.js +33 -0
- package/dist/tools/route-tools/express.js.map +1 -0
- package/dist/tools/route-tools/file-sources.d.ts +7 -0
- package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
- package/dist/tools/route-tools/file-sources.js +15 -0
- package/dist/tools/route-tools/file-sources.js.map +1 -0
- package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
- package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
- package/dist/tools/route-tools/handler-discovery.js +38 -0
- package/dist/tools/route-tools/handler-discovery.js.map +1 -0
- package/dist/tools/route-tools/hono.d.ts +5 -0
- package/dist/tools/route-tools/hono.d.ts.map +1 -0
- package/dist/tools/route-tools/hono.js +61 -0
- package/dist/tools/route-tools/hono.js.map +1 -0
- package/dist/tools/route-tools/ktor.d.ts +5 -0
- package/dist/tools/route-tools/ktor.d.ts.map +1 -0
- package/dist/tools/route-tools/ktor.js +76 -0
- package/dist/tools/route-tools/ktor.js.map +1 -0
- package/dist/tools/route-tools/laravel.d.ts +5 -0
- package/dist/tools/route-tools/laravel.d.ts.map +1 -0
- package/dist/tools/route-tools/laravel.js +45 -0
- package/dist/tools/route-tools/laravel.js.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
- package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
- package/dist/tools/route-tools/nest.d.ts +5 -0
- package/dist/tools/route-tools/nest.d.ts.map +1 -0
- package/dist/tools/route-tools/nest.js +75 -0
- package/dist/tools/route-tools/nest.js.map +1 -0
- package/dist/tools/route-tools/next-trace.d.ts +4 -0
- package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
- package/dist/tools/route-tools/next-trace.js +48 -0
- package/dist/tools/route-tools/next-trace.js.map +1 -0
- package/dist/tools/route-tools/next.d.ts +7 -0
- package/dist/tools/route-tools/next.d.ts.map +1 -0
- package/dist/tools/route-tools/next.js +77 -0
- package/dist/tools/route-tools/next.js.map +1 -0
- package/dist/tools/route-tools/python-decorators.d.ts +7 -0
- package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
- package/dist/tools/route-tools/python-decorators.js +53 -0
- package/dist/tools/route-tools/python-decorators.js.map +1 -0
- package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
- package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
- package/dist/tools/route-tools/route-mermaid.js +53 -0
- package/dist/tools/route-tools/route-mermaid.js.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.js +52 -0
- package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
- package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
- package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-analysis.js +37 -0
- package/dist/tools/route-tools/trace-analysis.js.map +1 -0
- package/dist/tools/route-tools/trace-route.d.ts +6 -0
- package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-route.js +53 -0
- package/dist/tools/route-tools/trace-route.js.map +1 -0
- package/dist/tools/route-tools/types.d.ts +35 -0
- package/dist/tools/route-tools/types.d.ts.map +1 -0
- package/dist/tools/route-tools/types.js +2 -0
- package/dist/tools/route-tools/types.js.map +1 -0
- package/dist/tools/route-tools/yii2.d.ts +5 -0
- package/dist/tools/route-tools/yii2.d.ts.map +1 -0
- package/dist/tools/route-tools/yii2.js +73 -0
- package/dist/tools/route-tools/yii2.js.map +1 -0
- package/dist/tools/route-tools.d.ts +7 -49
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +5 -978
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/search-tools/types.d.ts +20 -0
- package/dist/tools/search-tools/types.d.ts.map +1 -1
- package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
- package/dist/tools/search-tools/zero-hit.js +0 -0
- package/dist/tools/search-tools/zero-hit.js.map +1 -1
- package/dist/tools/status-tools.d.ts +10 -0
- package/dist/tools/status-tools.d.ts.map +1 -1
- package/dist/tools/status-tools.js +14 -4
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/symbol-analysis-tools.d.ts +81 -0
- package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
- package/dist/tools/symbol-analysis-tools.js +327 -0
- package/dist/tools/symbol-analysis-tools.js.map +1 -0
- package/dist/tools/symbol-context-tools.d.ts +68 -0
- package/dist/tools/symbol-context-tools.d.ts.map +1 -0
- package/dist/tools/symbol-context-tools.js +232 -0
- package/dist/tools/symbol-context-tools.js.map +1 -0
- package/dist/tools/symbol-lookup-tools.d.ts +77 -0
- package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
- package/dist/tools/symbol-lookup-tools.js +305 -0
- package/dist/tools/symbol-lookup-tools.js.map +1 -0
- package/dist/tools/symbol-reference-tools.d.ts +38 -0
- package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
- package/dist/tools/symbol-reference-tools.js +253 -0
- package/dist/tools/symbol-reference-tools.js.map +1 -0
- package/dist/tools/symbol-tool-internals.d.ts +9 -0
- package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
- package/dist/tools/symbol-tool-internals.js +47 -0
- package/dist/tools/symbol-tool-internals.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +11 -176
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +7 -975
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint/python-context.d.ts +10 -0
- package/dist/tools/taint/python-context.d.ts.map +1 -0
- package/dist/tools/taint/python-context.js +150 -0
- package/dist/tools/taint/python-context.js.map +1 -0
- package/dist/tools/taint/taint-analyzer.d.ts +2 -0
- package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
- package/dist/tools/taint/taint-analyzer.js +2 -0
- package/dist/tools/taint/taint-analyzer.js.map +1 -0
- package/dist/tools/taint/taint-expression.d.ts +18 -0
- package/dist/tools/taint/taint-expression.d.ts.map +1 -0
- package/dist/tools/taint/taint-expression.js +265 -0
- package/dist/tools/taint/taint-expression.js.map +1 -0
- package/dist/tools/taint/taint-flow.d.ts +10 -0
- package/dist/tools/taint/taint-flow.d.ts.map +1 -0
- package/dist/tools/taint/taint-flow.js +178 -0
- package/dist/tools/taint/taint-flow.js.map +1 -0
- package/dist/tools/taint/taint-model.d.ts +113 -0
- package/dist/tools/taint/taint-model.d.ts.map +1 -0
- package/dist/tools/taint/taint-model.js +277 -0
- package/dist/tools/taint/taint-model.js.map +1 -0
- package/dist/tools/taint-tools.d.ts +2 -34
- package/dist/tools/taint-tools.d.ts.map +1 -1
- package/dist/tools/taint-tools.js +2 -852
- package/dist/tools/taint-tools.js.map +1 -1
- package/dist/tools/typescript-constants/file-context.d.ts +7 -0
- package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
- package/dist/tools/typescript-constants/file-context.js +219 -0
- package/dist/tools/typescript-constants/file-context.js.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
- package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
- package/dist/tools/typescript-constants/types.d.ts +44 -0
- package/dist/tools/typescript-constants/types.d.ts.map +1 -0
- package/dist/tools/typescript-constants/types.js +2 -0
- package/dist/tools/typescript-constants/types.js.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.js +404 -0
- package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
- package/dist/tools/typescript-constants-tools.js +19 -709
- package/dist/tools/typescript-constants-tools.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/git-head.d.ts +12 -0
- package/dist/utils/git-head.d.ts.map +1 -1
- package/dist/utils/git-head.js +25 -0
- package/dist/utils/git-head.js.map +1 -1
- package/dist/utils/import-graph/collect.d.ts +5 -0
- package/dist/utils/import-graph/collect.d.ts.map +1 -0
- package/dist/utils/import-graph/collect.js +47 -0
- package/dist/utils/import-graph/collect.js.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.js +47 -0
- package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
- package/dist/utils/import-graph/language-imports.d.ts +6 -0
- package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/language-imports.js +84 -0
- package/dist/utils/import-graph/language-imports.js.map +1 -0
- package/dist/utils/import-graph/metrics.d.ts +6 -0
- package/dist/utils/import-graph/metrics.d.ts.map +1 -0
- package/dist/utils/import-graph/metrics.js +51 -0
- package/dist/utils/import-graph/metrics.js.map +1 -0
- package/dist/utils/import-graph/path-map.d.ts +7 -0
- package/dist/utils/import-graph/path-map.d.ts.map +1 -0
- package/dist/utils/import-graph/path-map.js +56 -0
- package/dist/utils/import-graph/path-map.js.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.js +42 -0
- package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/source-imports.d.ts +5 -0
- package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/source-imports.js +33 -0
- package/dist/utils/import-graph/source-imports.js.map +1 -0
- package/dist/utils/import-graph/types.d.ts +15 -0
- package/dist/utils/import-graph/types.d.ts.map +1 -0
- package/dist/utils/import-graph/types.js +2 -0
- package/dist/utils/import-graph/types.js.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
- package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
- package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-alias.js +95 -0
- package/dist/utils/import-graph/workspace-alias.js.map +1 -0
- package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
- package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-entry.js +81 -0
- package/dist/utils/import-graph/workspace-entry.js.map +1 -0
- package/dist/utils/import-graph.d.ts +10 -94
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +6 -702
- package/dist/utils/import-graph.js.map +1 -1
- package/package.json +6 -4
- package/rules/codesift.md +11 -2
- package/rules/codesift.mdc +11 -2
- package/rules/codex.md +11 -2
- package/rules/gemini.md +11 -2
|
@@ -1,748 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Parse `@property` and `@method` tags from a PHPDoc block.
|
|
5
|
-
* Used to synthesize Yii2 ActiveRecord magic properties (which live only in
|
|
6
|
-
* the docblock, not as real PHP fields).
|
|
7
|
-
*
|
|
8
|
-
* Supports forms:
|
|
9
|
-
* @property int $id → { tag: "property", name: "id", type: "int" }
|
|
10
|
-
* @property string $name → { tag: "property", name: "name", type: "string" }
|
|
11
|
-
* @method getPosts() → { tag: "method", name: "getPosts" }
|
|
12
|
-
* @method ActiveQuery getPosts() → { tag: "method", name: "getPosts", type: "ActiveQuery" }
|
|
13
|
-
*
|
|
14
|
-
* Returns [] for empty / undefined input. Tag order is preserved.
|
|
15
|
-
*/
|
|
16
|
-
export function parsePhpDocTags(docstring) {
|
|
17
|
-
if (!docstring)
|
|
18
|
-
return [];
|
|
19
|
-
const results = [];
|
|
20
|
-
const propRe = /@property(?:-read|-write)?\s+(\S+)\s+\$(\w+)/g;
|
|
21
|
-
let m;
|
|
22
|
-
while ((m = propRe.exec(docstring)) !== null) {
|
|
23
|
-
const entry = {
|
|
24
|
-
tag: "property",
|
|
25
|
-
name: m[2],
|
|
26
|
-
};
|
|
27
|
-
if (m[1])
|
|
28
|
-
entry.type = m[1];
|
|
29
|
-
results.push(entry);
|
|
30
|
-
}
|
|
31
|
-
// @method [returnType] name(args)
|
|
32
|
-
// - With return type: @method ActiveQuery getPosts(int $limit)
|
|
33
|
-
// - Without type: @method getPosts()
|
|
34
|
-
const methodRe = /@method\s+(?:(\S+)\s+)?(\w+)\s*\(/g;
|
|
35
|
-
while ((m = methodRe.exec(docstring)) !== null) {
|
|
36
|
-
const entry = {
|
|
37
|
-
tag: "method",
|
|
38
|
-
name: m[2],
|
|
39
|
-
};
|
|
40
|
-
if (m[1])
|
|
41
|
-
entry.type = m[1];
|
|
42
|
-
results.push(entry);
|
|
43
|
-
}
|
|
44
|
-
return results;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Extract a `@var T` type annotation from a PHPDoc block. Used for inferring
|
|
48
|
-
* property types in pre-PHP-7.4 codebases that keep typing in docblocks
|
|
49
|
-
* rather than as inline type hints. Returns the raw type string (no further
|
|
50
|
-
* normalization) or undefined if no `@var` is present.
|
|
51
|
-
*
|
|
52
|
-
* Examples:
|
|
53
|
-
* /** @var string *\/ → "string"
|
|
54
|
-
* /** @var User|null *\/ → "User|null"
|
|
55
|
-
* /** @var int[] *\/ → "int[]"
|
|
56
|
-
*/
|
|
57
|
-
export function parsePhpDocVar(docstring) {
|
|
58
|
-
if (!docstring)
|
|
59
|
-
return undefined;
|
|
60
|
-
const m = /@var\s+(\S+)/.exec(docstring);
|
|
61
|
-
return m?.[1];
|
|
62
|
-
}
|
|
63
|
-
// --- Helpers ---
|
|
64
|
-
/**
|
|
65
|
-
* PHP docblocks are `comment` nodes starting with `/**` that precede a declaration.
|
|
66
|
-
* Walk backwards through siblings collecting contiguous doc comments.
|
|
67
|
-
*/
|
|
68
|
-
function getDocstring(node, source) {
|
|
69
|
-
let prev = node.previousNamedSibling;
|
|
70
|
-
// Skip visibility_modifier and other attributes to reach the comment
|
|
71
|
-
while (prev && (prev.type === "visibility_modifier" || prev.type === "attribute_list")) {
|
|
72
|
-
prev = prev.previousNamedSibling;
|
|
73
|
-
}
|
|
74
|
-
if (!prev || prev.type !== "comment")
|
|
75
|
-
return undefined;
|
|
76
|
-
const text = source.slice(prev.startIndex, prev.endIndex);
|
|
77
|
-
if (!text.startsWith("/**"))
|
|
78
|
-
return undefined;
|
|
79
|
-
return text;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Extract parameter list and optional return type.
|
|
83
|
-
* e.g. "(string $name, int $age = 0): bool"
|
|
84
|
-
*/
|
|
85
|
-
function getSignature(node, source) {
|
|
86
|
-
const params = node.childForFieldName("parameters");
|
|
87
|
-
if (!params)
|
|
88
|
-
return undefined;
|
|
89
|
-
let sig = source.slice(params.startIndex, params.endIndex);
|
|
90
|
-
const returnType = node.childForFieldName("return_type");
|
|
91
|
-
if (returnType) {
|
|
92
|
-
sig += ": " + source.slice(returnType.startIndex, returnType.endIndex);
|
|
93
|
-
}
|
|
94
|
-
return sig;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Test base classes that mark a class as a test suite. Includes PHPUnit
|
|
98
|
-
* (TestCase) and Codeception (Unit, Cest, Cept) — the latter pair are the
|
|
99
|
-
* canonical Codeception base classes used in panels like tgm-panel.
|
|
100
|
-
*/
|
|
101
|
-
const TEST_BASE_NAMES = new Set([
|
|
102
|
-
"TestCase",
|
|
103
|
-
"Unit",
|
|
104
|
-
"Cest",
|
|
105
|
-
"Cept",
|
|
106
|
-
]);
|
|
107
|
-
/**
|
|
108
|
-
* Extract the list of base class names from a `base_clause` node. Returns
|
|
109
|
-
* fully-qualified names exactly as written in source (e.g. ["BaseUser",
|
|
110
|
-
* "\\yii\\db\\ActiveRecord", "Codeception\\Test\\Unit"]). Aliases stay as
|
|
111
|
-
* source-side names — namespace resolution is the resolver's job, not the
|
|
112
|
-
* extractor's.
|
|
113
|
-
*/
|
|
114
|
-
function parseBaseClause(baseClause) {
|
|
115
|
-
if (!baseClause)
|
|
116
|
-
return [];
|
|
117
|
-
const names = [];
|
|
118
|
-
for (const child of baseClause.namedChildren) {
|
|
119
|
-
if (child.type === "name" || child.type === "qualified_name") {
|
|
120
|
-
const text = child.text.trim();
|
|
121
|
-
if (text)
|
|
122
|
-
names.push(text);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// Fallback: tree-sitter-php sometimes flattens children. Strip the keyword
|
|
126
|
-
// prefix and split on commas if no structured children were found.
|
|
127
|
-
if (names.length === 0) {
|
|
128
|
-
const stripped = baseClause.text.replace(/^extends\s+/, "").trim();
|
|
129
|
-
if (stripped) {
|
|
130
|
-
for (const n of stripped.split(/\s*,\s*/)) {
|
|
131
|
-
if (n)
|
|
132
|
-
names.push(n);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return names;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Extract the list of interface names from a `class_interface_clause` node.
|
|
140
|
-
* Mirrors `parseBaseClause` but strips the `implements` keyword.
|
|
141
|
-
*/
|
|
142
|
-
function parseInterfaceClause(clause) {
|
|
143
|
-
if (!clause)
|
|
144
|
-
return [];
|
|
145
|
-
const names = [];
|
|
146
|
-
for (const child of clause.namedChildren) {
|
|
147
|
-
if (child.type === "name" || child.type === "qualified_name") {
|
|
148
|
-
const text = child.text.trim();
|
|
149
|
-
if (text)
|
|
150
|
-
names.push(text);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
if (names.length === 0) {
|
|
154
|
-
const stripped = clause.text.replace(/^implements\s+/, "").trim();
|
|
155
|
-
if (stripped) {
|
|
156
|
-
for (const n of stripped.split(/\s*,\s*/)) {
|
|
157
|
-
if (n)
|
|
158
|
-
names.push(n);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return names;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Walk a class/trait body and collect the names of traits used via
|
|
166
|
-
* `use TraitName;` declarations. Returns FQ names as written.
|
|
167
|
-
*/
|
|
168
|
-
function collectTraitUses(body) {
|
|
169
|
-
if (!body)
|
|
170
|
-
return [];
|
|
171
|
-
const traits = [];
|
|
172
|
-
for (const child of body.namedChildren) {
|
|
173
|
-
if (child.type !== "use_declaration")
|
|
174
|
-
continue;
|
|
175
|
-
for (const grand of child.namedChildren) {
|
|
176
|
-
if (grand.type === "name" || grand.type === "qualified_name") {
|
|
177
|
-
const t = grand.text.trim();
|
|
178
|
-
if (t)
|
|
179
|
-
traits.push(t);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return traits;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Look at a class/method/property declaration's children for modifier nodes.
|
|
187
|
-
* tree-sitter-php emits these as siblings of the name, with types like
|
|
188
|
-
* `abstract_modifier`, `final_modifier`, `readonly_modifier`, `static_modifier`,
|
|
189
|
-
* and `visibility_modifier`. Returns a set of plain string flags.
|
|
190
|
-
*/
|
|
191
|
-
function collectModifiers(node) {
|
|
192
|
-
const out = {};
|
|
193
|
-
for (const child of node.namedChildren) {
|
|
194
|
-
const t = child.type;
|
|
195
|
-
if (t === "visibility_modifier") {
|
|
196
|
-
const txt = child.text.trim();
|
|
197
|
-
if (txt === "public" || txt === "private" || txt === "protected") {
|
|
198
|
-
out.visibility = txt;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else if (t === "static_modifier" || (t === "modifier" && child.text === "static")) {
|
|
202
|
-
out.is_static = true;
|
|
203
|
-
}
|
|
204
|
-
else if (t === "abstract_modifier" || (t === "modifier" && child.text === "abstract")) {
|
|
205
|
-
out.is_abstract = true;
|
|
206
|
-
}
|
|
207
|
-
else if (t === "final_modifier" || (t === "modifier" && child.text === "final")) {
|
|
208
|
-
out.is_final = true;
|
|
209
|
-
}
|
|
210
|
-
else if (t === "readonly_modifier" || (t === "modifier" && child.text === "readonly")) {
|
|
211
|
-
out.is_readonly = true;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return out;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Extract PHP 8.0+ attribute list from a declaration. Attributes appear as
|
|
218
|
-
* an `attribute_list` named child preceding the declaration; each contains
|
|
219
|
-
* one or more `attribute_group` → `attribute` nodes.
|
|
220
|
-
*
|
|
221
|
-
* Returns shape suitable for storing in `meta.attributes`:
|
|
222
|
-
* #[Route('/api', methods: ['GET'])] → { name: "Route", args: "'/api', methods: ['GET']" }
|
|
223
|
-
*/
|
|
224
|
-
function parseAttributes(node) {
|
|
225
|
-
const attrs = [];
|
|
226
|
-
// Attributes precede the decl as a sibling; we walk the immediate previous
|
|
227
|
-
// siblings until we hit something that is not an attribute_list.
|
|
228
|
-
let prev = node.previousNamedSibling;
|
|
229
|
-
while (prev && prev.type === "attribute_list") {
|
|
230
|
-
walkAttributeList(prev, attrs);
|
|
231
|
-
prev = prev.previousNamedSibling;
|
|
232
|
-
}
|
|
233
|
-
// tree-sitter-php sometimes nests attribute_list as a named child of the
|
|
234
|
-
// declaration itself. Collect those too.
|
|
235
|
-
for (const child of node.namedChildren) {
|
|
236
|
-
if (child.type === "attribute_list") {
|
|
237
|
-
walkAttributeList(child, attrs);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return attrs;
|
|
241
|
-
}
|
|
242
|
-
function walkAttributeList(list, out) {
|
|
243
|
-
for (const group of list.namedChildren) {
|
|
244
|
-
if (group.type !== "attribute_group" && group.type !== "attribute")
|
|
245
|
-
continue;
|
|
246
|
-
const attrNodes = group.type === "attribute_group"
|
|
247
|
-
? group.namedChildren.filter((c) => c.type === "attribute")
|
|
248
|
-
: [group];
|
|
249
|
-
for (const attr of attrNodes) {
|
|
250
|
-
// attribute → name + optional arguments
|
|
251
|
-
const nameNode = attr.namedChildren.find((c) => c.type === "name" || c.type === "qualified_name");
|
|
252
|
-
if (!nameNode)
|
|
253
|
-
continue;
|
|
254
|
-
const argsNode = attr.namedChildren.find((c) => c.type === "arguments");
|
|
255
|
-
const entry = { name: nameNode.text };
|
|
256
|
-
if (argsNode) {
|
|
257
|
-
// Strip outer parens, trim — keep raw arg list as a string for cheap
|
|
258
|
-
// pattern matching downstream (no need to AST-walk every literal).
|
|
259
|
-
entry.args = argsNode.text.replace(/^\(/, "").replace(/\)$/, "").trim();
|
|
260
|
-
}
|
|
261
|
-
out.push(entry);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Check if a class extends a known test-runner base class. Covers both
|
|
267
|
-
* PHPUnit (`TestCase`) and Codeception (`Unit`, `Cest`, `Cept`). Match is
|
|
268
|
-
* substring-based on the last name segment so namespace prefixes don't
|
|
269
|
-
* matter (e.g. `Codeception\\Test\\Unit` ends with `Unit`).
|
|
270
|
-
*/
|
|
271
|
-
function isTestCaseClass(node) {
|
|
272
|
-
const bases = collectClassExtends(node);
|
|
273
|
-
for (const b of bases) {
|
|
274
|
-
const last = b.split(/[\\\\]+/).pop() ?? "";
|
|
275
|
-
if (TEST_BASE_NAMES.has(last))
|
|
276
|
-
return true;
|
|
277
|
-
}
|
|
278
|
-
return false;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Helper: read the `extends` list from a class_declaration node, regardless
|
|
282
|
-
* of whether the parser exposes it via `childForFieldName("base_clause")`
|
|
283
|
-
* or as a named child of type `base_clause`.
|
|
284
|
-
*/
|
|
285
|
-
function collectClassExtends(node) {
|
|
286
|
-
let baseClause = node.childForFieldName("base_clause");
|
|
287
|
-
if (!baseClause) {
|
|
288
|
-
baseClause = node.namedChildren.find((c) => c.type === "base_clause") ?? null;
|
|
289
|
-
}
|
|
290
|
-
return parseBaseClause(baseClause);
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Helper: read the `implements` list from a class_declaration node.
|
|
294
|
-
*/
|
|
295
|
-
function collectClassImplements(node) {
|
|
296
|
-
let clause = node.childForFieldName("class_interface_clause");
|
|
297
|
-
if (!clause) {
|
|
298
|
-
clause =
|
|
299
|
-
node.namedChildren.find((c) => c.type === "class_interface_clause") ??
|
|
300
|
-
null;
|
|
301
|
-
}
|
|
302
|
-
return parseInterfaceClause(clause);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Classify a method declaration based on PHPUnit patterns.
|
|
306
|
-
*/
|
|
307
|
-
function classifyMethod(name, parentIsTest, docstring) {
|
|
308
|
-
// Test hooks
|
|
309
|
-
const hooks = ["setUp", "tearDown", "setUpBeforeClass", "tearDownAfterClass"];
|
|
310
|
-
if (hooks.includes(name))
|
|
311
|
-
return "test_hook";
|
|
312
|
-
// Test case: method starts with "test" or has @test annotation
|
|
313
|
-
if (parentIsTest) {
|
|
314
|
-
if (name.startsWith("test"))
|
|
315
|
-
return "test_case";
|
|
316
|
-
if (docstring?.includes("@test"))
|
|
317
|
-
return "test_case";
|
|
318
|
-
}
|
|
319
|
-
return "method";
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Extract name from a property_element node.
|
|
323
|
-
* Property elements contain variable_name → name nodes.
|
|
324
|
-
* Returns the name without the $ prefix.
|
|
325
|
-
*/
|
|
326
|
-
function getPropertyName(node) {
|
|
327
|
-
for (const child of node.namedChildren) {
|
|
328
|
-
if (child.type === "property_element") {
|
|
329
|
-
// variable_name → name
|
|
330
|
-
const varName = child.namedChildren.find(c => c.type === "variable_name");
|
|
331
|
-
if (varName) {
|
|
332
|
-
const nameNode = varName.namedChildren.find(c => c.type === "name");
|
|
333
|
-
return nameNode ? "$" + nameNode.text : null;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return null;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Pull a type annotation off a property_declaration / parameter / promoted
|
|
341
|
-
* parameter node. Walks named children looking for the first type-bearing
|
|
342
|
-
* node. Returns the raw source text exactly as written.
|
|
343
|
-
*
|
|
344
|
-
* Type-bearing node types in tree-sitter-php:
|
|
345
|
-
* primitive_type (string, int, bool, float, array, mixed, void, ...)
|
|
346
|
-
* named_type (User, \\App\\Model)
|
|
347
|
-
* optional_type (?T) — wraps the inner type
|
|
348
|
-
* union_type (PHP 8.0+: A|B)
|
|
349
|
-
* intersection_type (PHP 8.1+: A&B)
|
|
350
|
-
* disjunctive_normal_form_type (PHP 8.2+: (A&B)|C)
|
|
351
|
-
*/
|
|
352
|
-
function getInlineType(node) {
|
|
353
|
-
const TYPE_NODES = new Set([
|
|
354
|
-
"primitive_type",
|
|
355
|
-
"named_type",
|
|
356
|
-
"optional_type",
|
|
357
|
-
"union_type",
|
|
358
|
-
"intersection_type",
|
|
359
|
-
"disjunctive_normal_form_type",
|
|
360
|
-
]);
|
|
361
|
-
for (const child of node.namedChildren) {
|
|
362
|
-
if (TYPE_NODES.has(child.type)) {
|
|
363
|
-
return child.text.trim();
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
return undefined;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Build a Property metadata object from a property_declaration node.
|
|
370
|
-
* Combines inline type (PHP 7.4+ typed property) with `@var T` from a
|
|
371
|
-
* leading PHPDoc block. Inline type takes precedence; `@var` is used when
|
|
372
|
-
* inline type is absent (legacy 7.2/7.3 code).
|
|
373
|
-
*/
|
|
374
|
-
function buildPropertyMeta(node, docstring) {
|
|
375
|
-
const meta = {};
|
|
376
|
-
const modifiers = collectModifiers(node);
|
|
377
|
-
if (modifiers.visibility)
|
|
378
|
-
meta.visibility = modifiers.visibility;
|
|
379
|
-
if (modifiers.is_static)
|
|
380
|
-
meta.is_static = true;
|
|
381
|
-
if (modifiers.is_readonly)
|
|
382
|
-
meta.is_readonly = true;
|
|
383
|
-
const inlineType = getInlineType(node);
|
|
384
|
-
const docVar = parsePhpDocVar(docstring);
|
|
385
|
-
if (inlineType) {
|
|
386
|
-
meta.type = inlineType;
|
|
387
|
-
meta.type_source = "inline";
|
|
388
|
-
}
|
|
389
|
-
else if (docVar) {
|
|
390
|
-
meta.type = docVar;
|
|
391
|
-
meta.type_source = "phpdoc";
|
|
392
|
-
}
|
|
393
|
-
const attrs = parseAttributes(node);
|
|
394
|
-
if (attrs.length > 0)
|
|
395
|
-
meta.attributes = attrs;
|
|
396
|
-
return meta;
|
|
397
|
-
}
|
|
398
|
-
// --- Main extractor ---
|
|
399
|
-
export function extractPhpSymbols(tree, filePath, source, repo) {
|
|
400
|
-
const symbols = [];
|
|
401
|
-
// Synthesize @property / @method tags from a declaration's docblock into
|
|
402
|
-
// real CodeSymbols with meta.synthetic=true. Used by class/interface/trait
|
|
403
|
-
// cases — any PHP declaration that can carry a PHPDoc block.
|
|
404
|
-
// Dedup rule: if a real (non-synthetic) member with the same name+kind
|
|
405
|
-
// already exists under the same parent, skip synthesis. Body walk must run
|
|
406
|
-
// BEFORE this function so the real members are in the symbols array.
|
|
407
|
-
function synthesizeDocstringTags(node, parent, docstring) {
|
|
408
|
-
if (!docstring)
|
|
409
|
-
return;
|
|
410
|
-
const tags = parsePhpDocTags(docstring);
|
|
411
|
-
for (const tag of tags) {
|
|
412
|
-
const targetKind = tag.tag === "property" ? "field" : "method";
|
|
413
|
-
const realExists = symbols.some((s) => s.parent === parent.id &&
|
|
414
|
-
s.name === tag.name &&
|
|
415
|
-
s.kind === targetKind &&
|
|
416
|
-
!s.meta?.synthetic);
|
|
417
|
-
if (realExists)
|
|
418
|
-
continue;
|
|
419
|
-
const synOpts = {
|
|
420
|
-
parentId: parent.id,
|
|
421
|
-
meta: { synthetic: true },
|
|
422
|
-
};
|
|
423
|
-
if (tag.type)
|
|
424
|
-
synOpts.signature = tag.type;
|
|
425
|
-
const synthetic = makeSymbol(node, tag.name, targetKind, filePath, source, repo, synOpts);
|
|
426
|
-
symbols.push(synthetic);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Emit synthetic `field` symbols for PHP 8.0+ promoted constructor params.
|
|
431
|
-
*
|
|
432
|
-
* Promoted ctor params (`public readonly string $name` inside a __construct
|
|
433
|
-
* signature) are real properties at runtime, but the property has no
|
|
434
|
-
* separate `property_declaration` in the class body — only the parameter
|
|
435
|
-
* inside `formal_parameters`. Without this, downstream tools see a class
|
|
436
|
-
* with N parameters in its ctor and think the class has 0 properties.
|
|
437
|
-
*
|
|
438
|
-
* Each emitted symbol carries `meta.from_constructor: true` so callers
|
|
439
|
-
* (e.g. analyzeActiveRecord, find_php_god_model) can distinguish promoted
|
|
440
|
-
* fields from declared ones if they need to.
|
|
441
|
-
*/
|
|
442
|
-
function emitPromotedCtorFields(methodNode, classId) {
|
|
443
|
-
const params = methodNode.childForFieldName("parameters")
|
|
444
|
-
?? methodNode.namedChildren.find((c) => c.type === "formal_parameters");
|
|
445
|
-
if (!params)
|
|
446
|
-
return;
|
|
447
|
-
for (const child of params.namedChildren) {
|
|
448
|
-
if (child.type !== "property_promotion_parameter")
|
|
449
|
-
continue;
|
|
450
|
-
const varName = child.namedChildren.find((c) => c.type === "variable_name");
|
|
451
|
-
if (!varName)
|
|
452
|
-
continue;
|
|
453
|
-
const nameNode = varName.namedChildren.find((c) => c.type === "name");
|
|
454
|
-
if (!nameNode)
|
|
455
|
-
continue;
|
|
456
|
-
const propName = "$" + nameNode.text;
|
|
457
|
-
const modifiers = collectModifiers(child);
|
|
458
|
-
const inlineType = getInlineType(child);
|
|
459
|
-
const attrs = parseAttributes(child);
|
|
460
|
-
const meta = { from_constructor: true };
|
|
461
|
-
if (modifiers.visibility)
|
|
462
|
-
meta.visibility = modifiers.visibility;
|
|
463
|
-
if (modifiers.is_readonly)
|
|
464
|
-
meta.is_readonly = true;
|
|
465
|
-
if (inlineType) {
|
|
466
|
-
meta.type = inlineType;
|
|
467
|
-
meta.type_source = "inline";
|
|
468
|
-
}
|
|
469
|
-
if (attrs.length > 0)
|
|
470
|
-
meta.attributes = attrs;
|
|
471
|
-
symbols.push(makeSymbol(child, propName, "field", filePath, source, repo, {
|
|
472
|
-
parentId: classId,
|
|
473
|
-
meta,
|
|
474
|
-
}));
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
function walk(node, parentId, parentIsTest = false) {
|
|
478
|
-
switch (node.type) {
|
|
479
|
-
case "namespace_definition": {
|
|
480
|
-
const nameNode = node.childForFieldName("name");
|
|
481
|
-
const name = nameNode?.text ?? "<anonymous>";
|
|
482
|
-
const sym = makeSymbol(node, name, "namespace", filePath, source, repo, {
|
|
483
|
-
parentId,
|
|
484
|
-
});
|
|
485
|
-
symbols.push(sym);
|
|
486
|
-
// Walk body with namespace as parent
|
|
487
|
-
const body = node.childForFieldName("body");
|
|
488
|
-
if (body) {
|
|
489
|
-
for (const child of body.namedChildren) {
|
|
490
|
-
walk(child, sym.id, false);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
// Namespace without braces — remaining siblings are children
|
|
495
|
-
// (tree-sitter handles this by putting declarations as siblings)
|
|
496
|
-
// We continue walking at the parent level, but with namespace as parent
|
|
497
|
-
// This is handled naturally since siblings follow after this node
|
|
498
|
-
}
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
case "class_declaration": {
|
|
502
|
-
const name = getNodeName(node) ?? "<anonymous>";
|
|
503
|
-
const isTest = isTestCaseClass(node);
|
|
504
|
-
const kind = isTest ? "test_suite" : "class";
|
|
505
|
-
const docstring = getDocstring(node, source);
|
|
506
|
-
const extendsList = collectClassExtends(node);
|
|
507
|
-
const implementsList = collectClassImplements(node);
|
|
508
|
-
const body = node.childForFieldName("body");
|
|
509
|
-
const traitUses = collectTraitUses(body);
|
|
510
|
-
const modifiers = collectModifiers(node);
|
|
511
|
-
const attributes = parseAttributes(node);
|
|
512
|
-
const meta = {};
|
|
513
|
-
if (modifiers.is_abstract)
|
|
514
|
-
meta.is_abstract = true;
|
|
515
|
-
if (modifiers.is_final)
|
|
516
|
-
meta.is_final = true;
|
|
517
|
-
if (modifiers.is_readonly)
|
|
518
|
-
meta.is_readonly = true;
|
|
519
|
-
if (traitUses.length > 0)
|
|
520
|
-
meta.uses_traits = traitUses;
|
|
521
|
-
if (attributes.length > 0)
|
|
522
|
-
meta.attributes = attributes;
|
|
523
|
-
const opts = {
|
|
524
|
-
parentId,
|
|
525
|
-
docstring,
|
|
526
|
-
};
|
|
527
|
-
if (extendsList.length > 0)
|
|
528
|
-
opts.extends = extendsList;
|
|
529
|
-
if (implementsList.length > 0)
|
|
530
|
-
opts.implements = implementsList;
|
|
531
|
-
if (Object.keys(meta).length > 0)
|
|
532
|
-
opts.meta = meta;
|
|
533
|
-
const sym = makeSymbol(node, name, kind, filePath, source, repo, opts);
|
|
534
|
-
symbols.push(sym);
|
|
535
|
-
// Walk class body FIRST so real methods/fields are in `symbols`
|
|
536
|
-
// before dedup runs for synthetic @property/@method tags.
|
|
537
|
-
if (body) {
|
|
538
|
-
for (const child of body.namedChildren) {
|
|
539
|
-
walk(child, sym.id, isTest);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
synthesizeDocstringTags(node, sym, docstring);
|
|
543
|
-
return;
|
|
544
|
-
}
|
|
545
|
-
case "interface_declaration": {
|
|
546
|
-
const name = getNodeName(node) ?? "<anonymous>";
|
|
547
|
-
const docstring = getDocstring(node, source);
|
|
548
|
-
const extendsList = collectClassExtends(node);
|
|
549
|
-
const attributes = parseAttributes(node);
|
|
550
|
-
const meta = {};
|
|
551
|
-
if (attributes.length > 0)
|
|
552
|
-
meta.attributes = attributes;
|
|
553
|
-
const opts = {
|
|
554
|
-
parentId,
|
|
555
|
-
docstring,
|
|
556
|
-
};
|
|
557
|
-
if (extendsList.length > 0)
|
|
558
|
-
opts.extends = extendsList;
|
|
559
|
-
if (Object.keys(meta).length > 0)
|
|
560
|
-
opts.meta = meta;
|
|
561
|
-
const sym = makeSymbol(node, name, "interface", filePath, source, repo, opts);
|
|
562
|
-
symbols.push(sym);
|
|
563
|
-
const body = node.childForFieldName("body");
|
|
564
|
-
if (body) {
|
|
565
|
-
for (const child of body.namedChildren) {
|
|
566
|
-
walk(child, sym.id, false);
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
synthesizeDocstringTags(node, sym, docstring);
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
case "trait_declaration": {
|
|
573
|
-
const name = getNodeName(node) ?? "<anonymous>";
|
|
574
|
-
const docstring = getDocstring(node, source);
|
|
575
|
-
const body = node.childForFieldName("body");
|
|
576
|
-
const traitUses = collectTraitUses(body);
|
|
577
|
-
const attributes = parseAttributes(node);
|
|
578
|
-
const meta = {};
|
|
579
|
-
if (traitUses.length > 0)
|
|
580
|
-
meta.uses_traits = traitUses;
|
|
581
|
-
if (attributes.length > 0)
|
|
582
|
-
meta.attributes = attributes;
|
|
583
|
-
const opts = {
|
|
584
|
-
parentId,
|
|
585
|
-
docstring,
|
|
586
|
-
};
|
|
587
|
-
if (Object.keys(meta).length > 0)
|
|
588
|
-
opts.meta = meta;
|
|
589
|
-
const sym = makeSymbol(node, name, "type", filePath, source, repo, opts);
|
|
590
|
-
symbols.push(sym);
|
|
591
|
-
if (body) {
|
|
592
|
-
for (const child of body.namedChildren) {
|
|
593
|
-
walk(child, sym.id, false);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
synthesizeDocstringTags(node, sym, docstring);
|
|
597
|
-
return;
|
|
598
|
-
}
|
|
599
|
-
case "enum_declaration": {
|
|
600
|
-
const name = getNodeName(node) ?? "<anonymous>";
|
|
601
|
-
// PHP 8.1 backed enum: `enum Status: string {…}`. The backing type
|
|
602
|
-
// appears as a `primitive_type` direct child of enum_declaration,
|
|
603
|
-
// sitting between the name and the body. Capture it so downstream
|
|
604
|
-
// tools (e.g. M1 enum-from-class-consts migration assist) can tell
|
|
605
|
-
// backed from pure enums.
|
|
606
|
-
let backedType;
|
|
607
|
-
for (const child of node.namedChildren) {
|
|
608
|
-
if (child.type === "primitive_type") {
|
|
609
|
-
backedType = child.text.trim();
|
|
610
|
-
break;
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
// PHP 8.1 enums can implement interfaces too.
|
|
614
|
-
const implementsList = collectClassImplements(node);
|
|
615
|
-
const attributes = parseAttributes(node);
|
|
616
|
-
const meta = {};
|
|
617
|
-
if (backedType)
|
|
618
|
-
meta.backed_type = backedType;
|
|
619
|
-
if (attributes.length > 0)
|
|
620
|
-
meta.attributes = attributes;
|
|
621
|
-
const opts = {
|
|
622
|
-
parentId,
|
|
623
|
-
docstring: getDocstring(node, source),
|
|
624
|
-
};
|
|
625
|
-
if (implementsList.length > 0)
|
|
626
|
-
opts.implements = implementsList;
|
|
627
|
-
if (Object.keys(meta).length > 0)
|
|
628
|
-
opts.meta = meta;
|
|
629
|
-
const sym = makeSymbol(node, name, "enum", filePath, source, repo, opts);
|
|
630
|
-
symbols.push(sym);
|
|
631
|
-
// tree-sitter-php uses `enum_declaration_list` for the body container,
|
|
632
|
-
// not `body`. Try field name first for forward-compat, fall back to
|
|
633
|
-
// the named child lookup.
|
|
634
|
-
const body = node.childForFieldName("body") ??
|
|
635
|
-
node.namedChildren.find((c) => c.type === "enum_declaration_list") ??
|
|
636
|
-
null;
|
|
637
|
-
if (body) {
|
|
638
|
-
for (const child of body.namedChildren) {
|
|
639
|
-
walk(child, sym.id, false);
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
return;
|
|
643
|
-
}
|
|
644
|
-
case "function_definition": {
|
|
645
|
-
const name = getNodeName(node);
|
|
646
|
-
if (name) {
|
|
647
|
-
const sym = makeSymbol(node, name, "function", filePath, source, repo, {
|
|
648
|
-
parentId,
|
|
649
|
-
docstring: getDocstring(node, source),
|
|
650
|
-
signature: getSignature(node, source),
|
|
651
|
-
});
|
|
652
|
-
symbols.push(sym);
|
|
653
|
-
}
|
|
654
|
-
return;
|
|
655
|
-
}
|
|
656
|
-
case "method_declaration": {
|
|
657
|
-
const name = getNodeName(node);
|
|
658
|
-
if (name) {
|
|
659
|
-
const docstring = getDocstring(node, source);
|
|
660
|
-
const kind = classifyMethod(name, parentIsTest, docstring);
|
|
661
|
-
const modifiers = collectModifiers(node);
|
|
662
|
-
const attributes = parseAttributes(node);
|
|
663
|
-
const meta = {};
|
|
664
|
-
if (modifiers.visibility)
|
|
665
|
-
meta.visibility = modifiers.visibility;
|
|
666
|
-
if (modifiers.is_static)
|
|
667
|
-
meta.is_static = true;
|
|
668
|
-
if (modifiers.is_abstract)
|
|
669
|
-
meta.is_abstract = true;
|
|
670
|
-
if (modifiers.is_final)
|
|
671
|
-
meta.is_final = true;
|
|
672
|
-
if (attributes.length > 0)
|
|
673
|
-
meta.attributes = attributes;
|
|
674
|
-
const opts = {
|
|
675
|
-
parentId,
|
|
676
|
-
docstring,
|
|
677
|
-
signature: getSignature(node, source),
|
|
678
|
-
};
|
|
679
|
-
if (Object.keys(meta).length > 0)
|
|
680
|
-
opts.meta = meta;
|
|
681
|
-
const sym = makeSymbol(node, name, kind, filePath, source, repo, opts);
|
|
682
|
-
symbols.push(sym);
|
|
683
|
-
// Promoted constructor params (PHP 8.0+): the body has no field
|
|
684
|
-
// declarations for these, so synthesize them as `field` symbols
|
|
685
|
-
// attached to the parent class. Only fires for __construct.
|
|
686
|
-
if (name === "__construct" && parentId) {
|
|
687
|
-
emitPromotedCtorFields(node, parentId);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
return;
|
|
691
|
-
}
|
|
692
|
-
case "property_declaration": {
|
|
693
|
-
const propName = getPropertyName(node);
|
|
694
|
-
if (propName) {
|
|
695
|
-
const docstring = getDocstring(node, source);
|
|
696
|
-
const meta = buildPropertyMeta(node, docstring);
|
|
697
|
-
const opts = {
|
|
698
|
-
parentId,
|
|
699
|
-
docstring,
|
|
700
|
-
};
|
|
701
|
-
if (Object.keys(meta).length > 0)
|
|
702
|
-
opts.meta = meta;
|
|
703
|
-
const sym = makeSymbol(node, propName, "field", filePath, source, repo, opts);
|
|
704
|
-
symbols.push(sym);
|
|
705
|
-
}
|
|
706
|
-
return;
|
|
707
|
-
}
|
|
708
|
-
case "const_declaration": {
|
|
709
|
-
// Class constants or global constants: const FOO = 'bar';
|
|
710
|
-
// May have multiple const_element children
|
|
711
|
-
for (const child of node.namedChildren) {
|
|
712
|
-
if (child.type === "const_element") {
|
|
713
|
-
// const_element doesn't use named fields — name is first child of type "name"
|
|
714
|
-
const nameNode = child.namedChildren.find(c => c.type === "name");
|
|
715
|
-
const name = nameNode?.text;
|
|
716
|
-
if (name) {
|
|
717
|
-
const sym = makeSymbol(child, name, "constant", filePath, source, repo, {
|
|
718
|
-
parentId,
|
|
719
|
-
docstring: getDocstring(node, source),
|
|
720
|
-
});
|
|
721
|
-
symbols.push(sym);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
return;
|
|
726
|
-
}
|
|
727
|
-
case "enum_case": {
|
|
728
|
-
const name = getNodeName(node);
|
|
729
|
-
if (name) {
|
|
730
|
-
const sym = makeSymbol(node, name, "constant", filePath, source, repo, {
|
|
731
|
-
parentId,
|
|
732
|
-
});
|
|
733
|
-
symbols.push(sym);
|
|
734
|
-
}
|
|
735
|
-
return;
|
|
736
|
-
}
|
|
737
|
-
default:
|
|
738
|
-
break;
|
|
739
|
-
}
|
|
740
|
-
// Default: walk children
|
|
741
|
-
for (const child of node.namedChildren) {
|
|
742
|
-
walk(child, parentId, parentIsTest);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
walk(tree.rootNode);
|
|
746
|
-
return symbols;
|
|
747
|
-
}
|
|
1
|
+
export { parsePhpDocTags, parsePhpDocVar } from "./php-doc.js";
|
|
2
|
+
export { extractPhpSymbols } from "./php-walker.js";
|
|
748
3
|
//# sourceMappingURL=php.js.map
|