cg-code-graph 0.23.8__tar.gz → 0.23.9__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.9}/PKG-INFO +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/platforms.py +35 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/plugin.py +169 -5
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/plugin.py +200 -14
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9/cg_code_graph.egg-info}/PKG-INFO +1 -1
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/SOURCES.txt +2 -0
- cg_code_graph-0.23.9/tests/test_dispatch_part3.py +122 -0
- cg_code_graph-0.23.9/tests/test_swift_platform_files.py +103 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/LICENSE +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/MANIFEST.in +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/README.md +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/cli.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/cmake_sources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/indexer.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/install_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_graphs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/query.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/update_check.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/pyproject.toml +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/setup.cfg +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_affected.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cmake_sources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_coverage.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dead_wrappers.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_env.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_explore.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_gating.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_generated.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_install_rules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_201.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_202.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_204.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_205.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_206.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_208.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_210.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_211_used_at.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_212.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_212_langs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_218.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_219.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_222.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_java.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_receiver_narrowing.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_route_paths.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_link_origin.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_instructions.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_multi_graph.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_i18n.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_nitro.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_side_dirs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_php_http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_plans.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_route_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_spring.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_surface.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_tauri_events.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_update_check.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_values.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_viz.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_watch.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/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.9"
|
|
@@ -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:
|
|
@@ -181,6 +181,32 @@ LOCAL_DECL = re.compile(
|
|
|
181
181
|
# that function's declared return type when it is a project type (#218)
|
|
182
182
|
LOCAL_CALL = re.compile(r"\b(?:let|var)\s+(\w+)\s*=\s*(?:try\s*[?!]?\s+)?(?:await\s+)?(?:([A-Z]\w*)\s*\.\s*)?([a-z_]\w*)\s*\(")
|
|
183
183
|
|
|
184
|
+
# `let g = Garage<Engine>(...)`, `let g: Garage<Engine> = ...`, `var g: Garage<Engine>`: the generic arguments (#109)
|
|
185
|
+
GENERIC_USE = re.compile(r"(?::\s*|=\s*(?:try\s*[?!]?\s+)?(?:await\s+)?)([A-Z][\w.]*)\s*<([^=\n(){}]*?)>")
|
|
186
|
+
LOCAL_GENERIC = re.compile(r"\b(?:let|var)\s+(\w+)\s*" + GENERIC_USE.pattern)
|
|
187
|
+
# `let e = shop.engine()`, `let x = a.b.c()`: a local initialised from a call chain on a value, typed when the chain is (#109)
|
|
188
|
+
LOCAL_CHAIN = re.compile(r"\b(?:let|var)\s+(\w+)\s*=\s*(?:try\s*[?!]?\s+)?(?:await\s+)?"
|
|
189
|
+
r"([a-z_]\w*(?:\s*\([^()\n]*\))?(?:\s*[?!]?\.\s*\w+(?:\s*\([^()\n]*\))?)+)[ \t]*(?=\n|$|;)")
|
|
190
|
+
TYPE_HEAD = re.compile(r"\b(?:struct|class|enum|actor|protocol)\s+(\w+)\s*<([^>{]*)>")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _gargs(txt: str) -> list[str]:
|
|
194
|
+
"""`Engine, [String: Int]` -> ['Engine', '']: the top-level generic arguments, simple type names only."""
|
|
195
|
+
out, depth, cur = [], 0, ""
|
|
196
|
+
for ch in txt + ",":
|
|
197
|
+
if ch in "<[(":
|
|
198
|
+
depth += 1
|
|
199
|
+
elif ch in ">])":
|
|
200
|
+
depth -= 1
|
|
201
|
+
if ch == "," and depth == 0:
|
|
202
|
+
m = re.fullmatch(r"\s*([A-Z][\w.]*)\s*[?!]?\s*", cur)
|
|
203
|
+
out.append(m.group(1) if m else "")
|
|
204
|
+
cur = ""
|
|
205
|
+
else:
|
|
206
|
+
cur += ch
|
|
207
|
+
return out
|
|
208
|
+
|
|
209
|
+
|
|
184
210
|
PRIVATE_MODS = frozenset({"private", "fileprivate"})
|
|
185
211
|
|
|
186
212
|
|
|
@@ -509,6 +535,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
509
535
|
self.prop_refs: list[tuple] = [] # (owner, name, receiver | None, line, sf, decl, write)
|
|
510
536
|
self.sigs: dict[str, list] = defaultdict(list) # function / init node id -> [((label, optional), ...)]
|
|
511
537
|
self._multi_file: set[str] = set() # nodes shared by same-name declarations in several files or of mixed access
|
|
538
|
+
self._srcs: dict[str, bytes] = {} # file -> source, for generic parameter lists (#109)
|
|
539
|
+
self._pargs: dict[tuple, list] = {} # (type fqn, property) -> generic arguments of its declared type (#109)
|
|
512
540
|
self.rets: dict[str, str] = {} # function / method node id -> declared return type name ('' when overloads differ)
|
|
513
541
|
self.http: list[dict] = []
|
|
514
542
|
self.navs: list[tuple] = [] # (owner, view type name, how, file, line)
|
|
@@ -548,6 +576,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
548
576
|
errs[rel] = tree_spans(tree.root_node)
|
|
549
577
|
sfiles.append(SFile(rel, src, tree))
|
|
550
578
|
sfiles[-1].attr_blocks = blocks
|
|
579
|
+
self._srcs[rel] = src
|
|
551
580
|
self._fd: dict[str, list[Decl]] = defaultdict(list)
|
|
552
581
|
self._avail_regions: dict[str, list] = {}
|
|
553
582
|
self.deploy = deployment_targets(project.root)
|
|
@@ -595,6 +624,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
595
624
|
self.st["routes_unresolved_handler"] += 1
|
|
596
625
|
self.file_report = {"seen": [sf.rel for sf in sfiles] + failed, "parse_failed": failed, "syntax_errors": errs}
|
|
597
626
|
mode = self._exact(project, [sf.rel for sf in sfiles])
|
|
627
|
+
self._sfiles = sfiles
|
|
598
628
|
self._apply_available()
|
|
599
629
|
st = dict(self.st)
|
|
600
630
|
st.update({"mode": mode, "files": len(sfiles), "declarations": len(self.decls),
|
|
@@ -700,6 +730,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
700
730
|
self._raw.setdefault(attrs[-1], self.t(m))
|
|
701
731
|
else:
|
|
702
732
|
mods.update(self.t(m).split())
|
|
733
|
+
elif c.type == "class" and n.type != "class_declaration":
|
|
734
|
+
mods.add("class") # a bare `class func make()` / `class var x`: the keyword is no modifier node
|
|
703
735
|
return attrs, mods
|
|
704
736
|
|
|
705
737
|
def _name(self, n) -> str | None:
|
|
@@ -947,6 +979,9 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
947
979
|
tn = m.group(1) if m else None
|
|
948
980
|
if nm and tn:
|
|
949
981
|
d.types[nm] = tn
|
|
982
|
+
g = GENERIC_USE.search(self.t(x))
|
|
983
|
+
if g and g.group(1).split(".")[-1] == tn.split(".")[-1]:
|
|
984
|
+
self._pargs[(d.fqn, nm)] = _gargs(g.group(2))
|
|
950
985
|
|
|
951
986
|
def _field(self, cls: Decl, nm: str, sf: SFile, c, attrs: list):
|
|
952
987
|
"""A stored instance property (`var count = 0`, `@State private var value`, `@Published var items`) is a
|
|
@@ -1478,8 +1513,11 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
1478
1513
|
suf = next((x for x in c.children if x.type == "call_suffix"), None)
|
|
1479
1514
|
args = next((x for x in suf.children if x.type == "value_arguments"), None) if suf is not None else None
|
|
1480
1515
|
lam = next((x for x in suf.children if x.type in ("lambda_literal", "annotated_lambda")), None) if suf is not None else None
|
|
1481
|
-
if f.type == "simple_identifier":
|
|
1516
|
+
if f.type == "simple_identifier" or self.t(f) == "Self":
|
|
1482
1517
|
return None, self.t(f), args, lam, line
|
|
1518
|
+
if f.type == "prefix_expression" and len(f.children) == 2 and self.t(f.children[0]) == "." \
|
|
1519
|
+
and f.children[1].type == "simple_identifier":
|
|
1520
|
+
return ".", self.t(f.children[1]), args, lam, line # `.init(x: 1)`: typed by its context (#108)
|
|
1483
1521
|
if f.type == "navigation_expression":
|
|
1484
1522
|
target = f.child_by_field_name("target") or f.children[0]
|
|
1485
1523
|
sfx = next((x for x in f.children if x.type == "navigation_suffix"), None)
|
|
@@ -1517,10 +1555,39 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
1517
1555
|
out.append((self.t(lab).strip() if lab is not None else None, val))
|
|
1518
1556
|
return out
|
|
1519
1557
|
|
|
1558
|
+
def _implicit_ctx(self, c, decl: Decl | None) -> str | None:
|
|
1559
|
+
"""The contextual type of an implicit member call `.init(...)` / `.make(...)` (#108): the annotation of the
|
|
1560
|
+
property / local it initialises, or the declared return type of the function whose result it is."""
|
|
1561
|
+
p, cur = c.parent, c
|
|
1562
|
+
while p is not None and p.type in ("parenthesized_expression", "try_expression", "await_expression"):
|
|
1563
|
+
cur, p = p, p.parent
|
|
1564
|
+
if p is None:
|
|
1565
|
+
return None
|
|
1566
|
+
if p.type == "property_declaration":
|
|
1567
|
+
ta = next((x for x in p.children if x.type == "type_annotation"), None)
|
|
1568
|
+
if ta is not None:
|
|
1569
|
+
m = re.match(r":\s*([A-Z][\w.]*)\s*[?!]?\s*$", self.t(ta))
|
|
1570
|
+
return m.group(1) if m else None
|
|
1571
|
+
return None
|
|
1572
|
+
ret_ctx = p.type == "control_transfer_statement" and self.t(p).startswith("return")
|
|
1573
|
+
if p.type == "statements" and len([x for x in p.children if x.is_named]) == 1 and p.parent is not None \
|
|
1574
|
+
and p.parent.type in ("function_body", "computed_property"):
|
|
1575
|
+
ret_ctx = True # `func moved() -> Point { .init(x: 1) }`
|
|
1576
|
+
if ret_ctx and decl is not None and decl.kind != "class":
|
|
1577
|
+
r = self.rets.get(decl.id)
|
|
1578
|
+
if r == "Self":
|
|
1579
|
+
return decl.cls
|
|
1580
|
+
return r or None
|
|
1581
|
+
return None
|
|
1582
|
+
|
|
1520
1583
|
def _call(self, c, sf: SFile, owner: str, decl: Decl | None, ctx: dict) -> bool:
|
|
1521
1584
|
recv, name, args, lam, line = self._callee(c)
|
|
1522
1585
|
if not name or not re.match(r"^\w+$", name):
|
|
1523
1586
|
return False
|
|
1587
|
+
if recv == ".":
|
|
1588
|
+
recv = self._implicit_ctx(c, decl)
|
|
1589
|
+
if recv is None:
|
|
1590
|
+
return False
|
|
1524
1591
|
al = self._args(args)
|
|
1525
1592
|
# ---- SwiftUI / UIKit navigation
|
|
1526
1593
|
if name == "NavigationLink":
|
|
@@ -1922,20 +1989,28 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
1922
1989
|
if not opens or not closes:
|
|
1923
1990
|
return
|
|
1924
1991
|
if not neg:
|
|
1925
|
-
|
|
1992
|
+
cl = kids[closes[0]]
|
|
1993
|
+
# from the end of the check: the conditions after it (`, Assistant.isAvailable`) run only when it holds
|
|
1994
|
+
a, z = c.end_point[0] + 1, cl.start_point[0] + 1
|
|
1995
|
+
acol, zcol = c.end_point[1] - 1, cl.start_point[1]
|
|
1926
1996
|
else: # `if #unavailable(iOS 17) { old } else { new }`: the else branch
|
|
1927
1997
|
if len(opens) < 2:
|
|
1928
1998
|
return
|
|
1929
|
-
|
|
1999
|
+
o = kids[opens[1]]
|
|
2000
|
+
a, z = o.start_point[0] + 1, p.end_point[0] + 1
|
|
2001
|
+
acol, zcol = o.start_point[1], p.end_point[1]
|
|
1930
2002
|
elif p.type == "guard_statement" and not neg:
|
|
1931
2003
|
stmts = p.parent
|
|
1932
|
-
a, z = p.end_point[0] +
|
|
2004
|
+
a, z = p.end_point[0] + 1, (stmts.end_point[0] + 1 if stmts is not None else p.end_point[0] + 1)
|
|
2005
|
+
acol, zcol = p.end_point[1], (stmts.end_point[1] if stmts is not None else p.end_point[1])
|
|
1933
2006
|
else:
|
|
1934
2007
|
return
|
|
1935
2008
|
av = self._unmet(av, self.cur.rel if self.cur is not None else "", c.start_point[0] + 1,
|
|
1936
2009
|
"#unavailable" if neg else "#available")
|
|
1937
2010
|
if z >= a and av:
|
|
1938
|
-
|
|
2011
|
+
# columns too (#225): `} else { legacy() }` on the closing line, or a one-line `if #available { } else { }`,
|
|
2012
|
+
# is outside the guarded branch
|
|
2013
|
+
regions.append((a, z, av, acol, zcol))
|
|
1939
2014
|
self.st["available_branches"] += 1
|
|
1940
2015
|
|
|
1941
2016
|
def _unmet(self, av: dict, rel: str, line: int, what: str) -> dict:
|
|
@@ -1961,14 +2036,25 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
1961
2036
|
"""References inside `if #available(...)` / after `guard #available(...)`: edge attrs.available."""
|
|
1962
2037
|
if not any(self._avail_regions.values()):
|
|
1963
2038
|
return
|
|
2039
|
+
srcs = {sf.rel: sf.src.split(b"\n") for sf in getattr(self, "_sfiles", ())}
|
|
1964
2040
|
for e in self.b.edges.values():
|
|
1965
2041
|
regs = self._avail_regions.get(e.file)
|
|
1966
2042
|
if not regs or e.line is None:
|
|
1967
2043
|
continue
|
|
1968
2044
|
av = {}
|
|
1969
|
-
for a, z, v in regs:
|
|
1970
|
-
if a <= e.line <= z:
|
|
1971
|
-
|
|
2045
|
+
for a, z, v, acol, zcol in regs:
|
|
2046
|
+
if not a <= e.line <= z:
|
|
2047
|
+
continue
|
|
2048
|
+
if e.line in (a, z) and e.file in srcs:
|
|
2049
|
+
dn = self.b.nodes.get(e.dst)
|
|
2050
|
+
nm = ((dn.name if dn is not None else None) or e.dst.rsplit(".", 1)[-1]).encode()
|
|
2051
|
+
ln = srcs[e.file][e.line - 1] if e.line - 1 < len(srcs[e.file]) else b""
|
|
2052
|
+
cols = [m.start() for m in re.finditer(rb"(?<![\w])" + re.escape(nm) + rb"(?![\w])", ln)]
|
|
2053
|
+
lo = acol if e.line == a else -1
|
|
2054
|
+
hi = zcol if e.line == z else len(ln) + 1
|
|
2055
|
+
if cols and not any(lo < c < hi for c in cols):
|
|
2056
|
+
continue
|
|
2057
|
+
av = self._vmax(av, v)
|
|
1972
2058
|
if av:
|
|
1973
2059
|
e.attrs = {**(e.attrs or {}), "available": av}
|
|
1974
2060
|
self.st["available_references"] += 1
|
|
@@ -2497,15 +2583,74 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2497
2583
|
found.append((m.start(), m.group(2), CLOSURE_PARAM_TYPES[m.group(1)]))
|
|
2498
2584
|
for m in LOCAL_CALL.finditer(txt):
|
|
2499
2585
|
found.append((m.start(), m.group(1), self._returned(m.group(2), m.group(3))))
|
|
2586
|
+
for m in LOCAL_CHAIN.finditer(txt):
|
|
2587
|
+
if m.group(2).split(".")[0].split("(")[0].strip() != m.group(1): # not `let x = x.next()`
|
|
2588
|
+
found.append((m.start(), m.group(1), ("chain", m.group(2))))
|
|
2589
|
+
gen = {}
|
|
2590
|
+
for m in LOCAL_GENERIC.finditer(txt):
|
|
2591
|
+
gen[m.start()] = _gargs(m.group(3))
|
|
2500
2592
|
for pos, nm, tn in sorted(found, key=lambda x: x[0]):
|
|
2501
|
-
out[nm].append((decl.line + txt.count("\n", 0, pos), tn))
|
|
2593
|
+
out[nm].append((decl.line + txt.count("\n", 0, pos), tn, gen.get(pos)))
|
|
2502
2594
|
cache[key] = out
|
|
2503
|
-
best = None
|
|
2504
|
-
for ln, tn in cache[key].get(ident, ()):
|
|
2595
|
+
best, self._largs = None, None
|
|
2596
|
+
for ln, tn, ga in cache[key].get(ident, ()):
|
|
2505
2597
|
if ln <= line:
|
|
2506
|
-
best = tn
|
|
2598
|
+
best, self._largs = tn, ga
|
|
2599
|
+
if isinstance(best, tuple):
|
|
2600
|
+
# typed by its initialiser's call chain, resolved now (a depth guard against `let a = b.f(); let b = a.g()`)
|
|
2601
|
+
guard = self.__dict__.setdefault("_chain_guard", set())
|
|
2602
|
+
if (key, ident) in guard or len(guard) > 4:
|
|
2603
|
+
return None
|
|
2604
|
+
guard.add((key, ident))
|
|
2605
|
+
try:
|
|
2606
|
+
kind, tn = self._recv_type(best[1], decl, self._encl_type(decl))
|
|
2607
|
+
self._largs = getattr(self, "_rargs", None)
|
|
2608
|
+
finally:
|
|
2609
|
+
guard.discard((key, ident))
|
|
2610
|
+
return tn if kind == "type" else None
|
|
2507
2611
|
return best
|
|
2508
2612
|
|
|
2613
|
+
def _gparams(self, t: Decl | None) -> list[str]:
|
|
2614
|
+
"""The generic parameter names of a project type (`struct Garage<T, U: Hashable>` -> ['T', 'U'])."""
|
|
2615
|
+
if t is None or t.file not in self._srcs:
|
|
2616
|
+
return []
|
|
2617
|
+
cache = self.__dict__.setdefault("_gp_cache", {})
|
|
2618
|
+
if t.id not in cache:
|
|
2619
|
+
lines = self._srcs[t.file].decode("utf-8", "replace").split("\n")[t.line - 1:t.line + 2]
|
|
2620
|
+
m = TYPE_HEAD.search("\n".join(lines))
|
|
2621
|
+
cache[t.id] = [re.split(r"[:\s]", x.strip())[0] for x in m.group(2).split(",")] \
|
|
2622
|
+
if m and m.group(1) == t.name else []
|
|
2623
|
+
return cache[t.id]
|
|
2624
|
+
|
|
2625
|
+
def _subst(self, ret: str | None, owner: Decl | None, recv_t: Decl | None, args: list | None) -> tuple:
|
|
2626
|
+
"""A member's declared type read on a receiver: `Self` is the receiver's type, a generic parameter of the
|
|
2627
|
+
declaring type is the receiver's generic argument (`Garage<Engine>.get() -> T` is an Engine). (fqn, args)."""
|
|
2628
|
+
if not ret:
|
|
2629
|
+
return None, None
|
|
2630
|
+
if ret == "Self" and recv_t is not None:
|
|
2631
|
+
return recv_t.fqn, args
|
|
2632
|
+
if owner is not None and args:
|
|
2633
|
+
gp = self._gparams(owner)
|
|
2634
|
+
if ret in gp and gp.index(ret) < len(args) and args[gp.index(ret)]:
|
|
2635
|
+
ret = args[gp.index(ret)]
|
|
2636
|
+
rt = self._type(ret)
|
|
2637
|
+
return (rt.fqn if rt is not None and "extension-only" not in rt.modifiers else None), None
|
|
2638
|
+
if owner is not None and ret in self._gparams(owner):
|
|
2639
|
+
return None, None
|
|
2640
|
+
rt = self._type(ret)
|
|
2641
|
+
return (rt.fqn if rt is not None and "extension-only" not in rt.modifiers else None), None
|
|
2642
|
+
|
|
2643
|
+
def _call_result(self, t: Decl | None, name: str, static: bool, args: list | None) -> tuple:
|
|
2644
|
+
"""The type a call `T.name(...)` (static) / `value.name(...)` returns, when every declaration agrees (#109)."""
|
|
2645
|
+
if t is None:
|
|
2646
|
+
return None, None
|
|
2647
|
+
ds = [d for d in self._member(t, name) if d.kind == "method" and _static(d) == static]
|
|
2648
|
+
rets = {self.rets.get(d.id) for d in ds}
|
|
2649
|
+
if len(rets) != 1:
|
|
2650
|
+
return None, None
|
|
2651
|
+
owner = self.types.get(ds[0].cls) if ds[0].cls else None
|
|
2652
|
+
return self._subst(next(iter(rets)), owner, t, args)
|
|
2653
|
+
|
|
2509
2654
|
def _returned(self, tname: str | None, fname: str) -> str | None:
|
|
2510
2655
|
"""The project type a call's result has: the declared return type of the one free function `fname` (of the
|
|
2511
2656
|
static `tname.fname` when qualified), when every declaration of it agrees and it is a project type (#218)."""
|
|
@@ -2534,12 +2679,19 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2534
2679
|
if not segs:
|
|
2535
2680
|
return "unknown", None
|
|
2536
2681
|
state: tuple[str, str | None] = ("unknown", None)
|
|
2682
|
+
args: list | None = None # the generic arguments of the value so far (#109)
|
|
2683
|
+
self._rargs = None
|
|
2537
2684
|
for i, seg in enumerate(segs):
|
|
2538
2685
|
seg = seg.rstrip("!?")
|
|
2539
2686
|
m = re.match(r"^([A-Za-z_]\w*)\s*(.*)$", seg, re.S)
|
|
2540
2687
|
if not m:
|
|
2541
2688
|
return "unknown", None
|
|
2542
2689
|
ident, rest = m.group(1), m.group(2).strip()
|
|
2690
|
+
targs = None
|
|
2691
|
+
if rest.startswith("<") and ident[:1].isupper(): # `Garage<Engine>(item: e)`
|
|
2692
|
+
g = re.match(r"<([^=\n(){}]*?)>\s*", rest)
|
|
2693
|
+
if g:
|
|
2694
|
+
targs, rest = _gargs(g.group(1)), rest[g.end():]
|
|
2543
2695
|
called = rest.startswith(("(", "{"))
|
|
2544
2696
|
sub = rest.startswith("[")
|
|
2545
2697
|
if i == 0:
|
|
@@ -2552,6 +2704,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2552
2704
|
t = self._type(ident)
|
|
2553
2705
|
if t is not None and "extension-only" not in t.modifiers:
|
|
2554
2706
|
state = ("type", t.fqn) if called else ("meta", t.fqn)
|
|
2707
|
+
args = targs
|
|
2555
2708
|
else: # an SDK type, its initializer or a value built from it
|
|
2556
2709
|
state = ("sdk", ident) if t is not None else self._sdk_or_unknown(ident)
|
|
2557
2710
|
if called and len(segs) == 1 and state[0] == "sdk":
|
|
@@ -2559,11 +2712,24 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2559
2712
|
if sub:
|
|
2560
2713
|
state = ("unknown", None)
|
|
2561
2714
|
continue
|
|
2562
|
-
if called: # a free function's result
|
|
2563
|
-
|
|
2715
|
+
if called: # a free function's (or own method's) result (#109)
|
|
2716
|
+
rt = None
|
|
2717
|
+
if cls is not None and self._member(cls, ident):
|
|
2718
|
+
own_static = bool(decl is not None and decl.kind != "class" and _static(decl))
|
|
2719
|
+
rt, args = self._call_result(cls, ident, own_static, None)
|
|
2720
|
+
elif not self.by_name.get(ident) or all(d.kind == "function" for d in self.by_name[ident]):
|
|
2721
|
+
rt, args = self._returned(None, ident), None
|
|
2722
|
+
if rt is None or sub:
|
|
2723
|
+
return "unknown", None
|
|
2724
|
+
state = ("type", rt)
|
|
2725
|
+
continue
|
|
2726
|
+
self._largs = None
|
|
2564
2727
|
ltn = self._local(decl, ident)
|
|
2728
|
+
args = self._largs if ltn else None
|
|
2565
2729
|
tn = ltn or (decl.types.get(ident) if decl is not None else None) or \
|
|
2566
2730
|
(cls.types.get(ident) if cls is not None else None)
|
|
2731
|
+
if not ltn and tn and cls is not None and not (decl is not None and ident in decl.types):
|
|
2732
|
+
args = self._pargs.get((cls.fqn, ident))
|
|
2567
2733
|
if tn is None or sub:
|
|
2568
2734
|
return "unknown", None
|
|
2569
2735
|
t = self._type(tn)
|
|
@@ -2582,12 +2748,26 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2582
2748
|
# anything further down a chain (`Text("x").font(...)`) is some SDK value
|
|
2583
2749
|
state = ("sdk", tname if not called and i == 1 and segs[0][:1].isupper() else None)
|
|
2584
2750
|
continue
|
|
2751
|
+
if kind in ("type", "meta") and called and not sub:
|
|
2752
|
+
# `shop.engine().run()`, `Garage<E>(..).get().run()`, `Sub.make().ping()` (#109)
|
|
2753
|
+
rt, args = self._call_result(self._type(tname), ident, kind == "meta", args)
|
|
2754
|
+
if rt is None:
|
|
2755
|
+
return "unknown", None
|
|
2756
|
+
state = ("type", rt)
|
|
2757
|
+
continue
|
|
2585
2758
|
if kind in ("type", "meta") and not called and not sub:
|
|
2586
2759
|
tc = self.types.get(tname)
|
|
2587
2760
|
tn = tc.types.get(ident) if tc is not None else None
|
|
2761
|
+
if tc is not None and tn and tn in self._gparams(tc) and args: # `let item: T` on Garage<E>
|
|
2762
|
+
rt, _ = self._subst(tn, tc, tc, args)
|
|
2763
|
+
if rt:
|
|
2764
|
+
state, args = ("type", rt), None
|
|
2765
|
+
continue
|
|
2766
|
+
return "unknown", None
|
|
2588
2767
|
t = self._type(tn)
|
|
2589
2768
|
if t is not None and "extension-only" not in t.modifiers:
|
|
2590
2769
|
state = ("type", t.fqn)
|
|
2770
|
+
args = self._pargs.get((tc.fqn, ident)) if tc is not None else None
|
|
2591
2771
|
continue
|
|
2592
2772
|
if tn:
|
|
2593
2773
|
state = ("sdk", tn) if t is not None else self._sdk_or_unknown(tn)
|
|
@@ -2595,6 +2775,7 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2595
2775
|
return state
|
|
2596
2776
|
continue
|
|
2597
2777
|
return "unknown", None
|
|
2778
|
+
self._rargs = args
|
|
2598
2779
|
return state
|
|
2599
2780
|
|
|
2600
2781
|
def _fitting(self, ds: list, labels: tuple, trailing: bool) -> list:
|
|
@@ -2681,6 +2862,8 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2681
2862
|
bool(decl is not None and decl.kind != "class" and _static(decl))
|
|
2682
2863
|
return [d for d in fit if _static(d) == want] or (fit if recv is None else
|
|
2683
2864
|
[d for d in fit if d.name == "init"])
|
|
2865
|
+
if name == "Self" and cls is not None and "extension-only" not in cls.modifiers:
|
|
2866
|
+
return [cls] # `Self(x: 0)` inside the type: its initializer (#108)
|
|
2684
2867
|
if name[:1].isupper():
|
|
2685
2868
|
t = self.types.get(name)
|
|
2686
2869
|
return [t] if t is not None else []
|
|
@@ -2691,6 +2874,9 @@ class SwiftPlugin(LanguagePlugin):
|
|
|
2691
2874
|
return [min(cands, key=lambda d: ("@" in d.id, d.line))]
|
|
2692
2875
|
return cands if len(cands) == 1 else []
|
|
2693
2876
|
kind, tname = self._recv_type(recv, decl, cls)
|
|
2877
|
+
if kind == "meta" and name[:1].isupper():
|
|
2878
|
+
nt = self.types.get(f"{tname}.{name}") # `Point.Delta(dx: 1)`: a nested type's initializer (#108)
|
|
2879
|
+
return [nt] if nt is not None and "extension-only" not in nt.modifiers else []
|
|
2694
2880
|
if kind in ("type", "meta"):
|
|
2695
2881
|
tc = self._type(tname)
|
|
2696
2882
|
self._recv = tc
|