cg-code-graph 0.23.2__tar.gz → 0.23.3__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.2/cg_code_graph.egg-info → cg_code_graph-0.23.3}/PKG-INFO +2 -2
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/cli.py +2 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/mcp_server.py +34 -10
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/platforms.py +61 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/exact.py +8 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/plugin.py +51 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/query.py +66 -4
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3/cg_code_graph.egg-info}/PKG-INFO +2 -2
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph.egg-info/SOURCES.txt +3 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph.egg-info/requires.txt +1 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/pyproject.toml +1 -1
- cg_code_graph-0.23.3/tests/test_issue_201.py +137 -0
- cg_code_graph-0.23.3/tests/test_issue_204.py +79 -0
- cg_code_graph-0.23.3/tests/test_issue_212.py +82 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_binding.py +1 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_parse_errors.py +6 -1
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/LICENSE +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/MANIFEST.in +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/README.md +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/indexer.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/install_rules.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/mcp_graphs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/update_check.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/setup.cfg +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_affected.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_astro.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_coverage.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_dead_wrappers.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_env.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_explore.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_external.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_gating.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_generated.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_install_rules.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_202.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_205.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_206.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_208.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_210.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_issue_211_used_at.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_java.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_link_origin.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mcp_instructions.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_mcp_multi_graph.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_nuxt_i18n.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_nuxt_nitro.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_nuxt_side_dirs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_parity.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_php_http.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_plans.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_route_specs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_spring.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_surface.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_update_check.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_values.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_viz.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_watch.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.23.2 → cg_code_graph-0.23.3}/tests/test_workspace_link.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.23.
|
|
3
|
+
Version: 0.23.3
|
|
4
4
|
Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,7 @@ Requires-Dist: tree-sitter-c>=0.23
|
|
|
18
18
|
Requires-Dist: tree-sitter-cpp>=0.23
|
|
19
19
|
Requires-Dist: tree-sitter-kotlin>=1.0
|
|
20
20
|
Requires-Dist: tree-sitter-java>=0.23
|
|
21
|
-
Requires-Dist: tree-sitter-swift<0.
|
|
21
|
+
Requires-Dist: tree-sitter-swift<0.8,>=0.6
|
|
22
22
|
Provides-Extra: dev
|
|
23
23
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
24
24
|
Provides-Extra: watch
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.23.
|
|
2
|
+
__version__ = "0.23.3"
|
|
@@ -733,7 +733,8 @@ def main(argv=None):
|
|
|
733
733
|
print(Q.connections_line(res["connections"]))
|
|
734
734
|
if not res["callers"] and not res["entry_points"]:
|
|
735
735
|
print(Q.explain_no_callers(st, a.spec, res["targets"], a.min_confidence)); return
|
|
736
|
-
|
|
736
|
+
nc = res.get("callers_candidate") or 0
|
|
737
|
+
print(f"callers (transitive): {len(res['callers']) - nc}" + (f" (+{nc} candidate)" if nc else ""))
|
|
737
738
|
caller_names = _impact_labels(res["callers"], lambda c: c.get("fqn") or c["id"], lambda c: c.get("module") or c.get("kind"))
|
|
738
739
|
for c, nm in zip(res["callers"], caller_names):
|
|
739
740
|
loc = f" @ {c['file']}:{c['line']}" if Q.NATIVE_FILE_RE.search(c.get("file") or "") else ""
|
|
@@ -601,7 +601,9 @@ def impact(method: str, min_confidence: str = "heuristic", max_items: int = 60,
|
|
|
601
601
|
dropped_line = [f"not built for {pf}: {', '.join(short(t) for t in dropped[:6])}"] if pf and dropped else []
|
|
602
602
|
out = pline + dropped_line + [f"targets: {', '.join(short(t) for t in r['targets'][:5])}", *via_default, *Q.override_lines(r),
|
|
603
603
|
*([Q.connections_line(r["connections"])] if r.get("connections") else []),
|
|
604
|
-
f"transitive callers: {
|
|
604
|
+
f"transitive callers: {r.get('callers_resolved', len(r['callers']))}"
|
|
605
|
+
+ (f" (+{r['callers_candidate']} candidate)" if r.get("callers_candidate") else "")
|
|
606
|
+
+ f"; entry points: {len(r['entry_points'])}"]
|
|
605
607
|
if not r["callers"] and not r["entry_points"]:
|
|
606
608
|
return "\n".join(out + [Q.explain_no_callers(st, method, r["targets"], min_confidence)])
|
|
607
609
|
byk = defaultdict(list)
|
|
@@ -619,7 +621,7 @@ def impact(method: str, min_confidence: str = "heuristic", max_items: int = 60,
|
|
|
619
621
|
out.append(f" {lab}{Q.CANDIDATE_LABEL if e.get('candidate') else ''}{Q.platform_label(e)}{hop}")
|
|
620
622
|
bymod = defaultdict(list)
|
|
621
623
|
for c in r["callers"]:
|
|
622
|
-
bymod[
|
|
624
|
+
bymod[Q.caller_group(c)].append(c)
|
|
623
625
|
dup_lines = []
|
|
624
626
|
for mod in sorted(bymod):
|
|
625
627
|
cs = bymod[mod]
|
|
@@ -631,8 +633,10 @@ def impact(method: str, min_confidence: str = "heuristic", max_items: int = 60,
|
|
|
631
633
|
out.append("same name in one module: " + "; ".join(dup_lines))
|
|
632
634
|
mods = defaultdict(int)
|
|
633
635
|
for c in r["callers"]:
|
|
634
|
-
|
|
635
|
-
|
|
636
|
+
if not c.get("candidate"): # candidates are listed on their own below (#204)
|
|
637
|
+
mods[Q.caller_group(c)] += 1
|
|
638
|
+
if mods:
|
|
639
|
+
out.append("\ncallers by module: " + ", ".join(f"{m}×{c}" for m, c in sorted(mods.items(), key=lambda x: -x[1])))
|
|
636
640
|
gen = [c for c in r["callers"] if c.get("generated")]
|
|
637
641
|
if gen: # indexed with --include-generated: callers in files a generator writes
|
|
638
642
|
out.append(f"in generated / copied files ({len(gen)}): " + ", ".join(f"{short(c['id'])} [{c['generated']}]" for c in gen[:8])
|
|
@@ -648,8 +652,13 @@ def impact(method: str, min_confidence: str = "heuristic", max_items: int = 60,
|
|
|
648
652
|
for c in vo[:8]) + (f" …+{len(vo) - 8}" if len(vo) > 8 else ""))
|
|
649
653
|
cand = [c for c in r["callers"] if c.get("candidate")]
|
|
650
654
|
if cand or any(e.get("candidate") for e in r["entry_points"]): # reached through a candidate call edge (#83)
|
|
651
|
-
out.append(f"candidate callers ({len(cand)}): " + ", ".join(short(c["id"]) for c in cand[:12])
|
|
655
|
+
out.append(f"candidate callers ({len(cand)}): " + ", ".join(short(c["id"]) + Q.fanout_text(c) for c in cand[:12])
|
|
652
656
|
+ (f" …+{len(cand) - 12}" if len(cand) > 12 else "") + "\n" + Q.CANDIDATE_NOTE)
|
|
657
|
+
od = [c for c in r["callers"] if c.get("omits_default")]
|
|
658
|
+
if od: # calls that leave out a defaulted argument and so run its default (#212)
|
|
659
|
+
out.append(f"through an omitted default argument ({len(od)}): "
|
|
660
|
+
+ ", ".join(f"{short(c['id'])} ({c['omits_default']}: of {short(c.get('default_of'))})" for c in od[:8])
|
|
661
|
+
+ (f" …+{len(od) - 8}" if len(od) > 8 else ""))
|
|
653
662
|
vb = [c for c in r["callers"] if c.get("via_base")]
|
|
654
663
|
if vb: # calls the base declaration; the target is reached through the override
|
|
655
664
|
out.append(f"via base ({len(vb)}): " + ", ".join(f"{short(c['id'])} -> {c['via_base']}" for c in vb[:8])
|
|
@@ -702,12 +711,26 @@ def callers(symbol: str, min_confidence: str = "heuristic", limit: int = 60) ->
|
|
|
702
711
|
if not rows:
|
|
703
712
|
return head + f"\nno direct callers of {symbol!r} in indexed code (min_confidence={min_confidence}). try: impact() for " \
|
|
704
713
|
f"entry points, reaches() for every dependent over all edge kinds, node() for its other edges"
|
|
705
|
-
|
|
706
|
-
|
|
714
|
+
# one row per call site: a site linked to several per-platform definitions of the target is one site (#201)
|
|
715
|
+
seen, uniq = set(), []
|
|
716
|
+
for r in rows:
|
|
717
|
+
if (r["src"], r["kind"], r["file"], r["line"]) not in seen:
|
|
718
|
+
seen.add((r["src"], r["kind"], r["file"], r["line"]))
|
|
719
|
+
uniq.append(r)
|
|
720
|
+
rows = uniq
|
|
721
|
+
is_cand = [bool(r["attrs"] and '"binding": "candidate"' in r["attrs"]) for r in rows]
|
|
722
|
+
res = [r for r, cd in zip(rows, is_cand) if not cd]
|
|
723
|
+
cands = [r for r, cd in zip(rows, is_cand) if cd]
|
|
724
|
+
# selector-only candidates (receiver type unknown) are counted apart from resolved callers (#204)
|
|
725
|
+
out = [head, f"direct callers: {len({r['src'] for r in res})} ({len(res)} sites)"
|
|
726
|
+
+ (f"; candidate callers: {len({r['src'] for r in cands})} ({len(cands)} site{'' if len(cands) == 1 else 's'}, receiver type unknown)"
|
|
727
|
+
if cands else "")]
|
|
728
|
+
for r in (res + cands)[:limit]:
|
|
707
729
|
c = "" if r["confidence"] == "exact" else f" ~{r['confidence'][0]}"
|
|
708
730
|
k = "ref" if r["kind"] == "REFERENCES_FN" else r["kind"]
|
|
709
|
-
cand = Q.
|
|
710
|
-
out.append(f" {short(r['src'])} {k}@{at((r['file'] or '?') + ':' + str(r['line']))}{c}{cand}"
|
|
731
|
+
cand = Q.candidate_label(r["attrs"], r["dst"]) if r in cands else ""
|
|
732
|
+
out.append(f" {short(r['src'])} {k}@{at((r['file'] or '?') + ':' + str(r['line']))}{c}{cand}"
|
|
733
|
+
+ Q.omitted_default_label(r["attrs"]))
|
|
711
734
|
if len(rows) > limit:
|
|
712
735
|
out.append(f" … +{len(rows) - limit} more (raise limit)")
|
|
713
736
|
return "\n".join(out)
|
|
@@ -1086,7 +1109,8 @@ def node(id_or_symbol: str) -> str:
|
|
|
1086
1109
|
for k, v in sorted(byk.items()):
|
|
1087
1110
|
if k == "CONTAINS":
|
|
1088
1111
|
continue
|
|
1089
|
-
|
|
1112
|
+
# `<id> :<line>`: a variant id carries its own `@N` (`refreshStatus@24 :12`, #201)
|
|
1113
|
+
s = "; ".join(f"{short(r['o'])} :{r['line']}{'!g' if r['gate'] else ''}" for r in v[:6])
|
|
1090
1114
|
out.append(f" {k}: {s}{' …' if len(v) > 6 else ''}")
|
|
1091
1115
|
return "\n".join(out)
|
|
1092
1116
|
|
|
@@ -29,6 +29,7 @@ on any target follow the implementation that target builds.
|
|
|
29
29
|
"""
|
|
30
30
|
from __future__ import annotations
|
|
31
31
|
|
|
32
|
+
import dataclasses
|
|
32
33
|
import fnmatch
|
|
33
34
|
import json
|
|
34
35
|
import os
|
|
@@ -658,11 +659,13 @@ def apply(project, builder) -> dict:
|
|
|
658
659
|
etag[k] = hit
|
|
659
660
|
targets, tsrc = declared_targets(root, cfg, marks, set(langs) | ({"c_cpp"} if langs & {"c", "cpp"} else set()))
|
|
660
661
|
_write_attrs(builder, ntag, nvals, etag, targets)
|
|
662
|
+
narrowed = _narrow_variant_edges(builder, nvals, etag)
|
|
661
663
|
_variant_platforms(builder, nvals, targets)
|
|
662
664
|
unknown = [m for m in marks if any(m["cond"].values().get(p) is None for p in targets)]
|
|
663
665
|
tagged_files = sorted({m["file"] for m in marks})
|
|
664
666
|
st = {"targets": targets, "target_sources": tsrc, "conditions": len(marks), "files_with_conditions": len(tagged_files),
|
|
665
|
-
"tagged_nodes": len(ntag), "tagged_edges": len(etag), "variant_edges": mirrored,
|
|
667
|
+
"tagged_nodes": len(ntag), "tagged_edges": len(etag), "variant_edges": mirrored,
|
|
668
|
+
"variant_edges_narrowed": narrowed, "text_scanned_files": scanned,
|
|
666
669
|
"unevaluated_conditions": len(unknown),
|
|
667
670
|
"unevaluated_per_target": {p: sum(1 for m in unknown if m["cond"].values().get(p) is None) for p in targets},
|
|
668
671
|
"unevaluated_samples": sorted({f"{m['cond'].text} @ {m['file']}:{m['line']}" for m in unknown})[:8]}
|
|
@@ -824,6 +827,63 @@ def _write_attrs(builder, ntag, nvals, etag, targets=None) -> None:
|
|
|
824
827
|
put(e.attrs, ms, _combine([m["cond"].values() for m in ms]))
|
|
825
828
|
|
|
826
829
|
|
|
830
|
+
def _narrow_variant_edges(builder, nvals: dict, etag: dict) -> int:
|
|
831
|
+
"""A reference made where only some targets build (`#if os(macOS)` around the caller or the call) reaches only the
|
|
832
|
+
per-platform definitions built on one of those targets (#201): a macOS-only call of `refreshStatus()` links the
|
|
833
|
+
macOS definition, not the `#else` stub. A reference whose definition is not built anywhere the site is moves to the
|
|
834
|
+
sibling definitions that are (the `#else` type's `Self()` names its own type), and a Swift `init` of a sibling
|
|
835
|
+
variant type that declares no initializer of its own (the implicit one) is no reference at all. References from
|
|
836
|
+
code built everywhere keep linking every definition."""
|
|
837
|
+
alts = {}
|
|
838
|
+
for ids in _alt_groups(builder, nvals).values():
|
|
839
|
+
if len(ids) > 1 and any(i in nvals for i in ids):
|
|
840
|
+
for i in ids:
|
|
841
|
+
alts[i] = ids
|
|
842
|
+
inits: dict[str, list] = defaultdict(list) # Swift type -> its init nodes
|
|
843
|
+
parent: dict[str, str] = {}
|
|
844
|
+
for e in builder.edges.values():
|
|
845
|
+
if e.kind == "CONTAINS" and e.src.startswith("class:"):
|
|
846
|
+
parent[e.dst] = e.src
|
|
847
|
+
dn = builder.nodes.get(e.dst)
|
|
848
|
+
if dn is not None and dn.name == "init":
|
|
849
|
+
inits[e.src].append(e.dst)
|
|
850
|
+
|
|
851
|
+
def avail(i):
|
|
852
|
+
return {p for p in KNOWN if _avail(nvals.get(i), p)}
|
|
853
|
+
|
|
854
|
+
drop, adds = [], []
|
|
855
|
+
for k, e in builder.edges.items():
|
|
856
|
+
if e.kind in ("CONTAINS", "DEFINES", "GATED_BY"):
|
|
857
|
+
continue
|
|
858
|
+
vals = ([nvals[e.src]] if e.src in nvals else []) + [m["cond"].values() for m in etag.get(k, ())]
|
|
859
|
+
if not vals:
|
|
860
|
+
continue
|
|
861
|
+
site = {p for p, v in _combine(vals).items() if v is not False}
|
|
862
|
+
if not site or avail(e.dst) & site:
|
|
863
|
+
continue
|
|
864
|
+
ids = alts.get(e.dst)
|
|
865
|
+
if ids:
|
|
866
|
+
other = [i for i in ids if i != e.dst and avail(i) & site]
|
|
867
|
+
if other:
|
|
868
|
+
drop.append(k)
|
|
869
|
+
adds += [(e, i) for i in other]
|
|
870
|
+
continue
|
|
871
|
+
dn = builder.nodes.get(e.dst)
|
|
872
|
+
if dn is None or dn.lang != "swift" or dn.name != "init" or e.dst not in parent:
|
|
873
|
+
continue
|
|
874
|
+
own = parent[e.dst]
|
|
875
|
+
sib = [v for v in alts.get(own) or () if v != own and avail(v) & site]
|
|
876
|
+
if sib and all(not inits.get(v) for v in sib):
|
|
877
|
+
drop.append(k) # the sibling variant type's implicit initializer
|
|
878
|
+
for k in drop:
|
|
879
|
+
builder.edges.pop(k, None)
|
|
880
|
+
for e, nid in adds:
|
|
881
|
+
key = (e.src, nid, e.kind, e.file, e.line, e.gate)
|
|
882
|
+
if key not in builder.edges:
|
|
883
|
+
builder.edges[key] = dataclasses.replace(e, dst=nid, attrs={**(e.attrs or {}), "platform_variant_of": e.dst})
|
|
884
|
+
return len(drop)
|
|
885
|
+
|
|
886
|
+
|
|
827
887
|
def _variant_platforms(builder, nvals: dict, targets) -> int:
|
|
828
888
|
"""A reference into one of a symbol's per-platform definitions (Rust / C / C++ / Swift `#if` branches) carries
|
|
829
889
|
`variant_platforms`: the targets that definition is built for. Every definition is linked (_mirror), so a caller
|
|
@@ -318,8 +318,10 @@ class ExactLayer:
|
|
|
318
318
|
acc = {**acc, "property": "read" if accessor_kind.get(o.usr) == "getter" else "write"}
|
|
319
319
|
br = self.p.branch_at.get((rel, o.line, self.b.nodes[dst].name), {}) \
|
|
320
320
|
if kind == "INSTANTIATES" else {}
|
|
321
|
+
da = self.default_args.get((dst, rel, o.line)) if kind == "CALLS" else None
|
|
321
322
|
self.b.add_edge(src, dst, kind, rel, o.line, EXACT, source="indexstore",
|
|
322
|
-
**({"dynamic": True} if o.roles & ix.DYNAMIC else {}), **acc, **br
|
|
323
|
+
**({"dynamic": True} if o.roles & ix.DYNAMIC else {}), **acc, **br,
|
|
324
|
+
**({"default_arg": da} if da else {}))
|
|
323
325
|
exact.add((src, dst, kind))
|
|
324
326
|
refs += 1
|
|
325
327
|
st["index_references"] = refs
|
|
@@ -410,17 +412,22 @@ class ExactLayer:
|
|
|
410
412
|
it is kept, marked `via: not-compiled`, and left out of the comparison. Candidate edges (#83) go to
|
|
411
413
|
self.candidates, compared on their own."""
|
|
412
414
|
out, cand, kept = set(), set(), 0
|
|
415
|
+
self.default_args = {} # (callee, file, line) -> parameter label of a default-argument call (#208)
|
|
413
416
|
for key, e in list(self.b.edges.items()):
|
|
414
417
|
if e.confidence != HEURISTIC or e.file not in covered or e.kind not in CALL_KINDS:
|
|
415
418
|
continue
|
|
416
419
|
n = self.b.nodes.get(e.src)
|
|
417
420
|
if n is None or n.lang != "swift":
|
|
418
421
|
continue
|
|
422
|
+
if e.attrs.get("omits_default"):
|
|
423
|
+
continue # the call runs a default the compiler records at the declaration only (#212)
|
|
419
424
|
if (e.file, e.line) not in seen_lines:
|
|
420
425
|
e.attrs["via"] = "not-compiled"
|
|
421
426
|
kept += 1
|
|
422
427
|
continue
|
|
423
428
|
(cand if e.attrs.get("binding") == "candidate" else out).add((e.src, e.dst, e.kind))
|
|
429
|
+
if e.attrs.get("default_arg"):
|
|
430
|
+
self.default_args[(e.dst, e.file, e.line)] = e.attrs["default_arg"]
|
|
424
431
|
del self.b.edges[key]
|
|
425
432
|
self.candidates = cand
|
|
426
433
|
return out, kept
|
|
@@ -565,6 +565,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
565
565
|
self._available(sf)
|
|
566
566
|
self._resolve_calls()
|
|
567
567
|
self._resolve_props()
|
|
568
|
+
self._omitted_defaults()
|
|
568
569
|
self._at = None
|
|
569
570
|
self._hierarchy()
|
|
570
571
|
self._fluent_migrations(sfiles)
|
|
@@ -1437,6 +1438,11 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
1437
1438
|
# `a + weight(forExtraIndex: 2)` parses as `(a + weight)(forExtraIndex: 2)`: the callee is the right operand
|
|
1438
1439
|
f = f.child_by_field_name("rhs")
|
|
1439
1440
|
line = f.start_point[0] + 1
|
|
1441
|
+
while f.type == "prefix_expression" and len(f.children) == 2 and self.t(f.children[0]) in ("!", "-", "~", "+") \
|
|
1442
|
+
and f.children[1].type in ("navigation_expression", "simple_identifier"):
|
|
1443
|
+
# tree-sitter-swift 0.7.4 parses `!Preview.matches(a, b)` as `(!Preview.matches)(a, b)`; 0.7.3 as
|
|
1444
|
+
# `(!Preview).matches(a, b)` (handled below): either way the operator applies to the result (#199)
|
|
1445
|
+
f = f.children[1]
|
|
1440
1446
|
suf = next((x for x in c.children if x.type == "call_suffix"), None)
|
|
1441
1447
|
args = next((x for x in suf.children if x.type == "value_arguments"), None) if suf is not None else None
|
|
1442
1448
|
lam = next((x for x in suf.children if x.type in ("lambda_literal", "annotated_lambda")), None) if suf is not None else None
|
|
@@ -2122,6 +2128,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2122
2128
|
return self._qext
|
|
2123
2129
|
|
|
2124
2130
|
def _resolve_calls(self):
|
|
2131
|
+
self._default_edges: dict[str, list] = defaultdict(list) # function -> [(label, callee, attrs)] (#208)
|
|
2132
|
+
self._call_sites: list = [] # (caller, callee, file, line, labels, trailing)
|
|
2125
2133
|
for rec in self.calls:
|
|
2126
2134
|
owner, name, recv, line, sf, decl, labels, trailing = rec[:8]
|
|
2127
2135
|
default_arg = rec[8] if len(rec) > 8 else None
|
|
@@ -2151,15 +2159,57 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2151
2159
|
**self.branch_of.get((owner, line, name), {}))
|
|
2152
2160
|
for m in hit:
|
|
2153
2161
|
self.b.add_edge(owner, m.id, "CALLS", sf.rel, line, HEURISTIC)
|
|
2162
|
+
self._call_sites.append((owner, m.id, sf.rel, line, labels, trailing))
|
|
2154
2163
|
else:
|
|
2155
2164
|
if default_arg:
|
|
2156
2165
|
how = {**how, "default_arg": default_arg}
|
|
2166
|
+
self._default_edges[owner].append((default_arg, t.id, {}))
|
|
2167
|
+
elif self._how != "candidate":
|
|
2168
|
+
self._call_sites.append((owner, t.id, sf.rel, line, labels, trailing))
|
|
2157
2169
|
self.b.add_edge(owner, t.id, "CALLS", sf.rel, line, HEURISTIC, **how, **self._accessor_attr(decl, line))
|
|
2158
2170
|
if how:
|
|
2159
2171
|
self.st["calls_by_name_only" if self._how == "name" else "call_candidate_edges"] += 1
|
|
2160
2172
|
done = True
|
|
2161
2173
|
self.st["calls_resolved" if done else "calls_unresolved"] += 1
|
|
2162
2174
|
|
|
2175
|
+
def _omitted_defaults(self):
|
|
2176
|
+
"""A call that leaves out a defaulted argument runs the default expression: an edge from the caller to what
|
|
2177
|
+
the default calls, at the call site, with `omits_default` (the parameter label) and `default_of` (#212). A
|
|
2178
|
+
call that passes the argument gets none. The declaration's own `default_arg` edge stays (#208)."""
|
|
2179
|
+
if not self._default_edges:
|
|
2180
|
+
return
|
|
2181
|
+
n = 0
|
|
2182
|
+
for owner, did, rel, line, labels, trailing in self._call_sites:
|
|
2183
|
+
defs = self._default_edges.get(did)
|
|
2184
|
+
if not defs:
|
|
2185
|
+
continue
|
|
2186
|
+
left = self._left_out(did, labels, trailing)
|
|
2187
|
+
for label, callee, extra in defs:
|
|
2188
|
+
if label in left and callee != owner:
|
|
2189
|
+
self.b.add_edge(owner, callee, "CALLS", rel, line, HEURISTIC, omits_default=label, default_of=did,
|
|
2190
|
+
**extra)
|
|
2191
|
+
n += 1
|
|
2192
|
+
if n:
|
|
2193
|
+
self.st["default_argument_sites"] = n
|
|
2194
|
+
|
|
2195
|
+
def _left_out(self, did: str, labels: tuple, trailing: bool) -> set:
|
|
2196
|
+
"""Labels of the defaulted / optional parameters the call leaves out, by the first signature it fits."""
|
|
2197
|
+
for sig in self.sigs.get(did) or ():
|
|
2198
|
+
i, ok, left, tr = 0, True, set(), trailing
|
|
2199
|
+
for k, (lab, opt) in enumerate(sig):
|
|
2200
|
+
if i < len(labels) and labels[i] == lab:
|
|
2201
|
+
i += 1
|
|
2202
|
+
elif tr and i == len(labels) and all(o for _l, o in sig[k + 1:]):
|
|
2203
|
+
tr = False
|
|
2204
|
+
elif opt:
|
|
2205
|
+
left.add(lab)
|
|
2206
|
+
else:
|
|
2207
|
+
ok = False
|
|
2208
|
+
break
|
|
2209
|
+
if ok and i == len(labels):
|
|
2210
|
+
return left
|
|
2211
|
+
return set()
|
|
2212
|
+
|
|
2163
2213
|
def _prop_member(self, cls: Decl | None, name: str, depth: int = 0) -> list[Decl]:
|
|
2164
2214
|
"""Property nodes named `name` of a type, its extensions and its supertypes (protocol extensions too)."""
|
|
2165
2215
|
if cls is None or name in self.stored_in.get(cls.fqn, ()):
|
|
@@ -2241,6 +2291,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2241
2291
|
continue
|
|
2242
2292
|
if default_arg:
|
|
2243
2293
|
how = {**how, "default_arg": default_arg}
|
|
2294
|
+
self._default_edges[owner].append((default_arg, t.id, {"property": "write" if write else "read"}))
|
|
2244
2295
|
self.b.add_edge(owner, t.id, "CALLS", sf.rel, line, HEURISTIC, property="write" if write else "read",
|
|
2245
2296
|
**how, **self._accessor_attr(decl, line))
|
|
2246
2297
|
done = True
|
|
@@ -981,6 +981,9 @@ def _hop_of(e) -> dict:
|
|
|
981
981
|
a = json.loads(e["attrs"])
|
|
982
982
|
if a.get("binding") == "candidate": # one of several same-name methods, receiver type unknown (#83)
|
|
983
983
|
hop["candidate"] = a.get("candidates") or True
|
|
984
|
+
if e["kind"] in ("CALLS", "TEST_CALLS") and e["attrs"] and '"omits_default"' in e["attrs"]:
|
|
985
|
+
a = json.loads(e["attrs"]) # the call leaves out a defaulted argument and runs its default (#212)
|
|
986
|
+
hop["omits_default"], hop["default_of"] = a.get("omits_default"), a.get("default_of")
|
|
984
987
|
if e["kind"] in ("CALLS", "TEST_CALLS") and e["attrs"] and '"accessor"' in e["attrs"]:
|
|
985
988
|
hop["accessor"] = json.loads(e["attrs"]).get("accessor") # inside `didSet { }` / `get { }` (Swift, #72)
|
|
986
989
|
if e["gate"]:
|
|
@@ -1253,7 +1256,7 @@ def render_reaches(res: dict, show_paths=True, kinds=CODE_KINDS + ENTRY_NODE_KIN
|
|
|
1253
1256
|
out.append(f"== {labels[cls]}: {len(group)} functions/methods")
|
|
1254
1257
|
bymod = defaultdict(list)
|
|
1255
1258
|
for i in group:
|
|
1256
|
-
bymod[i
|
|
1259
|
+
bymod[caller_group(i)].append(i)
|
|
1257
1260
|
for mod in sorted(bymod):
|
|
1258
1261
|
out.append(f" [{mod}]")
|
|
1259
1262
|
for i in bymod[mod]:
|
|
@@ -1270,7 +1273,7 @@ def render_reaches(res: dict, show_paths=True, kinds=CODE_KINDS + ENTRY_NODE_KIN
|
|
|
1270
1273
|
out.append(f"== GATED UNDER SCENARIO '{res.get('gate')}' (dead when the scenario holds; live otherwise): {len(gated)} functions/methods")
|
|
1271
1274
|
bymod = defaultdict(list)
|
|
1272
1275
|
for i in gated:
|
|
1273
|
-
bymod[i
|
|
1276
|
+
bymod[caller_group(i)].append(i)
|
|
1274
1277
|
for mod in sorted(bymod):
|
|
1275
1278
|
out.append(f" [{mod}]")
|
|
1276
1279
|
for i in bymod[mod]:
|
|
@@ -1304,7 +1307,8 @@ def _first_hop(path: list[dict] | None) -> dict:
|
|
|
1304
1307
|
return {}
|
|
1305
1308
|
h = path[0]
|
|
1306
1309
|
return {"edge": h["kind"], **({"how": h["how"]} if h.get("how") else {}), **({"via": h["via"]} if h.get("via") else {}),
|
|
1307
|
-
**({"accessor": h["accessor"]} if h.get("accessor") else {})
|
|
1310
|
+
**({"accessor": h["accessor"]} if h.get("accessor") else {}),
|
|
1311
|
+
**({"omits_default": h["omits_default"], "default_of": h.get("default_of")} if h.get("omits_default") else {})}
|
|
1308
1312
|
|
|
1309
1313
|
|
|
1310
1314
|
def with_generated(row: dict) -> dict:
|
|
@@ -1348,6 +1352,54 @@ def generated_label(n: dict) -> str:
|
|
|
1348
1352
|
|
|
1349
1353
|
|
|
1350
1354
|
CANDIDATE_LABEL = " (candidate)"
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
def _node_name(nid: str) -> str:
|
|
1358
|
+
"""`method:PrinterBridge.refreshStatus@24` -> `refreshStatus`."""
|
|
1359
|
+
return nid.split(":", 1)[-1].split("@", 1)[0].rsplit(".", 1)[-1].rsplit("::", 1)[-1].rsplit("#", 1)[-1]
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
def caller_group(c: dict) -> str:
|
|
1363
|
+
"""Module of a caller; a caller without one (a free function, a top-level script) is grouped by its file,
|
|
1364
|
+
never as `?` (#204)."""
|
|
1365
|
+
if c.get("module"):
|
|
1366
|
+
return c["module"]
|
|
1367
|
+
f = c.get("file")
|
|
1368
|
+
return f"{os.path.basename(f)} (top level)" if f else "?"
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
def fanout_text(c: dict) -> str:
|
|
1372
|
+
"""' (1 of 4 methods named refreshStatus)' for a selector-only candidate caller (#204), else ''."""
|
|
1373
|
+
co = c.get("candidate_of") or {}
|
|
1374
|
+
return f" (1 of {co['count']} methods named {co['name']})" if co.get("count") else ""
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
def candidate_label(attrs: str | None, dst: str) -> str:
|
|
1378
|
+
"""' (candidate, 1 of 3 methods named refreshStatus)' for a candidate call edge (#204)."""
|
|
1379
|
+
try:
|
|
1380
|
+
a = json.loads(attrs or "{}") or {}
|
|
1381
|
+
except ValueError:
|
|
1382
|
+
a = {}
|
|
1383
|
+
n = a.get("candidates")
|
|
1384
|
+
if isinstance(n, int) and not isinstance(n, bool) and n > 1:
|
|
1385
|
+
return f" (candidate, 1 of {n} methods named {_node_name(dst)})"
|
|
1386
|
+
return CANDIDATE_LABEL
|
|
1387
|
+
|
|
1388
|
+
|
|
1389
|
+
def omitted_default_label(attrs: str | None) -> str:
|
|
1390
|
+
"""' (runs the default of gamut: in render)' for a call site that leaves out a defaulted argument (#212)."""
|
|
1391
|
+
if attrs and '"default_arg"' in attrs:
|
|
1392
|
+
try:
|
|
1393
|
+
return f" (parameter default {(json.loads(attrs) or {}).get('default_arg')}:)"
|
|
1394
|
+
except ValueError:
|
|
1395
|
+
return ""
|
|
1396
|
+
if not attrs or '"omits_default"' not in attrs:
|
|
1397
|
+
return ""
|
|
1398
|
+
try:
|
|
1399
|
+
a = json.loads(attrs) or {}
|
|
1400
|
+
except ValueError:
|
|
1401
|
+
return ""
|
|
1402
|
+
return f" (runs the default of {a.get('omits_default')}: in {_node_name(a.get('default_of') or '?')})"
|
|
1351
1403
|
CANDIDATE_NOTE = ("(candidate): through a call whose receiver type is unknown, bound to each project method with that "
|
|
1352
1404
|
"selector; it may reach a same-name sibling instead")
|
|
1353
1405
|
|
|
@@ -1418,7 +1470,10 @@ def caller_label(c: dict) -> str:
|
|
|
1418
1470
|
if c.get("in_property"): # a type node: the call is in a property of that type (#72)
|
|
1419
1471
|
lab += " (in a property)"
|
|
1420
1472
|
if c.get("candidate"):
|
|
1421
|
-
|
|
1473
|
+
co = c.get("candidate_of") or {}
|
|
1474
|
+
lab += f" (candidate, 1 of {co['count']} methods named {co['name']})" if co.get("count") else CANDIDATE_LABEL
|
|
1475
|
+
if c.get("omits_default"):
|
|
1476
|
+
lab += f" (runs the default of {c['omits_default']}: in {_node_name(c.get('default_of') or '?')})"
|
|
1422
1477
|
if c.get("via_override"):
|
|
1423
1478
|
v = c["via_override"]
|
|
1424
1479
|
lab += f" (via override {v[0]}" + (f" +{len(v) - 1}" if len(v) > 1 else "") + ")"
|
|
@@ -1655,6 +1710,10 @@ def _impact(st: GraphStore, spec: str, min_conf: str, platform: str | None) -> d
|
|
|
1655
1710
|
p = paths.get(n) or []
|
|
1656
1711
|
if path_candidate(p):
|
|
1657
1712
|
c["candidate"] = True
|
|
1713
|
+
fan = next((h for h in p if h.get("candidate")), {})
|
|
1714
|
+
if isinstance(fan.get("candidate"), int) and not isinstance(fan.get("candidate"), bool):
|
|
1715
|
+
# one of N project methods sharing the selector (#204)
|
|
1716
|
+
c["candidate_of"] = {"count": fan["candidate"], "name": _node_name(fan["to"])}
|
|
1658
1717
|
if p and p[0]["to"] in bases: # calls the base declaration; reaches the target through the override
|
|
1659
1718
|
c["via_base"] = fq.get(p[0]["to"], p[0]["to"])
|
|
1660
1719
|
if n in direct: # calls an override (not the target itself): reaches the target's API through it
|
|
@@ -1662,6 +1721,9 @@ def _impact(st: GraphStore, spec: str, min_conf: str, platform: str | None) -> d
|
|
|
1662
1721
|
callers.append(c)
|
|
1663
1722
|
out = {"targets": targets, "entry_points": sorted(entries, key=lambda x: (x["entry_kind"], x["name"])),
|
|
1664
1723
|
"callers": sorted(callers, key=lambda x: (x["depth"], x["fqn"] or "")), **rel}
|
|
1724
|
+
# selector-only candidates (receiver type unknown, #83) are counted apart from resolved callers (#204)
|
|
1725
|
+
out["callers_candidate"] = sum(1 for c in callers if c.get("candidate"))
|
|
1726
|
+
out["callers_resolved"] = len(callers) - out["callers_candidate"]
|
|
1665
1727
|
defaults = _default_arguments(st, targets)
|
|
1666
1728
|
if defaults:
|
|
1667
1729
|
out["default_arguments"] = defaults
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.23.
|
|
3
|
+
Version: 0.23.3
|
|
4
4
|
Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,7 @@ Requires-Dist: tree-sitter-c>=0.23
|
|
|
18
18
|
Requires-Dist: tree-sitter-cpp>=0.23
|
|
19
19
|
Requires-Dist: tree-sitter-kotlin>=1.0
|
|
20
20
|
Requires-Dist: tree-sitter-java>=0.23
|
|
21
|
-
Requires-Dist: tree-sitter-swift<0.
|
|
21
|
+
Requires-Dist: tree-sitter-swift<0.8,>=0.6
|
|
22
22
|
Provides-Extra: dev
|
|
23
23
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
24
24
|
Provides-Extra: watch
|
|
@@ -275,8 +275,10 @@ tests/test_inherited_overrides.py
|
|
|
275
275
|
tests/test_inline_guards.py
|
|
276
276
|
tests/test_install_rules.py
|
|
277
277
|
tests/test_issue_192.py
|
|
278
|
+
tests/test_issue_201.py
|
|
278
279
|
tests/test_issue_202.py
|
|
279
280
|
tests/test_issue_203.py
|
|
281
|
+
tests/test_issue_204.py
|
|
280
282
|
tests/test_issue_205.py
|
|
281
283
|
tests/test_issue_206.py
|
|
282
284
|
tests/test_issue_207.py
|
|
@@ -285,6 +287,7 @@ tests/test_issue_209.py
|
|
|
285
287
|
tests/test_issue_210.py
|
|
286
288
|
tests/test_issue_211.py
|
|
287
289
|
tests/test_issue_211_used_at.py
|
|
290
|
+
tests/test_issue_212.py
|
|
288
291
|
tests/test_java.py
|
|
289
292
|
tests/test_java_exact.py
|
|
290
293
|
tests/test_jobs.py
|
|
@@ -20,7 +20,7 @@ dependencies = [
|
|
|
20
20
|
"tree-sitter-cpp>=0.23",
|
|
21
21
|
"tree-sitter-kotlin>=1.0",
|
|
22
22
|
"tree-sitter-java>=0.23",
|
|
23
|
-
"tree-sitter-swift>=0.6,<0.
|
|
23
|
+
"tree-sitter-swift>=0.6,<0.8",
|
|
24
24
|
]
|
|
25
25
|
|
|
26
26
|
[project.optional-dependencies]
|