cg-code-graph 0.23.8__tar.gz → 0.23.10__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.8/cg_code_graph.egg-info → cg_code_graph-0.23.10}/PKG-INFO +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/parity_structure.py +136 -15
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/platforms.py +35 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/plugin.py +169 -5
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/plugin.py +200 -14
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10/cg_code_graph.egg-info}/PKG-INFO +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/SOURCES.txt +3 -0
- cg_code_graph-0.23.10/tests/test_dispatch_part3.py +122 -0
- cg_code_graph-0.23.10/tests/test_parity_members.py +67 -0
- cg_code_graph-0.23.10/tests/test_swift_platform_files.py +103 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/LICENSE +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/MANIFEST.in +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/README.md +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/cli.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/cmake_sources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/indexer.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/install_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/mcp_graphs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/mcp_server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/query.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/update_check.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/pyproject.toml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/setup.cfg +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_affected.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_astro.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_cmake_sources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_coverage.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_dead_wrappers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_env.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_explore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_gating.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_generated.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_install_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_201.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_202.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_204.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_205.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_206.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_208.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_210.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_211_used_at.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_212.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_212_langs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_218.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_219.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_issue_222.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_java.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_laravel_receiver_narrowing.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_laravel_route_paths.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_link_origin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mcp_instructions.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_mcp_multi_graph.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_nuxt_i18n.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_nuxt_nitro.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_nuxt_side_dirs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_parity.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_parity_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_php_http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_plans.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_route_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_spring.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_surface.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_tauri_events.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_update_check.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_viz.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_watch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.10}/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.10"
|
|
@@ -56,6 +56,11 @@ RES = re.compile(r"""\b(?:UI|NS)?Image\(\s*(?:named:\s*)?"([^"\n]+)"|\bAsset\.(?
|
|
|
56
56
|
r"""\bImage\(\s*\.(\w+)\s*\)|\b(?:R|Res)\.(?:drawable|mipmap|raw)\.(\w+)""")
|
|
57
57
|
WIRE = re.compile(r'@(?:SerialName|SerializedName|JsonProperty|Json\(\s*name\s*=)\s*\(?\s*(?:value\s*=\s*)?"([^"\n]+)"')
|
|
58
58
|
RAW_CASE = re.compile(r'\bcase\s+`?(\w+)`?\s*=\s*"([^"\n]+)"')
|
|
59
|
+
ARM = re.compile(r"^(\s*)case\s+(?:let\s+|var\s+)?((?:\.\w+(?:\([^)]*\))?\s*,?\s*)+)(?:where\b[^:]*)?:")
|
|
60
|
+
DISPATCH = {"receive", "perform", "handle", "handleaction", "onaction", "reduce", "send", "dispatch", "process"}
|
|
61
|
+
MIN_MEMBER_SCORE = 0.35
|
|
62
|
+
MIN_NAME_SCORE = 0.45
|
|
63
|
+
MIN_BOTH_SCORE = 0.25
|
|
59
64
|
EDGE_KINDS = ("CALLS", "INSTANTIATES", "NAVIGATES_TO", "HTTP_CALLS", "USES_VALUE", "REFERENCES_FN", "USES_TYPE")
|
|
60
65
|
|
|
61
66
|
|
|
@@ -140,9 +145,11 @@ class Side:
|
|
|
140
145
|
self.by_file[r["file"]].append((r["line"], r["end_line"] or r["line"], r["id"]))
|
|
141
146
|
self.span[r["id"]] = (r["file"], r["line"], r["end_line"] or r["line"])
|
|
142
147
|
self.out = defaultdict(list)
|
|
143
|
-
|
|
148
|
+
self.out_at = defaultdict(list) # src -> [(line, dst, kind)]
|
|
149
|
+
q = f"SELECT src, dst, kind, line FROM edges WHERE kind IN ({','.join('?' * len(EDGE_KINDS))})"
|
|
144
150
|
for r in c.execute(q, EDGE_KINDS):
|
|
145
151
|
self.out[r["src"]].append((r["dst"], r["kind"]))
|
|
152
|
+
self.out_at[r["src"]].append((r["line"] or 0, r["dst"], r["kind"]))
|
|
146
153
|
self.http = {r["id"]: (r["name"] or r["id"]) for r in c.execute("SELECT id, name FROM nodes WHERE kind='http'")}
|
|
147
154
|
self.decl = defaultdict(list) # owner fqn -> [(name, kind, file, line)] of stored fields / enum cases
|
|
148
155
|
for r in c.execute("SELECT kind, fqn, file, line, attrs FROM nodes WHERE kind IN ('field', 'enum_case') "
|
|
@@ -202,21 +209,50 @@ class Side:
|
|
|
202
209
|
for la, lb, nid in self.by_file.get(file, ()):
|
|
203
210
|
if a <= la <= b:
|
|
204
211
|
for dst, kind in self.out.get(nid, ()):
|
|
205
|
-
|
|
206
|
-
p = re.sub(r"\{[^}]*\}|(?<=/):\w+", "{}", self.http.get(dst, dst).split(" ")[-1])
|
|
207
|
-
f.add("http:" + p.lstrip("/").lower())
|
|
208
|
-
continue
|
|
209
|
-
dq = self.fqn_of.get(dst)
|
|
210
|
-
t = rename(dq)
|
|
211
|
-
if t:
|
|
212
|
-
f.add("sym:" + t)
|
|
213
|
-
# the called member's own name (two words or more): `getDevices` on an AuthService and on
|
|
214
|
-
# an AuthRepository is the same call even when the owners are not paired
|
|
215
|
-
nm = _short(dq or "").split("(")[0]
|
|
216
|
-
if kind == "CALLS" and len(_words(nm)) >= 2:
|
|
217
|
-
f.add("call:" + re.sub(r"^(get|fetch|load)(?=[a-z])", "", _fold(nm)))
|
|
212
|
+
self._edge(f, dst, kind, rename)
|
|
218
213
|
return f
|
|
219
214
|
|
|
215
|
+
def _edge(self, f: set, dst: str, kind: str, rename) -> None:
|
|
216
|
+
if kind == "HTTP_CALLS" or dst in self.http:
|
|
217
|
+
p = re.sub(r"\{[^}]*\}|(?<=/):\w+", "{}", self.http.get(dst, dst).split(" ")[-1])
|
|
218
|
+
f.add("http:" + p.lstrip("/").lower())
|
|
219
|
+
return
|
|
220
|
+
dq = self.fqn_of.get(dst)
|
|
221
|
+
t = rename(dq)
|
|
222
|
+
if t:
|
|
223
|
+
f.add("sym:" + t)
|
|
224
|
+
# the called member's own name (two words or more): `getDevices` on an AuthService and on
|
|
225
|
+
# an AuthRepository is the same call even when the owners are not paired
|
|
226
|
+
nm = _short(dq or "").split("(")[0]
|
|
227
|
+
if kind == "CALLS" and len(_words(nm)) >= 2:
|
|
228
|
+
f.add("call:" + re.sub(r"^(get|fetch|load)(?=[a-z])", "", _fold(nm)))
|
|
229
|
+
|
|
230
|
+
def arms(self, sym: dict) -> list:
|
|
231
|
+
"""The top-level `case .x:` arms of a Swift `receive(_:)` / `perform(_:)` style switch: [(case names,
|
|
232
|
+
features of what the arm calls)]."""
|
|
233
|
+
file, a, b = self.span.get(sym["id"], (None, 0, 0))
|
|
234
|
+
if not file or b <= a:
|
|
235
|
+
return []
|
|
236
|
+
rows = self.text(file, a, b).split("\n")
|
|
237
|
+
hits = [(i, len(m.group(1)), m.group(2)) for i, ln in enumerate(rows) for m in [ARM.match(ln)] if m]
|
|
238
|
+
if not hits:
|
|
239
|
+
return []
|
|
240
|
+
top = min(h[1] for h in hits)
|
|
241
|
+
hits = [h for h in hits if h[1] == top]
|
|
242
|
+
out = []
|
|
243
|
+
for k, (i, _, names) in enumerate(hits):
|
|
244
|
+
lo, hi = a + i, (a + hits[k + 1][0] - 1 if k + 1 < len(hits) else b)
|
|
245
|
+
f = set()
|
|
246
|
+
for ln, dst, kind in self.out_at.get(sym["id"], ()):
|
|
247
|
+
if lo <= ln <= hi:
|
|
248
|
+
self._edge(f, dst, kind, lambda x: x)
|
|
249
|
+
for la, lb, nid in self.by_file.get(file, ()):
|
|
250
|
+
if lo <= la <= hi and nid != sym["id"]:
|
|
251
|
+
for dst, kind in self.out.get(nid, ()):
|
|
252
|
+
self._edge(f, dst, kind, lambda x: x)
|
|
253
|
+
out.append((re.findall(r"\.(\w+)", names), f))
|
|
254
|
+
return out
|
|
255
|
+
|
|
220
256
|
|
|
221
257
|
def match(S: dict, T: dict, out: dict, sym_of: dict, cat_of: dict, t_syms: dict, t_cat: dict, learn: bool = True) -> dict:
|
|
222
258
|
ui_s = {fq: is_ui(fq, sym, S["members"]) for fq, sym in sym_of.items()}
|
|
@@ -369,7 +405,8 @@ def _structure(S, T, out, sym_of, cat_of, t_syms, t_cat, used):
|
|
|
369
405
|
if sym is not None:
|
|
370
406
|
src_f[row["symbol"]] = sS.features(sym, lambda x: pairs.get(x)) | name_words(row["symbol"])
|
|
371
407
|
tgt_f = {fq: sT.features(sym, lambda x: x) | name_words(fq) for fq, sym in t_syms.items()
|
|
372
|
-
if fq not in used and not PREVIEW.search(_short(fq))
|
|
408
|
+
if fq not in used and not PREVIEW.search(_short(fq))
|
|
409
|
+
and not (_fold(_short(fq).split("(")[0]) in DISPATCH and sT.arms(sym))} # its arms are paired below
|
|
373
410
|
src_f = {fq: f for fq, f in src_f.items() if not PREVIEW.search(_short(fq))}
|
|
374
411
|
df = Counter()
|
|
375
412
|
for fs in list(src_f.values()) + list(tgt_f.values()):
|
|
@@ -423,4 +460,88 @@ def _structure(S, T, out, sym_of, cat_of, t_syms, t_cat, used):
|
|
|
423
460
|
else:
|
|
424
461
|
keep.append(row)
|
|
425
462
|
out["missing"] = keep
|
|
463
|
+
_members(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T)
|
|
426
464
|
_by_fields(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T)
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def _members(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T):
|
|
468
|
+
"""Members of matched types still missing, paired inside the counterpart type (#227): with an unmatched member,
|
|
469
|
+
or a top-level function, that makes the same paired calls, or with a `case .x:` arm of its `receive(_:)` /
|
|
470
|
+
`perform(_:)` switch (`handleCopyClick` on a view model, `case .copyGeneratedValue:` in the processor). Uses are
|
|
471
|
+
weighed within the pair of types, so a call that is common across the project still tells two members apart."""
|
|
472
|
+
pairs = {r["symbol"]: r["target"] for r in out["matched"]}
|
|
473
|
+
by_owner = defaultdict(list)
|
|
474
|
+
for r in out["missing"]:
|
|
475
|
+
if r.get("owner_matched") and r["symbol"] in sym_of and not PREVIEW.search(_short(r["symbol"])):
|
|
476
|
+
by_owner[r["owner_matched"]].append(r)
|
|
477
|
+
if not by_owner:
|
|
478
|
+
return
|
|
479
|
+
ident = lambda x: x # noqa: E731
|
|
480
|
+
top, top_inv = None, defaultdict(list)
|
|
481
|
+
taken_arms, best, cand_of = set(), {}, {}
|
|
482
|
+
for o, rows in by_owner.items():
|
|
483
|
+
units = [] # (key, target fqn, case name or None, category, features)
|
|
484
|
+
for nm, sym in T["members"].get(o, {}).items():
|
|
485
|
+
fq = f"{o}.{nm}"
|
|
486
|
+
arms = sT.arms(sym) if _fold(nm.split("(")[0]) in DISPATCH else []
|
|
487
|
+
for names, f in arms: # a dispatching switch stands for its arms, not as a whole
|
|
488
|
+
ws = set().union(*(name_words(n) for n in names))
|
|
489
|
+
units.append(((fq, names[0]), fq, names[0], "func", f | ws))
|
|
490
|
+
if not arms and fq not in used and not PREVIEW.search(nm):
|
|
491
|
+
units.append((fq, fq, None, t_cat.get(fq), sT.features(sym, ident) | name_words(fq)))
|
|
492
|
+
src = {r["symbol"]: sS.features(sym_of[r["symbol"]], pairs.get) | name_words(r["symbol"]) for r in rows}
|
|
493
|
+
if top is None: # top-level functions, met only through two paired uses
|
|
494
|
+
top = {}
|
|
495
|
+
for fq, sym in t_syms.items():
|
|
496
|
+
if t_cat.get(fq) == "func" and fq not in used and "." not in fq.replace(o, "") and fq in T["top"]:
|
|
497
|
+
top[fq] = {f for f in sT.features(sym, ident) if f.startswith("sym:")} | name_words(fq)
|
|
498
|
+
for f in top[fq]:
|
|
499
|
+
if f.startswith("sym:"):
|
|
500
|
+
top_inv[f].append(fq)
|
|
501
|
+
df = Counter()
|
|
502
|
+
for fs in list(src.values()) + [u[4] for u in units]:
|
|
503
|
+
df.update(fs)
|
|
504
|
+
n = len(src) + len(units)
|
|
505
|
+
for fq, fs in src.items():
|
|
506
|
+
extra = {t for f in fs if f.startswith("sym:") for t in top_inv.get(f, ())}
|
|
507
|
+
cands = [u for u in units if u[3] == cat_of.get(fq)] + [(t, t, None, "func", top[t]) for t in extra
|
|
508
|
+
if cat_of.get(fq) == "func"]
|
|
509
|
+
scored = []
|
|
510
|
+
for key, t, case, cat, tf in cands:
|
|
511
|
+
sh = fs & tf
|
|
512
|
+
uses = sum(1 for f in sh if not f.startswith("w:"))
|
|
513
|
+
words = len(sh) - uses
|
|
514
|
+
if case is None and t in top and uses < 2:
|
|
515
|
+
continue
|
|
516
|
+
if not (uses >= 2 or (uses and words) or words >= 2):
|
|
517
|
+
continue
|
|
518
|
+
wt = lambda f: math.log(1 + n / df[f]) if df[f] else math.log(1 + n) # noqa: E731
|
|
519
|
+
sc = sum(wt(f) for f in sh) / math.sqrt(sum(wt(f) for f in fs) * sum(wt(f) for f in tf))
|
|
520
|
+
if sc < (MIN_NAME_SCORE if not uses else MIN_BOTH_SCORE if words else MIN_MEMBER_SCORE):
|
|
521
|
+
continue # names alone must agree more; a use and a name word less
|
|
522
|
+
scored.append((sc, key, t, case, sh))
|
|
523
|
+
scored.sort(key=lambda x: -x[0])
|
|
524
|
+
if scored and (len(scored) == 1 or scored[1][0] < MARGIN * scored[0][0]):
|
|
525
|
+
best[fq] = scored[0]
|
|
526
|
+
by_key = defaultdict(list)
|
|
527
|
+
for fq, (sc, key, *_rest) in best.items():
|
|
528
|
+
by_key[key].append((sc, fq))
|
|
529
|
+
keep = []
|
|
530
|
+
for row in out["missing"]:
|
|
531
|
+
got = best.get(row["symbol"])
|
|
532
|
+
if not got:
|
|
533
|
+
keep.append(row)
|
|
534
|
+
continue
|
|
535
|
+
sc, key, t, case, sh = got
|
|
536
|
+
if max(by_key[key])[1] != row["symbol"] or (case is None and t in used) or key in taken_arms:
|
|
537
|
+
keep.append(row)
|
|
538
|
+
continue
|
|
539
|
+
if case is None:
|
|
540
|
+
used.add(t)
|
|
541
|
+
taken_arms.add(key)
|
|
542
|
+
ev = sorted(sh, key=lambda f: (f.startswith("w:"), f))[:6]
|
|
543
|
+
r = dict(row, target=t, confidence="structure", score=round(sc, 2), evidence=([f"case .{case}"] if case else []) + ev)
|
|
544
|
+
if case:
|
|
545
|
+
r["case"] = case
|
|
546
|
+
out["matched"].append(r)
|
|
547
|
+
out["missing"] = keep
|
|
@@ -254,6 +254,29 @@ OTHER_OS_STEM = re.compile(r"(?:^|[_-])(aix|sunos|solaris|os390|zos|ibmi|freebsd
|
|
|
254
254
|
r"cygwin|hurd|illumos|pase)$", re.I)
|
|
255
255
|
|
|
256
256
|
|
|
257
|
+
# Swift platform files (#225): `Foo+iOS.swift`, `Foo.macOS.swift`, `Foo_watchOS.swift`, or a folder `macOS/` / `iOS/`
|
|
258
|
+
# of a multiplatform app. A guess: built for that platform, unknown on the other Apple platforms, absent elsewhere
|
|
259
|
+
SWIFT_PLAT = {"ios": "ios", "iphone": "ios", "ipados": "ios", "macos": "macos", "osx": "macos", "mac": "macos",
|
|
260
|
+
"appkit": "macos", "tvos": "tvos", "watchos": "watchos", "visionos": "visionos", "xros": "visionos"}
|
|
261
|
+
SWIFT_STEM = re.compile(r"[+._-](iOS|iPhone|iPadOS|macOS|OSX|Mac|AppKit|tvOS|watchOS|visionOS|xrOS)$")
|
|
262
|
+
SWIFT_DIR = re.compile(r"^(iOS|iPadOS|macOS|OSX|tvOS|watchOS|visionOS|xrOS)$")
|
|
263
|
+
APPLE = ("ios", "macos", "tvos", "watchos", "visionos")
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def swift_path_convention(rel: str) -> tuple[str, str] | None:
|
|
267
|
+
parts = rel.split("/")
|
|
268
|
+
stem = parts[-1][:-len(".swift")] if parts[-1].endswith(".swift") else None
|
|
269
|
+
if stem is None:
|
|
270
|
+
return None
|
|
271
|
+
m = SWIFT_STEM.search(stem)
|
|
272
|
+
if m:
|
|
273
|
+
return SWIFT_PLAT[m.group(1).lower()], f"file name {parts[-1]}"
|
|
274
|
+
for d in parts[:-1]:
|
|
275
|
+
if SWIFT_DIR.match(d):
|
|
276
|
+
return SWIFT_PLAT[d.lower()], f"directory {d}/"
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
|
|
257
280
|
def _plat_atom(name: str):
|
|
258
281
|
if name == "other": # an OS outside the known targets
|
|
259
282
|
return ("atom", "platform", "__other__")
|
|
@@ -655,6 +678,18 @@ def apply(project, builder) -> dict:
|
|
|
655
678
|
tree = ("any", [_plat_atom(p) for p in ps]) if len(ps) > 1 else _plat_atom(ps[0])
|
|
656
679
|
names = ", ".join(m["targets"][:3]) + (" …" if len(m["targets"]) > 3 else "")
|
|
657
680
|
mark(builder, f, 1, BIG, Cond("tree", tree, f"Xcode target membership ({names})"), line=1)
|
|
681
|
+
if "swift" in langs and pc.get("path_conventions", True):
|
|
682
|
+
whole = {m["file"] for m in builder.platform_marks if m["start"] <= 1 and m.get("end") in (None, BIG)}
|
|
683
|
+
for f, ns in nodes_by_file.items():
|
|
684
|
+
if f in whole or ns[0].lang != "swift":
|
|
685
|
+
continue # Xcode membership (or .cg.yaml paths) already says where it is built
|
|
686
|
+
pcv = swift_path_convention(f)
|
|
687
|
+
if pcv:
|
|
688
|
+
n0 = len(builder.platform_marks)
|
|
689
|
+
tree = ("any", [_plat_atom(pcv[0])] + [("atom", "unknown_on", p) for p in APPLE if p != pcv[0]])
|
|
690
|
+
mark(builder, f, 1, BIG, Cond("tree", tree, f"{pcv[1]} (platform file name)"), line=1)
|
|
691
|
+
if len(builder.platform_marks) > n0:
|
|
692
|
+
builder.platform_marks[-1]["convention"] = True
|
|
658
693
|
marks = builder.platform_marks
|
|
659
694
|
if not marks:
|
|
660
695
|
return {}
|
|
@@ -296,6 +296,8 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
296
296
|
if files is None:
|
|
297
297
|
files = source_files(project.root, project)
|
|
298
298
|
self.decls: dict[str, Decl] = {}
|
|
299
|
+
self.rets: dict[str, str] = {} # function / method id -> declared (or constructed) result type text (#109)
|
|
300
|
+
self._ksrc: dict[str, bytes] = {}
|
|
299
301
|
self.test_fw: dict[str, str | None] = {}
|
|
300
302
|
self._fd = None
|
|
301
303
|
self.by_name: dict[str, list[Decl]] = defaultdict(list)
|
|
@@ -361,7 +363,8 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
361
363
|
tree = nt
|
|
362
364
|
self.st["files_reparsed_by_member"] += 1
|
|
363
365
|
self.st["members_dropped_by_reparse"] += len(dropped)
|
|
364
|
-
kf = KFile(rel, src, tree)
|
|
366
|
+
kf = KFile(rel, src, tree)
|
|
367
|
+
self._ksrc[rel] = src # names and text from the original bytes; offsets are unchanged
|
|
365
368
|
if tree.root_node.has_error or dropped:
|
|
366
369
|
self.st["files_with_syntax_errors"] += 1
|
|
367
370
|
errs[rel] = merge(tree_spans(tree.root_node) + [list(x) for x in dropped])
|
|
@@ -608,6 +611,9 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
608
611
|
self._params(params) if params is not None else {}, kf.test, self._name_line(c),
|
|
609
612
|
slots=self._fn_slots(params))
|
|
610
613
|
self._local_types(c, dc.types)
|
|
614
|
+
rt = self._ret_text(c)
|
|
615
|
+
if rt is not None:
|
|
616
|
+
self.rets[dc.id] = rt if self.rets.get(dc.id, rt) == rt else ""
|
|
611
617
|
if any(dflt for _n, dflt, _f in fparams):
|
|
612
618
|
self.fn_params[dc.id] = fparams
|
|
613
619
|
self._add_decl(dc, kind)
|
|
@@ -1970,11 +1976,28 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
1970
1976
|
**({"via": write} if isinstance(write, str) else {}))
|
|
1971
1977
|
self.st["stored_property_writes" if write else "stored_property_reads"] += 1
|
|
1972
1978
|
|
|
1973
|
-
def _local_type(self, decl: Decl, name: str, kf: KFile) -> str | None:
|
|
1974
|
-
"""`val d = Cart(...)` inside the function body: the constructed type of a local
|
|
1979
|
+
def _local_type(self, decl: Decl, name: str, kf: KFile, depth: int = 0) -> str | None:
|
|
1980
|
+
"""`val d = Cart(...)` inside the function body: the constructed type of a local; also `val g: Garage<E>`,
|
|
1981
|
+
`val g = Garage<E>(..)` and `val e = shop.engine()` through the call chain's declared result (#109)."""
|
|
1975
1982
|
src = "\n".join(kf.src.decode("utf-8", "replace").split("\n")[decl.line - 1:decl.end])
|
|
1976
|
-
m = re.search(r"\b(?:val|var)\s+" + re.escape(name) +
|
|
1977
|
-
|
|
1983
|
+
m = re.search(r"\b(?:val|var)\s+" + re.escape(name) +
|
|
1984
|
+
r"\s*(?::\s*([A-Z][\w.]*(?:<[^=\n]*?>)?))?\s*=\s*([A-Z][\w.]*(?:<[^=\n(){}]*?>)?)\s*\(", src)
|
|
1985
|
+
if m:
|
|
1986
|
+
return m.group(1) or m.group(2)
|
|
1987
|
+
m = re.search(r"\b(?:val|var)\s+" + re.escape(name) + r"\s*(?::\s*([A-Z][\w.]*(?:<[^=\n]*?>)?)\s*\??)?\s*="
|
|
1988
|
+
r"\s*([^\n;]*)", src)
|
|
1989
|
+
if not m:
|
|
1990
|
+
return None
|
|
1991
|
+
if m.group(1):
|
|
1992
|
+
return m.group(1)
|
|
1993
|
+
rhs = m.group(2).strip()
|
|
1994
|
+
if depth > 2 or not re.fullmatch(r"[a-z_][\w]*(?:\([^()]*\))?(?:\s*[?!]*\.\s*\w+(?:\([^()]*\))?)*", rhs) \
|
|
1995
|
+
or rhs.split(".")[0].split("(")[0] == name:
|
|
1996
|
+
return None
|
|
1997
|
+
if "(" not in rhs and "." not in rhs:
|
|
1998
|
+
return None
|
|
1999
|
+
c, args = self._expr_type(rhs, kf, decl, depth + 1)
|
|
2000
|
+
return (c.name + (f"<{', '.join(args)}>" if args else "")) if c is not None else None
|
|
1978
2001
|
|
|
1979
2002
|
def _prop_member(self, cls: Decl, name: str, depth: int = 0) -> list[Decl]:
|
|
1980
2003
|
hit = self.prop_members.get(cls.fqn, {}).get(name)
|
|
@@ -2056,6 +2079,140 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
2056
2079
|
**({"binding": how} if how else {}))
|
|
2057
2080
|
self.st[{"read": "property_reads", "write": "property_writes"}.get(m, "property_read_writes")] += 1
|
|
2058
2081
|
|
|
2082
|
+
def _ret_text(self, c) -> str | None:
|
|
2083
|
+
"""`fun f(): Garage<Engine>?` -> 'Garage<Engine>'; `fun f() = Engine(..)` -> 'Engine' (#109)."""
|
|
2084
|
+
kids = c.children
|
|
2085
|
+
seen_params = False
|
|
2086
|
+
for i, x in enumerate(kids):
|
|
2087
|
+
if x.type == "function_value_parameters":
|
|
2088
|
+
seen_params = True
|
|
2089
|
+
elif seen_params and x.type == ":" and i + 1 < len(kids):
|
|
2090
|
+
return self.t(kids[i + 1]).rstrip("?! ").strip()
|
|
2091
|
+
elif seen_params and x.type == "function_body":
|
|
2092
|
+
m = re.match(r"=\s*([A-Z]\w*(?:<[^=\n(){}]*?>)?)\s*\(", self.t(x))
|
|
2093
|
+
return m.group(1) if m else None
|
|
2094
|
+
return None
|
|
2095
|
+
|
|
2096
|
+
@staticmethod
|
|
2097
|
+
def _split_type(txt: str | None) -> tuple[str | None, list]:
|
|
2098
|
+
"""'Garage<Engine, Map<A, B>>?' -> ('Garage', ['Engine', 'Map'])."""
|
|
2099
|
+
if not txt:
|
|
2100
|
+
return None, []
|
|
2101
|
+
m = re.match(r"\s*([A-Z][\w.]*)\s*(?:<(.*)>)?", txt, re.S)
|
|
2102
|
+
if not m:
|
|
2103
|
+
return None, []
|
|
2104
|
+
args, depth, cur = [], 0, ""
|
|
2105
|
+
for ch in (m.group(2) or "") + ("," if m.group(2) else ""):
|
|
2106
|
+
if ch in "<([":
|
|
2107
|
+
depth += 1
|
|
2108
|
+
elif ch in ">)]":
|
|
2109
|
+
depth -= 1
|
|
2110
|
+
if ch == "," and depth == 0:
|
|
2111
|
+
a = re.match(r"\s*(?:out\s+|in\s+)?([A-Z][\w.]*)", cur)
|
|
2112
|
+
args.append(a.group(1).split(".")[-1] if a else "")
|
|
2113
|
+
cur = ""
|
|
2114
|
+
else:
|
|
2115
|
+
cur += ch
|
|
2116
|
+
return m.group(1).split(".")[-1], args
|
|
2117
|
+
|
|
2118
|
+
def _gparams(self, cls: Decl) -> list[str]:
|
|
2119
|
+
cache = self.__dict__.setdefault("_gp_cache", {})
|
|
2120
|
+
if cls.id not in cache:
|
|
2121
|
+
src = self._ksrc.get(cls.file, b"").decode("utf-8", "replace").split("\n")[cls.line - 1:cls.line + 2]
|
|
2122
|
+
m = re.search(r"\b(?:class|interface)\s+" + re.escape(cls.name) + r"\s*<([^>{(]*)>", "\n".join(src))
|
|
2123
|
+
cache[cls.id] = [re.split(r"[:\s]", re.sub(r"^\s*(?:out|in|reified)\s+", "", x).strip())[0]
|
|
2124
|
+
for x in m.group(1).split(",")] if m else []
|
|
2125
|
+
return cache[cls.id]
|
|
2126
|
+
|
|
2127
|
+
def _full_type(self, where: Decl | None, name: str, ty: str | None) -> str | None:
|
|
2128
|
+
"""Parameter / property types are kept without their generic arguments; read them back from the declaring
|
|
2129
|
+
span (`val garage: Garage<Engine>`, `fun f(g: Garage<Engine>)`) when the stored type is generic there."""
|
|
2130
|
+
if where is None or not ty or "<" in ty:
|
|
2131
|
+
return ty
|
|
2132
|
+
src = "\n".join(self._ksrc.get(where.file, b"").decode("utf-8", "replace").split("\n")[where.line - 1:where.end])
|
|
2133
|
+
m = re.search(r"\b" + re.escape(name) + r"\s*:\s*((?:[\w]+\.)*" + re.escape(ty) + r"\s*<[^=\n(){}]*>)", src)
|
|
2134
|
+
return m.group(1) if m else ty
|
|
2135
|
+
|
|
2136
|
+
def _as_class(self, txt: str | None, owner: Decl | None, args: list, kf: KFile) -> tuple:
|
|
2137
|
+
"""A declared type text read on a receiver: a generic parameter of `owner` becomes the receiver's argument."""
|
|
2138
|
+
name, targs = self._split_type(txt)
|
|
2139
|
+
if name is None:
|
|
2140
|
+
return None, []
|
|
2141
|
+
if owner is not None:
|
|
2142
|
+
gp = self._gparams(owner)
|
|
2143
|
+
if name in gp:
|
|
2144
|
+
i = gp.index(name)
|
|
2145
|
+
name, targs = (args[i] if i < len(args) and args[i] else None), []
|
|
2146
|
+
if name is None:
|
|
2147
|
+
return None, []
|
|
2148
|
+
c = self._class_of(name, kf)
|
|
2149
|
+
return c, targs
|
|
2150
|
+
|
|
2151
|
+
def _expr_type(self, txt: str, kf: KFile, decl: Decl | None, depth: int = 0) -> tuple:
|
|
2152
|
+
"""The project class of a receiver expression (`shop.engine()`, `Garage<E>(e).get()`, `makeShop().engine()`,
|
|
2153
|
+
`repo.items.first()`), with its generic arguments; (None, []) when a step is not known (#109)."""
|
|
2154
|
+
if depth > 3 or not txt:
|
|
2155
|
+
return None, []
|
|
2156
|
+
segs, d, cut, q = [], 0, 0, False
|
|
2157
|
+
t = txt.strip()
|
|
2158
|
+
for i, ch in enumerate(t):
|
|
2159
|
+
if ch == '"':
|
|
2160
|
+
q = not q
|
|
2161
|
+
if q:
|
|
2162
|
+
continue
|
|
2163
|
+
if ch in "([{<" and not (ch == "<" and not t[cut:i].strip()[:1].isupper()):
|
|
2164
|
+
d += 1
|
|
2165
|
+
elif ch in ")]}>" and d > 0:
|
|
2166
|
+
d -= 1
|
|
2167
|
+
elif ch == "." and d == 0:
|
|
2168
|
+
segs.append(t[cut:i])
|
|
2169
|
+
cut = i + 1
|
|
2170
|
+
segs.append(t[cut:])
|
|
2171
|
+
segs = [x.strip().rstrip("?!").strip() for x in segs]
|
|
2172
|
+
cls = self.classes.get(decl.cls) if decl is not None and decl.cls else None
|
|
2173
|
+
cur, args = None, []
|
|
2174
|
+
for i, seg in enumerate(segs):
|
|
2175
|
+
m = re.match(r"^([A-Za-z_]\w*)\s*(<[^=\n(){}]*?>)?\s*(\(|\{)?", seg)
|
|
2176
|
+
if not m:
|
|
2177
|
+
return None, []
|
|
2178
|
+
ident, ga, called = m.group(1), m.group(2), m.group(3)
|
|
2179
|
+
if i == 0:
|
|
2180
|
+
if ident == "this":
|
|
2181
|
+
cur = cls
|
|
2182
|
+
elif ident[:1].isupper():
|
|
2183
|
+
cur = self._class_of(ident, kf)
|
|
2184
|
+
args = self._split_type(ident + (ga or ""))[1]
|
|
2185
|
+
elif called:
|
|
2186
|
+
ds = [x for x in self._member(cls, ident) if x.kind != "class"] if cls is not None else []
|
|
2187
|
+
if not ds:
|
|
2188
|
+
ds = [x for x in self.by_name.get(ident, []) if x.kind == "function"]
|
|
2189
|
+
rets = {self.rets.get(x.id) for x in ds}
|
|
2190
|
+
if len(rets) != 1 or not next(iter(rets)):
|
|
2191
|
+
return None, []
|
|
2192
|
+
cur, args = self._as_class(next(iter(rets)), None, [], kf)
|
|
2193
|
+
else:
|
|
2194
|
+
ty = (self._full_type(decl, ident, decl.types.get(ident)) if decl is not None else None) or \
|
|
2195
|
+
(self._full_type(cls, ident, self._field_type(cls, ident)) if cls is not None else None) or \
|
|
2196
|
+
(self._local_type(decl, ident, kf, depth + 1) if decl is not None and decl.kind != "class" else None)
|
|
2197
|
+
cur, args = self._as_class(ty, None, [], kf)
|
|
2198
|
+
if cur is None:
|
|
2199
|
+
return None, []
|
|
2200
|
+
continue
|
|
2201
|
+
owner = cur
|
|
2202
|
+
if called:
|
|
2203
|
+
ds = [x for x in self._member(cur, ident) if x.kind != "class"]
|
|
2204
|
+
rets = {self.rets.get(x.id) for x in ds}
|
|
2205
|
+
if len(rets) != 1 or not next(iter(rets)):
|
|
2206
|
+
return None, []
|
|
2207
|
+
dcls = self.classes.get(ds[0].cls) if ds[0].cls else cur
|
|
2208
|
+
cur, args = self._as_class(next(iter(rets)), dcls, args, kf)
|
|
2209
|
+
else:
|
|
2210
|
+
ty = self._full_type(cur, ident, self._field_type(cur, ident))
|
|
2211
|
+
cur, args = self._as_class(ty, owner, args, kf)
|
|
2212
|
+
if cur is None:
|
|
2213
|
+
return None, []
|
|
2214
|
+
return cur, args
|
|
2215
|
+
|
|
2059
2216
|
def _targets(self, name: str, recv: str | None, kf: KFile, decl: Decl | None) -> list[Decl]:
|
|
2060
2217
|
cls = self.classes.get(decl.cls) if decl is not None and decl.cls else None
|
|
2061
2218
|
if recv is None or recv == "this":
|
|
@@ -2098,6 +2255,13 @@ class KotlinPlugin(LanguagePlugin):
|
|
|
2098
2255
|
tyname = decl.types.get(rname)
|
|
2099
2256
|
if tyname is None and cls is not None:
|
|
2100
2257
|
tyname = self._field_type(cls, rname)
|
|
2258
|
+
if tyname is None and ("." in recv.strip("?!") or "(" in recv or rname[:1].islower()):
|
|
2259
|
+
tc, _args = self._expr_type(recv, kf, decl) # `shop.engine().run()`, a local from a call (#109)
|
|
2260
|
+
if tc is not None:
|
|
2261
|
+
r = self._member(tc, name)
|
|
2262
|
+
if r:
|
|
2263
|
+
self._recv = tc
|
|
2264
|
+
return self._same_set(r, kf)
|
|
2101
2265
|
if tyname is None and rname[:1].isupper():
|
|
2102
2266
|
tyname = re.sub(r"\s*[({].*$", "", rname, flags=re.S) # `WishController().add(x)`: a WishController
|
|
2103
2267
|
if tyname:
|