cg-code-graph 0.23.5__tar.gz → 0.23.6__tar.gz
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.
- {cg_code_graph-0.23.5/cg_code_graph.egg-info → cg_code_graph-0.23.6}/PKG-INFO +1 -1
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/kotlin/plugin.py +82 -3
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/extractor/extract.php +11 -1
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/plugin.py +44 -6
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/plugin.py +22 -3
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/plugin.py +52 -1
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/extract.mjs +46 -2
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6/cg_code_graph.egg-info}/PKG-INFO +1 -1
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph.egg-info/SOURCES.txt +2 -0
- cg_code_graph-0.23.6/tests/test_issue_212_langs.py +165 -0
- cg_code_graph-0.23.6/tests/test_issue_218.py +107 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/LICENSE +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/MANIFEST.in +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/README.md +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/cli.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/indexer.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/install_rules.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/mcp_graphs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/mcp_server.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/platforms.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/query.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/update_check.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/pyproject.toml +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/setup.cfg +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_affected.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_astro.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_coverage.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_dead_wrappers.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_env.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_explore.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_external.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_gating.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_generated.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_install_rules.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_201.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_202.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_204.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_205.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_206.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_208.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_210.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_211_used_at.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_212.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_issue_219.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_java.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_laravel_receiver_narrowing.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_laravel_route_paths.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_link_origin.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mcp_instructions.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_mcp_multi_graph.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_nuxt_i18n.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_nuxt_nitro.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_nuxt_side_dirs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_parity.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_php_http.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_plans.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_route_specs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_spring.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_surface.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_update_check.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_values.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_viz.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_watch.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/tests/test_workspace_link.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.23.
|
|
2
|
+
__version__ = "0.23.6"
|
|
@@ -305,6 +305,9 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
305
305
|
self.calls: list[tuple] = []
|
|
306
306
|
self.unresolved_calls: list[tuple] = [] # (owner_id, name, receiver, line, file obj, decl)
|
|
307
307
|
self.call_branch: dict = {} # (owner_id, line, name) -> {branch, branch_line} (#88)
|
|
308
|
+
self.call_default: dict = {} # (owner_id, line, name) -> parameter whose default holds the call (#212)
|
|
309
|
+
self.call_args: dict = {} # (owner_id, line, name) -> (positional count, named labels, trailing lambda)
|
|
310
|
+
self.fn_params: dict = {} # function id -> [(name, has default, function type)]
|
|
308
311
|
# properties with a custom accessor, `by lazy` or a delegate are nodes (#89); kept out of by_name / members so
|
|
309
312
|
# a call `x()` never binds to one
|
|
310
313
|
self.props: dict[str, dict] = {} # decl id -> {"property", "accessors"}
|
|
@@ -599,11 +602,14 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
599
602
|
fq = f"{owner}.{nm}" if owner else nm
|
|
600
603
|
kind = "method" if cls else "function"
|
|
601
604
|
params = next((d for d in c.children if d.type == "function_value_parameters"), None)
|
|
605
|
+
fparams = self._param_defaults(params)
|
|
602
606
|
dc = Decl(f"{kind}:{fq}{self._variant(kf, mods)}", kind, nm, fq, kf.rel, c.start_point[0] + 1,
|
|
603
607
|
c.end_point[0] + 1, cls.fqn if cls else None, [], anns, mods, recv,
|
|
604
608
|
self._params(params) if params is not None else {}, kf.test, self._name_line(c),
|
|
605
609
|
slots=self._fn_slots(params))
|
|
606
610
|
self._local_types(c, dc.types)
|
|
611
|
+
if any(dflt for _n, dflt, _f in fparams):
|
|
612
|
+
self.fn_params[dc.id] = fparams
|
|
607
613
|
self._add_decl(dc, kind)
|
|
608
614
|
self._local_fns(c, kf, dc)
|
|
609
615
|
elif ty == "enum_entry" and cls is not None:
|
|
@@ -1161,12 +1167,77 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
1161
1167
|
if typ:
|
|
1162
1168
|
self.navs.append((owner, None, typ, kf.rel, line))
|
|
1163
1169
|
self.calls.append((owner, name, rtext, line, kf, decl, self._accessor(c) if owner in self.props else None))
|
|
1170
|
+
dp = self._default_param(c)
|
|
1171
|
+
if dp:
|
|
1172
|
+
self.call_default[(owner, line, name)] = dp
|
|
1173
|
+
if args is not None:
|
|
1174
|
+
vas = [x for x in args.children if x.type == "value_argument"]
|
|
1175
|
+
named = {self.t(x.children[0]) for x in vas if any(k.type == "=" for k in x.children) and x.children}
|
|
1176
|
+
spread = any(self.t(x).lstrip().startswith("*") for x in vas)
|
|
1177
|
+
self.call_args[(owner, line, name)] = (None if spread else len(vas) - len(named), named, lam is not None)
|
|
1178
|
+
elif lam is not None:
|
|
1179
|
+
self.call_args[(owner, line, name)] = (0, set(), True)
|
|
1164
1180
|
if name[:1].isupper(): # a constructor or a composable: its branch (#88)
|
|
1165
1181
|
br = self._branch(c)
|
|
1166
1182
|
if br:
|
|
1167
1183
|
self.call_branch[(owner, line, name)] = br
|
|
1168
1184
|
return False
|
|
1169
1185
|
|
|
1186
|
+
def _param_defaults(self, fvp) -> list:
|
|
1187
|
+
"""[(name, has a default value, function-typed)] per value parameter of a `function_value_parameters` node."""
|
|
1188
|
+
out = []
|
|
1189
|
+
kids = list(fvp.children) if fvp is not None else []
|
|
1190
|
+
for i, p in enumerate(kids):
|
|
1191
|
+
if p.type != "parameter":
|
|
1192
|
+
continue
|
|
1193
|
+
ids = [x for x in p.children if x.type == "identifier"]
|
|
1194
|
+
if not ids:
|
|
1195
|
+
continue
|
|
1196
|
+
ft = any(x.type == "function_type" or (x.type == "nullable_type" and "->" in self.t(x)) for x in p.children)
|
|
1197
|
+
out.append((self.t(ids[0]), i + 1 < len(kids) and kids[i + 1].type == "=", ft))
|
|
1198
|
+
return out
|
|
1199
|
+
|
|
1200
|
+
def _default_param(self, c) -> str | None:
|
|
1201
|
+
"""The parameter whose default value holds call `c` (`fun render(gamut: Int = currentGamut())`), else None."""
|
|
1202
|
+
x = c
|
|
1203
|
+
while x is not None and x.parent is not None:
|
|
1204
|
+
p = x.parent
|
|
1205
|
+
if p.type == "function_value_parameters":
|
|
1206
|
+
prev = x.prev_sibling
|
|
1207
|
+
if prev is None or prev.type != "=":
|
|
1208
|
+
return None
|
|
1209
|
+
par = prev.prev_sibling
|
|
1210
|
+
ids = [y for y in par.children if y.type == "identifier"] if par is not None and par.type == "parameter" else []
|
|
1211
|
+
return self.t(ids[0]) if ids else None
|
|
1212
|
+
if p.type in ("function_declaration", "lambda_literal", "anonymous_function", "class_body", "function_body"):
|
|
1213
|
+
return None
|
|
1214
|
+
x = p
|
|
1215
|
+
return None
|
|
1216
|
+
|
|
1217
|
+
def _omitted_defaults(self):
|
|
1218
|
+
"""A call that leaves out a defaulted argument runs the default: an edge from the caller to what the default
|
|
1219
|
+
calls, at the call site, with `omits_default` and `default_of` (#212). A call that passes it gets none."""
|
|
1220
|
+
if not self._default_edges:
|
|
1221
|
+
return
|
|
1222
|
+
n = 0
|
|
1223
|
+
for owner, tid, rel, line, key in self._default_sites:
|
|
1224
|
+
defs = self._default_edges.get(tid)
|
|
1225
|
+
params = self.fn_params.get(tid)
|
|
1226
|
+
ca = self.call_args.get(key, (0, set(), False))
|
|
1227
|
+
if not defs or not params or ca[0] is None:
|
|
1228
|
+
continue
|
|
1229
|
+
pos, named, trailing = ca
|
|
1230
|
+
given = {nm for nm, _d, _f in params[:pos]} | named
|
|
1231
|
+
if trailing and params[-1][2]:
|
|
1232
|
+
given.add(params[-1][0])
|
|
1233
|
+
left = {nm for nm, dflt, _f in params if dflt and nm not in given}
|
|
1234
|
+
for label, callee, kind in defs:
|
|
1235
|
+
if label in left and callee != owner:
|
|
1236
|
+
self.b.add_edge(owner, callee, kind, rel, line, HEURISTIC, omits_default=label, default_of=tid)
|
|
1237
|
+
n += 1
|
|
1238
|
+
if n:
|
|
1239
|
+
self.st["default_argument_sites"] = n
|
|
1240
|
+
|
|
1170
1241
|
def _branch(self, c) -> dict:
|
|
1171
1242
|
"""The innermost `if` / `else` / `when` entry around a construction or a composable call inside its function
|
|
1172
1243
|
(#88): attrs.branch (`if (loading)`, `else of if (loading)`, `when Tab.Home`, `else of when (tab)`) and
|
|
@@ -1525,6 +1596,7 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
1525
1596
|
return []
|
|
1526
1597
|
|
|
1527
1598
|
def _resolve_calls(self):
|
|
1599
|
+
self._default_edges, self._default_sites = defaultdict(list), []
|
|
1528
1600
|
for owner, name, recv, line, kf, decl, acc in self.calls:
|
|
1529
1601
|
self._data_access(owner, name, recv, line, kf, decl)
|
|
1530
1602
|
self._how = self._recv = None
|
|
@@ -1543,17 +1615,24 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
1543
1615
|
how["candidates"] = len(targets)
|
|
1544
1616
|
self.st["call_candidate_edges"] += len(targets)
|
|
1545
1617
|
br = self.call_branch.get((owner, line, name), {})
|
|
1618
|
+
dp = self.call_default.get((owner, line, name))
|
|
1619
|
+
da = {"default_arg": dp} if dp else {}
|
|
1546
1620
|
for t in targets[:MAX_CANDIDATES if self._how == "candidate" else 3]:
|
|
1547
1621
|
if t.kind == "class":
|
|
1548
|
-
self.b.add_edge(owner, t.id, "INSTANTIATES", kf.rel, line, HEURISTIC, **br)
|
|
1622
|
+
self.b.add_edge(owner, t.id, "INSTANTIATES", kf.rel, line, HEURISTIC, **br, **da)
|
|
1549
1623
|
ctor = [m for m in self.members.get(t.fqn, {}).get("init", [])]
|
|
1550
1624
|
self.b.add_edge(owner, t.id, "USES_TYPE", kf.rel, line, HEURISTIC, how="constructor call")
|
|
1551
1625
|
for m in ctor:
|
|
1552
|
-
self.b.add_edge(owner, m.id, "CALLS", kf.rel, line, HEURISTIC)
|
|
1626
|
+
self.b.add_edge(owner, m.id, "CALLS", kf.rel, line, HEURISTIC, **da)
|
|
1553
1627
|
else:
|
|
1554
1628
|
composable = br and any(a[0] == "Composable" for a in t.annotations)
|
|
1555
|
-
self.b.add_edge(owner, t.id, "CALLS", kf.rel, line, HEURISTIC, **how, **(br if composable else {}))
|
|
1629
|
+
self.b.add_edge(owner, t.id, "CALLS", kf.rel, line, HEURISTIC, **how, **(br if composable else {}), **da)
|
|
1630
|
+
if self._how != "candidate":
|
|
1631
|
+
self._default_sites.append((owner, t.id, kf.rel, line, (owner, line, name)))
|
|
1632
|
+
if dp:
|
|
1633
|
+
self._default_edges[owner].append((dp, t.id, "INSTANTIATES" if t.kind == "class" else "CALLS"))
|
|
1556
1634
|
self.st["calls_resolved"] += 1
|
|
1635
|
+
self._omitted_defaults()
|
|
1557
1636
|
self._resolve_reads()
|
|
1558
1637
|
self._resolve_fields()
|
|
1559
1638
|
self._resolve_copies()
|
{cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/php/extractor/extract.php
RENAMED
|
@@ -169,6 +169,7 @@ function argsDesc(array $args, Ctx $c, int $depth = 0): array {
|
|
|
169
169
|
if (!($a instanceof Node\Arg)) { $o[] = ['k' => 'variadic']; continue; }
|
|
170
170
|
$d = desc($a->value, $c, $depth);
|
|
171
171
|
if ($a->name) $d['named'] = $a->name->toString();
|
|
172
|
+
if ($a->unpack) $d['unpack'] = true;
|
|
172
173
|
$o[] = $d;
|
|
173
174
|
if ($i > 12) break;
|
|
174
175
|
}
|
|
@@ -328,7 +329,8 @@ function funcLike($fn, Ctx $c, \PhpParser\NameContext $nc, ?string $doc): array
|
|
|
328
329
|
$pn = ($p->var instanceof Expr\Variable && is_string($p->var->name)) ? $p->var->name : '?';
|
|
329
330
|
$ts = typeList($p->type);
|
|
330
331
|
if (!$ts && isset($docParams[$pn])) $ts = $docParams[$pn];
|
|
331
|
-
$params[] = ['name' => $pn, 'types' => $ts, 'promoted' => $p->flags !== 0, 'line' => $p->getStartLine()]
|
|
332
|
+
$params[] = ['name' => $pn, 'types' => $ts, 'promoted' => $p->flags !== 0, 'line' => $p->getStartLine()]
|
|
333
|
+
+ ($p->default !== null ? ['default' => true] : []) + ($p->variadic ? ['variadic' => true] : []);
|
|
332
334
|
}
|
|
333
335
|
$returns = typeList($fn->returnType ?? null);
|
|
334
336
|
$nullable = ($fn->returnType ?? null) instanceof Node\NullableType
|
|
@@ -339,6 +341,14 @@ function funcLike($fn, Ctx $c, \PhpParser\NameContext $nc, ?string $doc): array
|
|
|
339
341
|
if (isset($fn->stmts) && $fn->stmts !== null) walk($fn->stmts, $c, $nc);
|
|
340
342
|
if ($fn instanceof Expr\ArrowFunction) walk($fn->expr, $c, $nc);
|
|
341
343
|
$skel = (isset($fn->stmts) && $fn->stmts !== null) ? skelStmts($fn->stmts, $c) : [];
|
|
344
|
+
// a parameter default (`Clock $clock = new SystemClock()`, PHP 8.1) runs on each call that leaves the argument
|
|
345
|
+
// out: its facts come last, marked with the parameter (#212)
|
|
346
|
+
foreach ($fn->params as $p) {
|
|
347
|
+
if ($p->default === null || !($p->var instanceof Expr\Variable) || !is_string($p->var->name)) continue;
|
|
348
|
+
$lo = count($c->facts);
|
|
349
|
+
walk($p->default, $c, $nc);
|
|
350
|
+
for ($i = $lo; $i < count($c->facts); $i++) $c->facts[$i]['default_arg'] = $p->var->name;
|
|
351
|
+
}
|
|
342
352
|
return ['params' => $params, 'returns' => $returns, 'returns_nullable' => $nullable, 'facts' => $c->facts, 'skel' => $skel];
|
|
343
353
|
}
|
|
344
354
|
|
|
@@ -509,6 +509,7 @@ class PhpProgram:
|
|
|
509
509
|
return self.b.has(fn.id)
|
|
510
510
|
|
|
511
511
|
def emit_references(self):
|
|
512
|
+
self._dflt_edges = defaultdict(list) # function id -> [(parameter, callee, kind)] of its defaults (#212)
|
|
512
513
|
self._emit_refs(self.all_funcs, self.fact_handlers)
|
|
513
514
|
# test code: calls / instantiations / class refs plus the test-only handlers; framework handlers (columns,
|
|
514
515
|
# bindings, schedules, listeners...) never run on tests, so a test cannot add facts to the application graph
|
|
@@ -516,21 +517,30 @@ class PhpProgram:
|
|
|
516
517
|
|
|
517
518
|
def _emit_refs(self, funcs, handlers):
|
|
518
519
|
b = self.b
|
|
520
|
+
self._dflt_sites = []
|
|
521
|
+
if not hasattr(self, "_dflt_edges"):
|
|
522
|
+
self._dflt_edges = defaultdict(list)
|
|
519
523
|
for fn in funcs:
|
|
520
524
|
ctx = ResolveCtx(self, fn)
|
|
521
525
|
for i, f in enumerate(fn.facts):
|
|
522
526
|
b.current_gate = fn.dead.get(i)
|
|
523
527
|
t = f["t"]
|
|
524
528
|
line = f.get("line")
|
|
529
|
+
da = {"default_arg": f["default_arg"]} if f.get("default_arg") else {}
|
|
525
530
|
if t == "call":
|
|
526
|
-
self._emit_call(fn, f, ctx)
|
|
531
|
+
self._emit_call(fn, f, ctx, da)
|
|
527
532
|
elif t == "new" and f.get("class"):
|
|
528
533
|
c = self.cls(f["class"])
|
|
529
534
|
if c:
|
|
530
|
-
b.add_edge(fn.id, f"{c.kind}:{c.fqcn}", "INSTANTIATES", fn.file, line, EXACT)
|
|
535
|
+
b.add_edge(fn.id, f"{c.kind}:{c.fqcn}", "INSTANTIATES", fn.file, line, EXACT, **da)
|
|
531
536
|
ctor = self.find_method(c.fqcn, "__construct")
|
|
537
|
+
if da:
|
|
538
|
+
self._dflt_edges[fn.id].append((da["default_arg"], f"{c.kind}:{c.fqcn}", "INSTANTIATES"))
|
|
532
539
|
if ctor:
|
|
533
|
-
b.add_edge(fn.id, ctor.id, "CALLS", fn.file, line, EXACT)
|
|
540
|
+
b.add_edge(fn.id, ctor.id, "CALLS", fn.file, line, EXACT, **da)
|
|
541
|
+
self._dflt_sites.append((fn, ctor, f))
|
|
542
|
+
if da:
|
|
543
|
+
self._dflt_edges[fn.id].append((da["default_arg"], ctor.id, "CALLS"))
|
|
534
544
|
elif t in ("fetch", "pwrite"):
|
|
535
545
|
self._emit_prop(fn, f, ctx)
|
|
536
546
|
elif t == "classref" and f.get("class"):
|
|
@@ -543,6 +553,30 @@ class PhpProgram:
|
|
|
543
553
|
for h in handlers:
|
|
544
554
|
h(self, fn, f, ctx)
|
|
545
555
|
b.current_gate = None
|
|
556
|
+
self._omitted_defaults()
|
|
557
|
+
|
|
558
|
+
def _omitted_defaults(self):
|
|
559
|
+
"""A call that leaves out a defaulted argument runs the default (`Clock $clock = new SystemClock()`): an edge
|
|
560
|
+
from the caller to what the default calls, at the call site, with `omits_default` and `default_of` (#212)."""
|
|
561
|
+
n = 0
|
|
562
|
+
for fn, m, f in self._dflt_sites:
|
|
563
|
+
defs = self._dflt_edges.get(m.id)
|
|
564
|
+
if not defs:
|
|
565
|
+
continue
|
|
566
|
+
args = f.get("args") or []
|
|
567
|
+
if any(a.get("k") == "variadic" or a.get("unpack") for a in args) or len(args) > 13:
|
|
568
|
+
continue
|
|
569
|
+
named = {a["named"] for a in args if a.get("named")}
|
|
570
|
+
pos = sum(1 for a in args if not a.get("named"))
|
|
571
|
+
params = m.params or []
|
|
572
|
+
given = {p["name"] for p in params[:pos]} | named
|
|
573
|
+
left = {p["name"] for p in params if p.get("default") and p["name"] not in given}
|
|
574
|
+
for label, dst, kind in defs:
|
|
575
|
+
if label in left and dst != fn.id:
|
|
576
|
+
self.b.add_edge(fn.id, dst, kind, fn.file, f.get("line"), RESOLVED, omits_default=label, default_of=m.id)
|
|
577
|
+
n += 1
|
|
578
|
+
if n:
|
|
579
|
+
self.stats["default_argument_sites"] += n
|
|
546
580
|
|
|
547
581
|
def call_targets(self, fn: PhpFunc, f: dict, ctx: ResolveCtx) -> tuple[list, str]:
|
|
548
582
|
"""Resolve a call fact to (targets [(PhpFunc, confidence)], status)."""
|
|
@@ -579,7 +613,7 @@ class PhpProgram:
|
|
|
579
613
|
return [(cands[0], HEURISTIC)], "heuristic"
|
|
580
614
|
return [], "unresolved_method"
|
|
581
615
|
|
|
582
|
-
def _emit_call(self, fn: PhpFunc, f: dict, ctx: ResolveCtx):
|
|
616
|
+
def _emit_call(self, fn: PhpFunc, f: dict, ctx: ResolveCtx, da: dict | None = None):
|
|
583
617
|
b, line, kind = self.b, f.get("line"), f["kind"]
|
|
584
618
|
self.stats[f"calls_{kind}"] += 1
|
|
585
619
|
self.last_recv = []
|
|
@@ -594,12 +628,16 @@ class PhpProgram:
|
|
|
594
628
|
own = self.cls(fn.cls)
|
|
595
629
|
if own and not self.last_recv:
|
|
596
630
|
self.last_recv = [f"{own.kind}:{own.fqcn}"]
|
|
631
|
+
da = da or {}
|
|
597
632
|
for m, conf in targets:
|
|
598
633
|
if conf == HEURISTIC:
|
|
599
|
-
b.add_edge(fn.id, m.id, "CALLS", fn.file, line, HEURISTIC, via="unique-method-name")
|
|
634
|
+
b.add_edge(fn.id, m.id, "CALLS", fn.file, line, HEURISTIC, via="unique-method-name", **da)
|
|
600
635
|
else:
|
|
601
636
|
b.add_edge(fn.id, m.id, "CALLS", fn.file, line, conf,
|
|
602
|
-
**({"recv": sorted(set(self.last_recv))} if self.last_recv else {}), **scope)
|
|
637
|
+
**({"recv": sorted(set(self.last_recv))} if self.last_recv else {}), **scope, **da)
|
|
638
|
+
self._dflt_sites.append((fn, m, f))
|
|
639
|
+
if da:
|
|
640
|
+
self._dflt_edges[fn.id].append((da["default_arg"], m.id, "CALLS"))
|
|
603
641
|
if status == "resolved":
|
|
604
642
|
self.stats["calls_resolved"] += 1
|
|
605
643
|
elif status == "heuristic":
|
|
@@ -58,6 +58,23 @@ STOP_METHODS = {"get", "set", "save", "delete", "update", "filter", "all", "item
|
|
|
58
58
|
ASYNC_WRAPPERS = {"sync_to_async", "async_to_sync", "database_sync_to_async", "run_sync"}
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
def _default_call_params(fn) -> dict[int, str]:
|
|
62
|
+
"""id(call node) -> parameter name, for calls inside a parameter default (`def render(gamut=current_gamut())`).
|
|
63
|
+
Python evaluates a default once, when the `def` runs, so only the declaration edge is marked (#212)."""
|
|
64
|
+
a = getattr(fn, "args", None)
|
|
65
|
+
if a is None:
|
|
66
|
+
return {}
|
|
67
|
+
pos = list(a.posonlyargs) + list(a.args)
|
|
68
|
+
pairs = list(zip(pos[len(pos) - len(a.defaults):], a.defaults)) + \
|
|
69
|
+
[(k, d) for k, d in zip(a.kwonlyargs, a.kw_defaults) if d is not None]
|
|
70
|
+
out = {}
|
|
71
|
+
for arg, d in pairs:
|
|
72
|
+
for n in ast.walk(d):
|
|
73
|
+
if isinstance(n, ast.Call):
|
|
74
|
+
out[id(n)] = arg.arg
|
|
75
|
+
return out
|
|
76
|
+
|
|
77
|
+
|
|
61
78
|
def _recv_attr(prog, call, tgt) -> dict:
|
|
62
79
|
"""{"recv": [class ids]} for a call on a receiver whose class inherits the target method, else {}."""
|
|
63
80
|
r = prog.recv.get((id(call.func), id(tgt)))
|
|
@@ -1460,16 +1477,18 @@ class PythonPlugin(LanguagePlugin):
|
|
|
1460
1477
|
calls: list = []
|
|
1461
1478
|
body = {id(x) for x in f.node.body}
|
|
1462
1479
|
rp.scan(f.id, [(c, f.node, id(c) in body) for c in ast.iter_child_nodes(f.node)], ctx, f.file, False, calls)
|
|
1480
|
+
dflt = _default_call_params(f.node)
|
|
1463
1481
|
for sub in calls:
|
|
1482
|
+
da = {"default_arg": dflt[id(sub)]} if id(sub) in dflt else {}
|
|
1464
1483
|
for tgt, conf, via in prog.resolve_call(sub, ctx):
|
|
1465
1484
|
if isinstance(tgt, ClassInfo):
|
|
1466
|
-
b.add_edge(f.id, tgt.id, "INSTANTIATES", f.file, sub.lineno, conf)
|
|
1485
|
+
b.add_edge(f.id, tgt.id, "INSTANTIATES", f.file, sub.lineno, conf, **da)
|
|
1467
1486
|
init = prog.find_method(tgt, "__init__")
|
|
1468
1487
|
if init:
|
|
1469
|
-
b.add_edge(f.id, init.id, "CALLS", f.file, sub.lineno, conf, via="constructor")
|
|
1488
|
+
b.add_edge(f.id, init.id, "CALLS", f.file, sub.lineno, conf, via="constructor", **da)
|
|
1470
1489
|
else:
|
|
1471
1490
|
b.add_edge(f.id, tgt.id, "CALLS", f.file, sub.lineno, conf, **({"via": via} if via else {}),
|
|
1472
|
-
**_recv_attr(prog, sub, tgt))
|
|
1491
|
+
**_recv_attr(prog, sub, tgt), **da)
|
|
1473
1492
|
conf_ct[conf] += 1
|
|
1474
1493
|
n_env += self.env_reads(prog, b, f.id, f.node, ctx)
|
|
1475
1494
|
for m in prog.modules.values():
|
|
@@ -177,6 +177,12 @@ LOCAL_DECL = re.compile(
|
|
|
177
177
|
r"\b(?:let|var)\s+(\w+)\s*(?::\s*(?:some\s+|any\s+)?([A-Z][\w.]*))?\s*(?:=\s*(?:try\s*[?!]?\s+)?(?:await\s+)?"
|
|
178
178
|
r"(?:([A-Z]\w*)\s*(?:<[^=\n]*?>)?\s*\(|((?:true|false)\b|-?\d+\.\d+\b|-?\d+\b|\"))?)?")
|
|
179
179
|
|
|
180
|
+
# `let r = makeBridge()`, `let r = try await ShelfBridge.make()`: a local initialised from a function's result; typed by
|
|
181
|
+
# that function's declared return type when it is a project type (#218)
|
|
182
|
+
LOCAL_CALL = re.compile(r"\b(?:let|var)\s+(\w+)\s*=\s*(?:try\s*[?!]?\s+)?(?:await\s+)?(?:([A-Z]\w*)\s*\.\s*)?([a-z_]\w*)\s*\(")
|
|
183
|
+
|
|
184
|
+
PRIVATE_MODS = frozenset({"private", "fileprivate"})
|
|
185
|
+
|
|
180
186
|
|
|
181
187
|
def _static(d) -> bool:
|
|
182
188
|
return bool(STATIC_MODS & d.modifiers)
|
|
@@ -502,6 +508,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
502
508
|
self.globals_: dict[str, list] = {} # file-level constant name -> [(id, file, test, private)]
|
|
503
509
|
self.prop_refs: list[tuple] = [] # (owner, name, receiver | None, line, sf, decl, write)
|
|
504
510
|
self.sigs: dict[str, list] = defaultdict(list) # function / init node id -> [((label, optional), ...)]
|
|
511
|
+
self._multi_file: set[str] = set() # nodes shared by same-name declarations in several files or of mixed access
|
|
512
|
+
self.rets: dict[str, str] = {} # function / method node id -> declared return type name ('' when overloads differ)
|
|
505
513
|
self.http: list[dict] = []
|
|
506
514
|
self.navs: list[tuple] = [] # (owner, view type name, how, file, line)
|
|
507
515
|
# navigationDestination(for: T.self) { switch d { case .x: V() } }: T -> case (None: any) -> view names (#68)
|
|
@@ -838,15 +846,27 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
838
846
|
# second carries `~static` / `~instance` (like `~2` for a second TypeScript declaration);
|
|
839
847
|
# overloads of one static-ness still share a node
|
|
840
848
|
did = f"{did}~{'static' if STATIC_MODS & mods else 'instance'}"
|
|
849
|
+
ret = None
|
|
850
|
+
for i, x in enumerate(kids[:-1]):
|
|
851
|
+
if x.type == "->":
|
|
852
|
+
rm = re.fullmatch(r"\s*([A-Z][\w.]*)\s*[?!]?\s*", self.t(kids[i + 1]))
|
|
853
|
+
ret = rm.group(1) if rm else ""
|
|
854
|
+
break
|
|
841
855
|
if did in self.decls:
|
|
842
856
|
prev = self._prev(did, cls)
|
|
843
857
|
if not self._branch_variant(prev, sf, c, cls): # overloads share one node
|
|
858
|
+
if self.rets.get(prev.id, ret) != ret:
|
|
859
|
+
self.rets[prev.id] = ""
|
|
860
|
+
if sf.rel != prev.file or bool(mods & PRIVATE_MODS) != bool(prev.modifiers & PRIVATE_MODS):
|
|
861
|
+
self._multi_file.add(prev.id) # one node for declarations in several files / of mixed access
|
|
844
862
|
prev.types.update(params)
|
|
845
863
|
self.sigs[did].append(tuple(sig))
|
|
846
864
|
self._overloads[(sf.rel, c.start_point[0] + 1, nm)] = prev # its body's calls are prev's
|
|
847
865
|
continue
|
|
848
866
|
did = f"{did}@{c.start_point[0] + 1}" # per-platform definition (#if os)
|
|
849
867
|
self.sigs[did].append(tuple(sig))
|
|
868
|
+
if ret is not None:
|
|
869
|
+
self.rets[did] = ret
|
|
850
870
|
d = Decl(did, kind, nm, fq, sf.rel, c.start_point[0] + 1, c.end_point[0] + 1,
|
|
851
871
|
cls.fqn if cls else None, [], attrs, mods, params, sf.test, owner=self._owner(cls))
|
|
852
872
|
self._add(d, "protocol requirement" if ty == "protocol_function_declaration" else kind)
|
|
@@ -2475,6 +2495,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2475
2495
|
found.append((m.start(), nm, tn))
|
|
2476
2496
|
for m in CLOSURE_PARAM.finditer(txt): # `Path { p in p.close() }`: p is a Path
|
|
2477
2497
|
found.append((m.start(), m.group(2), CLOSURE_PARAM_TYPES[m.group(1)]))
|
|
2498
|
+
for m in LOCAL_CALL.finditer(txt):
|
|
2499
|
+
found.append((m.start(), m.group(1), self._returned(m.group(2), m.group(3))))
|
|
2478
2500
|
for pos, nm, tn in sorted(found, key=lambda x: x[0]):
|
|
2479
2501
|
out[nm].append((decl.line + txt.count("\n", 0, pos), tn))
|
|
2480
2502
|
cache[key] = out
|
|
@@ -2484,6 +2506,25 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2484
2506
|
best = tn
|
|
2485
2507
|
return best
|
|
2486
2508
|
|
|
2509
|
+
def _returned(self, tname: str | None, fname: str) -> str | None:
|
|
2510
|
+
"""The project type a call's result has: the declared return type of the one free function `fname` (of the
|
|
2511
|
+
static `tname.fname` when qualified), when every declaration of it agrees and it is a project type (#218)."""
|
|
2512
|
+
if tname:
|
|
2513
|
+
t = self._type(tname)
|
|
2514
|
+
if t is None or "extension-only" in t.modifiers:
|
|
2515
|
+
return None
|
|
2516
|
+
ds = [d for d in self._member(t, fname) if d.kind == "method" and _static(d)]
|
|
2517
|
+
else:
|
|
2518
|
+
ds = [d for d in self.by_name.get(fname, []) if d.kind == "function"]
|
|
2519
|
+
rets = {self.rets.get(d.id) for d in ds}
|
|
2520
|
+
if len(rets) != 1:
|
|
2521
|
+
return None
|
|
2522
|
+
ret = next(iter(rets))
|
|
2523
|
+
if ret == "Self" and tname:
|
|
2524
|
+
ret = t.fqn
|
|
2525
|
+
rt = self._type(ret) if ret else None
|
|
2526
|
+
return rt.fqn if rt is not None and "extension-only" not in rt.modifiers else None
|
|
2527
|
+
|
|
2487
2528
|
def _recv_type(self, recv: str, decl: Decl | None, cls: Decl | None) -> tuple[str, str | None]:
|
|
2488
2529
|
"""What a receiver expression is: ("type", T) a value of project type T, ("meta", T) the project type T itself
|
|
2489
2530
|
(static members), ("sdk", T | None) a value of an SDK type (T when known; modifier chains on SDK views,
|
|
@@ -2557,7 +2598,17 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2557
2598
|
return state
|
|
2558
2599
|
|
|
2559
2600
|
def _fitting(self, ds: list, labels: tuple, trailing: bool) -> list:
|
|
2560
|
-
return [d for d in ds if self._fits(d.id, labels, trailing) and self._sees(d, True)]
|
|
2601
|
+
return [d for d in ds if self._fits(d.id, labels, trailing) and self._file_visible(d) and self._sees(d, True)]
|
|
2602
|
+
|
|
2603
|
+
def _file_visible(self, d: Decl) -> bool:
|
|
2604
|
+
"""A `private` / `fileprivate` member, or a member of such a type, is not visible from another file (#218)."""
|
|
2605
|
+
at = getattr(self, "_at", None)
|
|
2606
|
+
if at is None or at[0] is None or d.file == at[0].rel or d.id in self._multi_file:
|
|
2607
|
+
return True
|
|
2608
|
+
if d.modifiers & PRIVATE_MODS:
|
|
2609
|
+
return False
|
|
2610
|
+
t = self.types.get(d.cls) if d.cls else None
|
|
2611
|
+
return not (t is not None and t.file == d.file and t.id not in self._multi_file and t.modifiers & PRIVATE_MODS)
|
|
2561
2612
|
|
|
2562
2613
|
def _dispatch_visible(self, d: Decl, caller: str, depth: int = 0) -> bool:
|
|
2563
2614
|
"""A member of a type outside the caller's modules that overrides or implements a member of a supertype the
|
{cg_code_graph-0.23.5 → cg_code_graph-0.23.6}/cg_code_graph/plugins/ts/extractor/extract.mjs
RENAMED
|
@@ -1980,6 +1980,7 @@ function addEdge(src, dst, kind, file, line, conf, attrs) {
|
|
|
1980
1980
|
edges.push({ src, dst, kind, file, line, confidence: conf, attrs: attrs || undefined })
|
|
1981
1981
|
}
|
|
1982
1982
|
const callSites = []
|
|
1983
|
+
const defaultCalls = [] // calls inside parameter defaults (#212)
|
|
1983
1984
|
|
|
1984
1985
|
// ---------- class hierarchy: EXTENDS / IMPLEMENTS between project classes, OVERRIDDEN_BY base method -> override ----------
|
|
1985
1986
|
// (a call on a base-typed value resolves to the base declaration; the override edge lets impact / tests reach the
|
|
@@ -1988,7 +1989,9 @@ const callSites = []
|
|
|
1988
1989
|
const memberNode = (cls, name) => {
|
|
1989
1990
|
for (const m of cls.members || []) {
|
|
1990
1991
|
if (m.name && (ts.isIdentifier(m.name) || ts.isPrivateIdentifier(m.name) || ts.isStringLiteralLike(m.name)) && m.name.text === name
|
|
1991
|
-
&& (ts.isMethodDeclaration(m) || ts.isGetAccessor(m) || ts.isSetAccessor(m) || ts.isPropertyDeclaration(m)) && declId.has(m)
|
|
1992
|
+
&& (ts.isMethodDeclaration(m) || ts.isGetAccessor(m) || ts.isSetAccessor(m) || ts.isPropertyDeclaration(m)) && declId.has(m)
|
|
1993
|
+
// an instance method never overrides a static one (`static create(Service, ctx)` on a base service, #199)
|
|
1994
|
+
&& !(m.modifiers && m.modifiers.some(x => x.kind === ts.SyntaxKind.StaticKeyword))) return declId.get(m)
|
|
1992
1995
|
}
|
|
1993
1996
|
return null
|
|
1994
1997
|
}
|
|
@@ -3278,10 +3281,29 @@ function handleCall(node, cur, sf, r, encFn) {
|
|
|
3278
3281
|
if (kind === 'REFERENCES_TYPE') return
|
|
3279
3282
|
const recv = kind === 'CALLS' && ts.isPropertyAccessExpression(callee) ? receiverClasses(callee.expression, t.id) : null
|
|
3280
3283
|
const br = kind === 'INSTANTIATES' && !inTpl ? branchOf(node, sf) : null
|
|
3281
|
-
|
|
3284
|
+
const dp = defaultParamOf(node)
|
|
3285
|
+
if (dp) defaultCalls.push({ fid: cur, idx: dp.idx, name: dp.name, dst: t.id, kind, conf: t.conf })
|
|
3286
|
+
addEdge(cur, t.id, kind, r, line, t.conf, { via: t.via.length ? t.via : undefined, template: inTpl || undefined, recv: recv || undefined,
|
|
3287
|
+
default_arg: dp ? dp.name : undefined, ...(br || {}) })
|
|
3282
3288
|
callSites.push({ target: t.id, node, cur, r, line, encFn })
|
|
3283
3289
|
}
|
|
3284
3290
|
|
|
3291
|
+
// a call inside a parameter's default value (`function render(gamut = currentGamut())`): runs only when a call leaves
|
|
3292
|
+
// that argument out (#212). Returns the parameter's position and name, or null.
|
|
3293
|
+
function defaultParamOf(node) {
|
|
3294
|
+
let x = node
|
|
3295
|
+
while (x && x.parent) {
|
|
3296
|
+
const p = x.parent
|
|
3297
|
+
if (ts.isParameter(p)) {
|
|
3298
|
+
if (p.initializer !== x || !p.parent || !p.parent.parameters) return null
|
|
3299
|
+
return { idx: p.parent.parameters.indexOf(p), name: ts.isIdentifier(p.name) ? p.name.text : p.name.getText().slice(0, 40) }
|
|
3300
|
+
}
|
|
3301
|
+
if (ts.isFunctionLike(p) || ts.isClassLike(p) || ts.isSourceFile(p)) return null
|
|
3302
|
+
x = p
|
|
3303
|
+
}
|
|
3304
|
+
return null
|
|
3305
|
+
}
|
|
3306
|
+
|
|
3285
3307
|
// `b.run()` landing on `Base.run` (B inherits it): the receiver's project classes (attrs.recv), so `impact B.run` can
|
|
3286
3308
|
// keep only the calls whose receiver can be a B. Only for methods of classes / interfaces something extends or implements
|
|
3287
3309
|
var baseTypeIds = null // var: handleCall runs before this line is reached
|
|
@@ -3561,6 +3583,28 @@ for (const d of deferredParamSubs) {
|
|
|
3561
3583
|
if (deep) stats.realtime_subscriptions_wrapper_too_deep = (stats.realtime_subscriptions_wrapper_too_deep || 0) + 1
|
|
3562
3584
|
}
|
|
3563
3585
|
|
|
3586
|
+
// a call that leaves out a defaulted argument (or passes `undefined`) runs the default: an edge from the caller to what
|
|
3587
|
+
// the default calls, at the call site, with `omits_default` and `default_of` (#212)
|
|
3588
|
+
if (defaultCalls.length) {
|
|
3589
|
+
const byFn = new Map()
|
|
3590
|
+
for (const d of defaultCalls) { if (!byFn.has(d.fid)) byFn.set(d.fid, []); byFn.get(d.fid).push(d) }
|
|
3591
|
+
let n = 0
|
|
3592
|
+
for (const c of callSites) {
|
|
3593
|
+
const ds = byFn.get(c.target)
|
|
3594
|
+
if (!ds || !(ts.isCallExpression(c.node) || ts.isNewExpression(c.node))) continue
|
|
3595
|
+
const args = c.node.arguments || []
|
|
3596
|
+
if (args.some(a => ts.isSpreadElement(a))) continue
|
|
3597
|
+
for (const d of ds) {
|
|
3598
|
+
const a = args[d.idx]
|
|
3599
|
+
if (a && !(ts.isIdentifier(unwrap(a)) && unwrap(a).text === 'undefined')) continue
|
|
3600
|
+
if (d.dst === c.cur) continue
|
|
3601
|
+
addEdge(c.cur, d.dst, d.kind, c.r, c.line, d.conf === 'exact' ? 'resolved' : d.conf, { omits_default: d.name, default_of: c.target })
|
|
3602
|
+
n++
|
|
3603
|
+
}
|
|
3604
|
+
}
|
|
3605
|
+
if (n) stats.default_argument_sites = n
|
|
3606
|
+
}
|
|
3607
|
+
|
|
3564
3608
|
const httpFns = new Set(apiCalls.map(a => a.src))
|
|
3565
3609
|
for (const c of callSites) {
|
|
3566
3610
|
if (!httpFns.has(c.target) || !ts.isCallExpression(c.node)) continue
|
|
@@ -288,6 +288,8 @@ tests/test_issue_210.py
|
|
|
288
288
|
tests/test_issue_211.py
|
|
289
289
|
tests/test_issue_211_used_at.py
|
|
290
290
|
tests/test_issue_212.py
|
|
291
|
+
tests/test_issue_212_langs.py
|
|
292
|
+
tests/test_issue_218.py
|
|
291
293
|
tests/test_issue_219.py
|
|
292
294
|
tests/test_java.py
|
|
293
295
|
tests/test_java_exact.py
|