cg-code-graph 0.23.5__tar.gz → 0.23.6__tar.gz

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