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.
Files changed (418) hide show
  1. {cg_code_graph-0.23.8/cg_code_graph.egg-info → cg_code_graph-0.23.9}/PKG-INFO +1 -1
  2. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/__init__.py +1 -1
  3. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/platforms.py +35 -0
  4. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/plugin.py +169 -5
  5. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/plugin.py +200 -14
  6. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9/cg_code_graph.egg-info}/PKG-INFO +1 -1
  7. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/SOURCES.txt +2 -0
  8. cg_code_graph-0.23.9/tests/test_dispatch_part3.py +122 -0
  9. cg_code_graph-0.23.9/tests/test_swift_platform_files.py +103 -0
  10. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/LICENSE +0 -0
  11. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/MANIFEST.in +0 -0
  12. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/README.md +0 -0
  13. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/__main__.py +0 -0
  14. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/affected.py +0 -0
  15. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/agent_rules.py +0 -0
  16. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/agents.py +0 -0
  17. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/aitools.py +0 -0
  18. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/android_ipc.py +0 -0
  19. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/apple_ipc.py +0 -0
  20. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/apps.py +0 -0
  21. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/blindspots.py +0 -0
  22. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/bridges.py +0 -0
  23. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/brokers.py +0 -0
  24. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/cli.py +0 -0
  25. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/cmake_sources.py +0 -0
  26. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/concepts.py +0 -0
  27. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/config.py +0 -0
  28. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/__init__.py +0 -0
  29. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/cache.py +0 -0
  30. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/detect.py +0 -0
  31. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/env.py +0 -0
  32. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/extractors.py +0 -0
  33. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/fsutil.py +0 -0
  34. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/generated.py +0 -0
  35. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/model.py +0 -0
  36. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/paths.py +0 -0
  37. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/plugin.py +0 -0
  38. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/redact.py +0 -0
  39. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/store.py +0 -0
  40. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/core/syntax_errors.py +0 -0
  41. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/coverage.py +0 -0
  42. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/dart_isolates.py +0 -0
  43. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/doctor.py +0 -0
  44. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/explore.py +0 -0
  45. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/external.py +0 -0
  46. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/graphql.py +0 -0
  47. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/guard_facts.py +0 -0
  48. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/hooks.py +0 -0
  49. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/indexer.py +0 -0
  50. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/insecure_transport.py +0 -0
  51. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/install_rules.py +0 -0
  52. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/jobs.py +0 -0
  53. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/link.py +0 -0
  54. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/lint_async.py +0 -0
  55. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/local_ipc.py +0 -0
  56. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/local_sockets.py +0 -0
  57. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_graphs.py +0 -0
  58. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_install.py +0 -0
  59. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/mcp_server.py +0 -0
  60. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/parity.py +0 -0
  61. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/parity_structure.py +0 -0
  62. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/payload.py +0 -0
  63. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plans.py +0 -0
  64. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/platform_scan.py +0 -0
  65. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/__init__.py +0 -0
  66. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/__init__.py +0 -0
  67. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/content.py +0 -0
  68. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/astro/plugin.py +0 -0
  69. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  70. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  71. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  72. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/__init__.py +0 -0
  73. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/bridges.py +0 -0
  74. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  75. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  76. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  77. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/http.py +0 -0
  78. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/models.py +0 -0
  79. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/plugin.py +0 -0
  80. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/dart/program.py +0 -0
  81. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/__init__.py +0 -0
  82. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/extras.py +0 -0
  83. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/models.py +0 -0
  84. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/plugin.py +0 -0
  85. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/schemas.py +0 -0
  86. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/shapes.py +0 -0
  87. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/django/urls.py +0 -0
  88. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/express/__init__.py +0 -0
  89. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/express/plugin.py +0 -0
  90. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  91. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  92. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/__init__.py +0 -0
  93. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/exact.py +0 -0
  94. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/java/plugin.py +0 -0
  95. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  96. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/interop.py +0 -0
  97. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/jvm/spring.py +0 -0
  98. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  99. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  100. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  101. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  102. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  103. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/massassign.py +0 -0
  104. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  105. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/tests.py +0 -0
  106. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/laravel/values.py +0 -0
  107. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/__init__.py +0 -0
  108. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/gates.py +0 -0
  109. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/runner.py +0 -0
  110. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/scipread.py +0 -0
  111. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/native/ts.py +0 -0
  112. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nest/__init__.py +0 -0
  113. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nest/plugin.py +0 -0
  114. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  115. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  116. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  117. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  118. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/__init__.py +0 -0
  119. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/external.py +0 -0
  120. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  121. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  122. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  123. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/gating.py +0 -0
  124. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/http_client.py +0 -0
  125. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/inline_guards.py +0 -0
  126. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/plugin.py +0 -0
  127. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/php/strings.py +0 -0
  128. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/__init__.py +0 -0
  129. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/aitools.py +0 -0
  130. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/external.py +0 -0
  131. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/fields.py +0 -0
  132. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/plugin.py +0 -0
  133. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/refs.py +0 -0
  134. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/roots.py +0 -0
  135. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/socketio.py +0 -0
  136. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/subproc.py +0 -0
  137. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/tests.py +0 -0
  138. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/python/values.py +0 -0
  139. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  140. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  141. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/pyweb/values.py +0 -0
  142. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/__init__.py +0 -0
  143. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/cargo.py +0 -0
  144. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/plugin.py +0 -0
  145. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/rust/syntax.py +0 -0
  146. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/__init__.py +0 -0
  147. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/importer.py +0 -0
  148. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/scip.proto +0 -0
  149. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  150. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  151. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  152. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/__init__.py +0 -0
  153. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  154. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/exact.py +0 -0
  155. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  156. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/swift/packages.py +0 -0
  157. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/__init__.py +0 -0
  158. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  159. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  160. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  161. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  162. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  163. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  164. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/nav.py +0 -0
  165. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/plugin.py +0 -0
  166. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/ts/react_router.py +0 -0
  167. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  168. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/common.py +0 -0
  169. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/plugins/tsweb/data.py +0 -0
  170. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/__init__.py +0 -0
  171. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/c_cpp.yaml +0 -0
  172. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/common.yaml +0 -0
  173. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/dart.yaml +0 -0
  174. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/django-ninja.yaml +0 -0
  175. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/django.yaml +0 -0
  176. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  177. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/express.yaml +0 -0
  178. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/java.yaml +0 -0
  179. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/kotlin.yaml +0 -0
  180. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/laravel.yaml +0 -0
  181. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nest.yaml +0 -0
  182. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nextjs.yaml +0 -0
  183. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/nuxt.yaml +0 -0
  184. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/php.yaml +0 -0
  185. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/python.yaml +0 -0
  186. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/react-router.yaml +0 -0
  187. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/rust.yaml +0 -0
  188. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/spring.yaml +0 -0
  189. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/swift.yaml +0 -0
  190. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/presets/typescript.yaml +0 -0
  191. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/process_runs.py +0 -0
  192. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/__init__.py +0 -0
  193. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/builtin.py +0 -0
  194. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/matchers.py +0 -0
  195. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/protocols/view.py +0 -0
  196. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/query.py +0 -0
  197. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime.py +0 -0
  198. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_events.py +0 -0
  199. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_native.py +0 -0
  200. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/realtime_ws.py +0 -0
  201. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/roundtrip.py +0 -0
  202. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/routes.py +0 -0
  203. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/rpc.py +0 -0
  204. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/sdk_systems.py +0 -0
  205. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/sockets.py +0 -0
  206. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/ssrf_input.py +0 -0
  207. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/starters.py +0 -0
  208. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/surface.py +0 -0
  209. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/tests_index.py +0 -0
  210. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/udp_apps.py +0 -0
  211. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/update_check.py +0 -0
  212. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/__init__.py +0 -0
  213. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/graph.py +0 -0
  214. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/server.py +0 -0
  215. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/app.css +0 -0
  216. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/app.js +0 -0
  217. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/index.html +0 -0
  218. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/layered.js +0 -0
  219. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  220. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  221. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  222. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  223. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  224. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/package-lock.json +0 -0
  225. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/package.json +0 -0
  226. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  227. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/watch.py +0 -0
  228. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/webhook_subs.py +0 -0
  229. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/webhooks.py +0 -0
  230. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph/xcode.py +0 -0
  231. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  232. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/entry_points.txt +0 -0
  233. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/requires.txt +0 -0
  234. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/cg_code_graph.egg-info/top_level.txt +0 -0
  235. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/pyproject.toml +0 -0
  236. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/setup.cfg +0 -0
  237. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_affected.py +0 -0
  238. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_agents_install.py +0 -0
  239. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_agents_md.py +0 -0
  240. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ai_tools.py +0 -0
  241. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_android_ipc.py +0 -0
  242. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_apple_ipc.py +0 -0
  243. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro.py +0 -0
  244. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro_content.py +0 -0
  245. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_astro_server.py +0 -0
  246. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_bridges.py +0 -0
  247. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_bridges_pigeon_monorepo.py +0 -0
  248. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_brokers.py +0 -0
  249. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_clean.py +0 -0
  250. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_invalidation.py +0 -0
  251. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cache_migration.py +0 -0
  252. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_channels_tests.py +0 -0
  253. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cli_output.py +0 -0
  254. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_cmake_sources.py +0 -0
  255. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_completeness.py +0 -0
  256. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_config_extras.py +0 -0
  257. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_coverage.py +0 -0
  258. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_coverage_ts_hint.py +0 -0
  259. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dart_isolates.py +0 -0
  260. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_db_connections.py +0 -0
  261. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dead_wrappers.py +0 -0
  262. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_dispatch_interfaces.py +0 -0
  263. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_django_flutter.py +0 -0
  264. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_docs_languages.py +0 -0
  265. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_docs_links.py +0 -0
  266. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_echo_ref.py +0 -0
  267. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_echo_wrapper.py +0 -0
  268. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_elysia.py +0 -0
  269. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_enum_constants.py +0 -0
  270. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_env.py +0 -0
  271. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_explore.py +0 -0
  272. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_external.py +0 -0
  273. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_fp_batch.py +0 -0
  274. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_gating.py +0 -0
  275. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_generated.py +0 -0
  276. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_graphql.py +0 -0
  277. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_hooks.py +0 -0
  278. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_impact_overrides.py +0 -0
  279. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_index_isolation.py +0 -0
  280. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_inherited_overrides.py +0 -0
  281. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_inline_guards.py +0 -0
  282. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_install_rules.py +0 -0
  283. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_192.py +0 -0
  284. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_201.py +0 -0
  285. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_202.py +0 -0
  286. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_203.py +0 -0
  287. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_204.py +0 -0
  288. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_205.py +0 -0
  289. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_206.py +0 -0
  290. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_207.py +0 -0
  291. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_208.py +0 -0
  292. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_209.py +0 -0
  293. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_210.py +0 -0
  294. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_211.py +0 -0
  295. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_211_used_at.py +0 -0
  296. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_212.py +0 -0
  297. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_212_langs.py +0 -0
  298. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_218.py +0 -0
  299. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_219.py +0 -0
  300. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_issue_222.py +0 -0
  301. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_java.py +0 -0
  302. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_java_exact.py +0 -0
  303. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_jobs.py +0 -0
  304. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_js_refs.py +0 -0
  305. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_js_runtime.py +0 -0
  306. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin.py +0 -0
  307. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_binding.py +0 -0
  308. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_exact.py +0 -0
  309. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_fields.py +0 -0
  310. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_mixed.py +0 -0
  311. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_nav_consts.py +0 -0
  312. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_kotlin_props.py +0 -0
  313. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_determinism.py +0 -0
  314. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_receiver_narrowing.py +0 -0
  315. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_resources.py +0 -0
  316. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_laravel_route_paths.py +0 -0
  317. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_link_origin.py +0 -0
  318. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_lint_async.py +0 -0
  319. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_listing_files.py +0 -0
  320. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_local_ipc.py +0 -0
  321. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_local_sockets.py +0 -0
  322. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mass_assignment.py +0 -0
  323. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp.py +0 -0
  324. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_index.py +0 -0
  325. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_install.py +0 -0
  326. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_instructions.py +0 -0
  327. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_mcp_multi_graph.py +0 -0
  328. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_cfamily.py +0 -0
  329. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_concurrency.py +0 -0
  330. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_native_rust.py +0 -0
  331. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_i18n.py +0 -0
  332. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_import_dirs.py +0 -0
  333. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_nitro.py +0 -0
  334. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_rootsrc.py +0 -0
  335. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_nuxt_side_dirs.py +0 -0
  336. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_packaging.py +0 -0
  337. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity.py +0 -0
  338. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity_fields.py +0 -0
  339. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_parity_structure.py +0 -0
  340. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_php_http.py +0 -0
  341. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_php_props.py +0 -0
  342. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_plain_js.py +0 -0
  343. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_plans.py +0 -0
  344. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platform_gaps.py +0 -0
  345. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platform_type_variants.py +0 -0
  346. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platforms.py +0 -0
  347. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_platforms_apple.py +0 -0
  348. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_presets_config.py +0 -0
  349. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_process_ipc.py +0 -0
  350. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_process_runs.py +0 -0
  351. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_protocols.py +0 -0
  352. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_app_tests_module.py +0 -0
  353. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_collection_chains.py +0 -0
  354. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_compat.py +0 -0
  355. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_entry_refs.py +0 -0
  356. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_fields.py +0 -0
  357. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_infer_cycles.py +0 -0
  358. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_roots.py +0 -0
  359. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_subprocess_tests.py +0 -0
  360. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_tests.py +0 -0
  361. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_hosts.py +0 -0
  362. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_routes.py +0 -0
  363. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_python_web_routes_more.py +0 -0
  364. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_react_router.py +0 -0
  365. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_readers_writers_specs.py +0 -0
  366. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_realtime.py +0 -0
  367. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_realtime_native.py +0 -0
  368. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_redact_salt.py +0 -0
  369. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_request_keys.py +0 -0
  370. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_roundtrip.py +0 -0
  371. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_route_specs.py +0 -0
  372. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_route_tables.py +0 -0
  373. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_routes_search_explain.py +0 -0
  374. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_rpc.py +0 -0
  375. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_scip_health.py +0 -0
  376. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external.py +0 -0
  377. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external_infra.py +0 -0
  378. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sdk_external_mail.py +0 -0
  379. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_snippet.py +0 -0
  380. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_sockets.py +0 -0
  381. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_spring.py +0 -0
  382. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ssrf.py +0 -0
  383. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_starters_budget.py +0 -0
  384. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_surface.py +0 -0
  385. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_surface_transport.py +0 -0
  386. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift.py +0 -0
  387. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_binding.py +0 -0
  388. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_exact.py +0 -0
  389. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_facts.py +0 -0
  390. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_fields.py +0 -0
  391. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_modules.py +0 -0
  392. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_more.py +0 -0
  393. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_nav_values.py +0 -0
  394. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_parse_errors.py +0 -0
  395. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_props.py +0 -0
  396. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_sdk.py +0 -0
  397. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_testing.py +0 -0
  398. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_swift_values.py +0 -0
  399. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_tauri_events.py +0 -0
  400. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_tests_scope.py +0 -0
  401. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_fields.py +0 -0
  402. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_fields_js_vue.py +0 -0
  403. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_file_specs.py +0 -0
  404. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_frameworks.py +0 -0
  405. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_node_http.py +0 -0
  406. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_nuxt.py +0 -0
  407. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_ts_src_tsconfig.py +0 -0
  408. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_unguarded.py +0 -0
  409. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_update_check.py +0 -0
  410. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_values.py +0 -0
  411. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_viz.py +0 -0
  412. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_vue_nav.py +0 -0
  413. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_watch.py +0 -0
  414. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks.py +0 -0
  415. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks_152.py +0 -0
  416. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_webhooks_152b.py +0 -0
  417. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_websockets.py +0 -0
  418. {cg_code_graph-0.23.8 → cg_code_graph-0.23.9}/tests/test_workspace_link.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.23.8
3
+ Version: 0.23.9
4
4
  Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
5
5
  Author: cyberchronos00
6
6
  License-Expression: MIT
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.23.8"
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) # names and text from the original bytes; offsets are unchanged
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) + r"\s*(?::\s*([A-Z][\w.]*))?\s*=\s*([A-Z][\w.]*)\s*\(", src)
1977
- return (m.group(1) or m.group(2)) if m else None
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
- a, z = kids[opens[0]].start_point[0] + 1, kids[closes[0]].start_point[0] + 1
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
- a, z = kids[opens[1]].start_point[0] + 1, p.end_point[0] + 1
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] + 2, (stmts.end_point[0] + 1 if stmts is not None else p.end_point[0] + 1)
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
- regions.append((a, z, av))
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
- av = self._vmax(av, v)
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
- return "unknown", None
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