@untangle-code/parser-registry 0.0.0-stage → 0.1.0

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 (345) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +352 -2
  4. package/THIRD_PARTY_LICENSES.md +91 -0
  5. package/dist/boundaries/expression.d.ts +10 -0
  6. package/dist/boundaries/expression.d.ts.map +1 -0
  7. package/dist/boundaries/expression.js +95 -0
  8. package/dist/boundaries/expression.js.map +1 -0
  9. package/dist/boundaries/extract.d.ts +12 -0
  10. package/dist/boundaries/extract.d.ts.map +1 -0
  11. package/dist/boundaries/extract.js +259 -0
  12. package/dist/boundaries/extract.js.map +1 -0
  13. package/dist/boundaries/python.d.ts +6 -0
  14. package/dist/boundaries/python.d.ts.map +1 -0
  15. package/dist/boundaries/python.js +154 -0
  16. package/dist/boundaries/python.js.map +1 -0
  17. package/dist/index.d.ts +26 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +19 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/languages/astgrep-backend/adapter.d.ts +101 -0
  22. package/dist/languages/astgrep-backend/adapter.d.ts.map +1 -0
  23. package/dist/languages/astgrep-backend/adapter.js +130 -0
  24. package/dist/languages/astgrep-backend/adapter.js.map +1 -0
  25. package/dist/languages/astgrep-backend/index.d.ts +29 -0
  26. package/dist/languages/astgrep-backend/index.d.ts.map +1 -0
  27. package/dist/languages/astgrep-backend/index.js +28 -0
  28. package/dist/languages/astgrep-backend/index.js.map +1 -0
  29. package/dist/languages/astgrep-backend/lang/bash.d.ts +38 -0
  30. package/dist/languages/astgrep-backend/lang/bash.d.ts.map +1 -0
  31. package/dist/languages/astgrep-backend/lang/bash.js +42 -0
  32. package/dist/languages/astgrep-backend/lang/bash.js.map +1 -0
  33. package/dist/languages/astgrep-backend/lang/c.d.ts +33 -0
  34. package/dist/languages/astgrep-backend/lang/c.d.ts.map +1 -0
  35. package/dist/languages/astgrep-backend/lang/c.js +85 -0
  36. package/dist/languages/astgrep-backend/lang/c.js.map +1 -0
  37. package/dist/languages/astgrep-backend/lang/cpp.d.ts +27 -0
  38. package/dist/languages/astgrep-backend/lang/cpp.d.ts.map +1 -0
  39. package/dist/languages/astgrep-backend/lang/cpp.js +38 -0
  40. package/dist/languages/astgrep-backend/lang/cpp.js.map +1 -0
  41. package/dist/languages/astgrep-backend/lang/csharp.d.ts +24 -0
  42. package/dist/languages/astgrep-backend/lang/csharp.d.ts.map +1 -0
  43. package/dist/languages/astgrep-backend/lang/csharp.js +102 -0
  44. package/dist/languages/astgrep-backend/lang/csharp.js.map +1 -0
  45. package/dist/languages/astgrep-backend/lang/index.d.ts +29 -0
  46. package/dist/languages/astgrep-backend/lang/index.d.ts.map +1 -0
  47. package/dist/languages/astgrep-backend/lang/index.js +22 -0
  48. package/dist/languages/astgrep-backend/lang/index.js.map +1 -0
  49. package/dist/languages/astgrep-backend/lang/java.d.ts +26 -0
  50. package/dist/languages/astgrep-backend/lang/java.d.ts.map +1 -0
  51. package/dist/languages/astgrep-backend/lang/java.js +89 -0
  52. package/dist/languages/astgrep-backend/lang/java.js.map +1 -0
  53. package/dist/languages/astgrep-backend/lang/kotlin.d.ts +44 -0
  54. package/dist/languages/astgrep-backend/lang/kotlin.d.ts.map +1 -0
  55. package/dist/languages/astgrep-backend/lang/kotlin.js +94 -0
  56. package/dist/languages/astgrep-backend/lang/kotlin.js.map +1 -0
  57. package/dist/languages/astgrep-backend/lang/php.d.ts +23 -0
  58. package/dist/languages/astgrep-backend/lang/php.d.ts.map +1 -0
  59. package/dist/languages/astgrep-backend/lang/php.js +80 -0
  60. package/dist/languages/astgrep-backend/lang/php.js.map +1 -0
  61. package/dist/languages/astgrep-backend/lang/ruby.d.ts +37 -0
  62. package/dist/languages/astgrep-backend/lang/ruby.d.ts.map +1 -0
  63. package/dist/languages/astgrep-backend/lang/ruby.js +70 -0
  64. package/dist/languages/astgrep-backend/lang/ruby.js.map +1 -0
  65. package/dist/languages/astgrep-backend/lang/swift.d.ts +34 -0
  66. package/dist/languages/astgrep-backend/lang/swift.d.ts.map +1 -0
  67. package/dist/languages/astgrep-backend/lang/swift.js +86 -0
  68. package/dist/languages/astgrep-backend/lang/swift.js.map +1 -0
  69. package/dist/languages/astgrep-backend/languages.d.ts +55 -0
  70. package/dist/languages/astgrep-backend/languages.d.ts.map +1 -0
  71. package/dist/languages/astgrep-backend/languages.js +214 -0
  72. package/dist/languages/astgrep-backend/languages.js.map +1 -0
  73. package/dist/languages/astgrep-backend/napi.d.ts +71 -0
  74. package/dist/languages/astgrep-backend/napi.d.ts.map +1 -0
  75. package/dist/languages/astgrep-backend/napi.js +176 -0
  76. package/dist/languages/astgrep-backend/napi.js.map +1 -0
  77. package/dist/languages/astgrep-backend/syntax.d.ts +88 -0
  78. package/dist/languages/astgrep-backend/syntax.d.ts.map +1 -0
  79. package/dist/languages/astgrep-backend/syntax.js +180 -0
  80. package/dist/languages/astgrep-backend/syntax.js.map +1 -0
  81. package/dist/languages/index.d.ts +14 -0
  82. package/dist/languages/index.d.ts.map +1 -0
  83. package/dist/languages/index.js +37 -0
  84. package/dist/languages/index.js.map +1 -0
  85. package/dist/languages/javascript/index.d.ts +4 -0
  86. package/dist/languages/javascript/index.d.ts.map +1 -0
  87. package/dist/languages/javascript/index.js +7 -0
  88. package/dist/languages/javascript/index.js.map +1 -0
  89. package/dist/languages/jsx/index.d.ts +4 -0
  90. package/dist/languages/jsx/index.d.ts.map +1 -0
  91. package/dist/languages/jsx/index.js +7 -0
  92. package/dist/languages/jsx/index.js.map +1 -0
  93. package/dist/languages/prose/index.d.ts +53 -0
  94. package/dist/languages/prose/index.d.ts.map +1 -0
  95. package/dist/languages/prose/index.js +172 -0
  96. package/dist/languages/prose/index.js.map +1 -0
  97. package/dist/languages/prose/line-bytes.d.ts +31 -0
  98. package/dist/languages/prose/line-bytes.d.ts.map +1 -0
  99. package/dist/languages/prose/line-bytes.js +39 -0
  100. package/dist/languages/prose/line-bytes.js.map +1 -0
  101. package/dist/languages/python/create-adapter.d.ts +20 -0
  102. package/dist/languages/python/create-adapter.d.ts.map +1 -0
  103. package/dist/languages/python/create-adapter.js +9 -0
  104. package/dist/languages/python/create-adapter.js.map +1 -0
  105. package/dist/languages/python/index.d.ts +4 -0
  106. package/dist/languages/python/index.d.ts.map +1 -0
  107. package/dist/languages/python/index.js +6 -0
  108. package/dist/languages/python/index.js.map +1 -0
  109. package/dist/languages/python/profile.d.ts +36 -0
  110. package/dist/languages/python/profile.d.ts.map +1 -0
  111. package/dist/languages/python/profile.js +282 -0
  112. package/dist/languages/python/profile.js.map +1 -0
  113. package/dist/languages/python/signature.d.ts +53 -0
  114. package/dist/languages/python/signature.d.ts.map +1 -0
  115. package/dist/languages/python/signature.js +188 -0
  116. package/dist/languages/python/signature.js.map +1 -0
  117. package/dist/languages/python/table.d.ts +46 -0
  118. package/dist/languages/python/table.d.ts.map +1 -0
  119. package/dist/languages/python/table.js +88 -0
  120. package/dist/languages/python/table.js.map +1 -0
  121. package/dist/languages/shared/call-detection.d.ts +17 -0
  122. package/dist/languages/shared/call-detection.d.ts.map +1 -0
  123. package/dist/languages/shared/call-detection.js +86 -0
  124. package/dist/languages/shared/call-detection.js.map +1 -0
  125. package/dist/languages/shared/chunks.d.ts +28 -0
  126. package/dist/languages/shared/chunks.d.ts.map +1 -0
  127. package/dist/languages/shared/chunks.js +181 -0
  128. package/dist/languages/shared/chunks.js.map +1 -0
  129. package/dist/languages/shared/create-adapter.d.ts +11 -0
  130. package/dist/languages/shared/create-adapter.d.ts.map +1 -0
  131. package/dist/languages/shared/create-adapter.js +90 -0
  132. package/dist/languages/shared/create-adapter.js.map +1 -0
  133. package/dist/languages/shared/decisions.d.ts +45 -0
  134. package/dist/languages/shared/decisions.d.ts.map +1 -0
  135. package/dist/languages/shared/decisions.js +141 -0
  136. package/dist/languages/shared/decisions.js.map +1 -0
  137. package/dist/languages/shared/dialect.d.ts +18 -0
  138. package/dist/languages/shared/dialect.d.ts.map +1 -0
  139. package/dist/languages/shared/dialect.js +37 -0
  140. package/dist/languages/shared/dialect.js.map +1 -0
  141. package/dist/languages/shared/doc-binding.d.ts +26 -0
  142. package/dist/languages/shared/doc-binding.d.ts.map +1 -0
  143. package/dist/languages/shared/doc-binding.js +50 -0
  144. package/dist/languages/shared/doc-binding.js.map +1 -0
  145. package/dist/languages/shared/engine.d.ts +49 -0
  146. package/dist/languages/shared/engine.d.ts.map +1 -0
  147. package/dist/languages/shared/engine.js +317 -0
  148. package/dist/languages/shared/engine.js.map +1 -0
  149. package/dist/languages/shared/extract-symbols.d.ts +5 -0
  150. package/dist/languages/shared/extract-symbols.d.ts.map +1 -0
  151. package/dist/languages/shared/extract-symbols.js +31 -0
  152. package/dist/languages/shared/extract-symbols.js.map +1 -0
  153. package/dist/languages/shared/fingerprint.d.ts +7 -0
  154. package/dist/languages/shared/fingerprint.d.ts.map +1 -0
  155. package/dist/languages/shared/fingerprint.js +95 -0
  156. package/dist/languages/shared/fingerprint.js.map +1 -0
  157. package/dist/languages/shared/grammar-loader.d.ts +15 -0
  158. package/dist/languages/shared/grammar-loader.d.ts.map +1 -0
  159. package/dist/languages/shared/grammar-loader.js +48 -0
  160. package/dist/languages/shared/grammar-loader.js.map +1 -0
  161. package/dist/languages/shared/import-detection.d.ts +24 -0
  162. package/dist/languages/shared/import-detection.d.ts.map +1 -0
  163. package/dist/languages/shared/import-detection.js +138 -0
  164. package/dist/languages/shared/import-detection.js.map +1 -0
  165. package/dist/languages/shared/js-family-profile.d.ts +5 -0
  166. package/dist/languages/shared/js-family-profile.d.ts.map +1 -0
  167. package/dist/languages/shared/js-family-profile.js +179 -0
  168. package/dist/languages/shared/js-family-profile.js.map +1 -0
  169. package/dist/languages/shared/node-kinds.d.ts +78 -0
  170. package/dist/languages/shared/node-kinds.d.ts.map +1 -0
  171. package/dist/languages/shared/node-kinds.js +141 -0
  172. package/dist/languages/shared/node-kinds.js.map +1 -0
  173. package/dist/languages/shared/node-utils.d.ts +31 -0
  174. package/dist/languages/shared/node-utils.d.ts.map +1 -0
  175. package/dist/languages/shared/node-utils.js +89 -0
  176. package/dist/languages/shared/node-utils.js.map +1 -0
  177. package/dist/languages/shared/parse-diagnostics.d.ts +44 -0
  178. package/dist/languages/shared/parse-diagnostics.d.ts.map +1 -0
  179. package/dist/languages/shared/parse-diagnostics.js +64 -0
  180. package/dist/languages/shared/parse-diagnostics.js.map +1 -0
  181. package/dist/languages/shared/parse-limits.d.ts +24 -0
  182. package/dist/languages/shared/parse-limits.d.ts.map +1 -0
  183. package/dist/languages/shared/parse-limits.js +134 -0
  184. package/dist/languages/shared/parse-limits.js.map +1 -0
  185. package/dist/languages/shared/profile.d.ts +149 -0
  186. package/dist/languages/shared/profile.d.ts.map +1 -0
  187. package/dist/languages/shared/profile.js +9 -0
  188. package/dist/languages/shared/profile.js.map +1 -0
  189. package/dist/languages/shared/scope-model.d.ts +32 -0
  190. package/dist/languages/shared/scope-model.d.ts.map +1 -0
  191. package/dist/languages/shared/scope-model.js +2 -0
  192. package/dist/languages/shared/scope-model.js.map +1 -0
  193. package/dist/languages/shared/scope-naming.d.ts +20 -0
  194. package/dist/languages/shared/scope-naming.d.ts.map +1 -0
  195. package/dist/languages/shared/scope-naming.js +118 -0
  196. package/dist/languages/shared/scope-naming.js.map +1 -0
  197. package/dist/languages/shared/scope-signature.d.ts +14 -0
  198. package/dist/languages/shared/scope-signature.d.ts.map +1 -0
  199. package/dist/languages/shared/scope-signature.js +82 -0
  200. package/dist/languages/shared/scope-signature.js.map +1 -0
  201. package/dist/languages/shared/signature.d.ts +55 -0
  202. package/dist/languages/shared/signature.d.ts.map +1 -0
  203. package/dist/languages/shared/signature.js +147 -0
  204. package/dist/languages/shared/signature.js.map +1 -0
  205. package/dist/languages/shared/syntax.d.ts +115 -0
  206. package/dist/languages/shared/syntax.d.ts.map +1 -0
  207. package/dist/languages/shared/syntax.js +2 -0
  208. package/dist/languages/shared/syntax.js.map +1 -0
  209. package/dist/languages/shared/table-profile-decisions.d.ts +54 -0
  210. package/dist/languages/shared/table-profile-decisions.d.ts.map +1 -0
  211. package/dist/languages/shared/table-profile-decisions.js +245 -0
  212. package/dist/languages/shared/table-profile-decisions.js.map +1 -0
  213. package/dist/languages/shared/table-profile-module-facts.d.ts +29 -0
  214. package/dist/languages/shared/table-profile-module-facts.d.ts.map +1 -0
  215. package/dist/languages/shared/table-profile-module-facts.js +139 -0
  216. package/dist/languages/shared/table-profile-module-facts.js.map +1 -0
  217. package/dist/languages/shared/table-profile-queries.d.ts +27 -0
  218. package/dist/languages/shared/table-profile-queries.d.ts.map +1 -0
  219. package/dist/languages/shared/table-profile-queries.js +70 -0
  220. package/dist/languages/shared/table-profile-queries.js.map +1 -0
  221. package/dist/languages/shared/table-profile-scopes.d.ts +46 -0
  222. package/dist/languages/shared/table-profile-scopes.d.ts.map +1 -0
  223. package/dist/languages/shared/table-profile-scopes.js +180 -0
  224. package/dist/languages/shared/table-profile-scopes.js.map +1 -0
  225. package/dist/languages/shared/table-profile.d.ts +302 -0
  226. package/dist/languages/shared/table-profile.d.ts.map +1 -0
  227. package/dist/languages/shared/table-profile.js +125 -0
  228. package/dist/languages/shared/table-profile.js.map +1 -0
  229. package/dist/languages/shared/tree-sitter-types.d.ts +44 -0
  230. package/dist/languages/shared/tree-sitter-types.d.ts.map +1 -0
  231. package/dist/languages/shared/tree-sitter-types.js +2 -0
  232. package/dist/languages/shared/tree-sitter-types.js.map +1 -0
  233. package/dist/languages/structured-text/index.d.ts +48 -0
  234. package/dist/languages/structured-text/index.d.ts.map +1 -0
  235. package/dist/languages/structured-text/index.js +120 -0
  236. package/dist/languages/structured-text/index.js.map +1 -0
  237. package/dist/languages/tsx/index.d.ts +4 -0
  238. package/dist/languages/tsx/index.d.ts.map +1 -0
  239. package/dist/languages/tsx/index.js +7 -0
  240. package/dist/languages/tsx/index.js.map +1 -0
  241. package/dist/languages/typescript/index.d.ts +4 -0
  242. package/dist/languages/typescript/index.d.ts.map +1 -0
  243. package/dist/languages/typescript/index.js +7 -0
  244. package/dist/languages/typescript/index.js.map +1 -0
  245. package/dist/languages/vue/index.d.ts +21 -0
  246. package/dist/languages/vue/index.d.ts.map +1 -0
  247. package/dist/languages/vue/index.js +234 -0
  248. package/dist/languages/vue/index.js.map +1 -0
  249. package/dist/languages/vue/mapping.d.ts +11 -0
  250. package/dist/languages/vue/mapping.d.ts.map +1 -0
  251. package/dist/languages/vue/mapping.js +77 -0
  252. package/dist/languages/vue/mapping.js.map +1 -0
  253. package/dist/registry.d.ts +24 -0
  254. package/dist/registry.d.ts.map +1 -0
  255. package/dist/registry.js +42 -0
  256. package/dist/registry.js.map +1 -0
  257. package/dist/text/byte-offset-table.d.ts +27 -0
  258. package/dist/text/byte-offset-table.d.ts.map +1 -0
  259. package/dist/text/byte-offset-table.js +39 -0
  260. package/dist/text/byte-offset-table.js.map +1 -0
  261. package/package.json +125 -3
  262. package/src/boundaries/expression.ts +95 -0
  263. package/src/boundaries/extract.ts +307 -0
  264. package/src/boundaries/python.ts +181 -0
  265. package/src/index.ts +51 -0
  266. package/src/languages/__golden__/javascript-basic.json +32 -0
  267. package/src/languages/__golden__/tsx-basic.json +19 -0
  268. package/src/languages/__golden__/typescript-basic.json +37 -0
  269. package/src/languages/astgrep-backend/GRAMMARS.md +86 -0
  270. package/src/languages/astgrep-backend/README.md +112 -0
  271. package/src/languages/astgrep-backend/__golden__/bash-basic.sh +53 -0
  272. package/src/languages/astgrep-backend/__golden__/c-basic.c +64 -0
  273. package/src/languages/astgrep-backend/__golden__/cpp-basic.cpp +65 -0
  274. package/src/languages/astgrep-backend/__golden__/csharp-basic.cs +73 -0
  275. package/src/languages/astgrep-backend/__golden__/go-basic.go +93 -0
  276. package/src/languages/astgrep-backend/__golden__/java-basic.java +62 -0
  277. package/src/languages/astgrep-backend/__golden__/kotlin-basic.kt +58 -0
  278. package/src/languages/astgrep-backend/__golden__/php-basic.php +72 -0
  279. package/src/languages/astgrep-backend/__golden__/ruby-basic.rb +62 -0
  280. package/src/languages/astgrep-backend/__golden__/rust-basic.rs +82 -0
  281. package/src/languages/astgrep-backend/__golden__/swift-basic.swift +73 -0
  282. package/src/languages/astgrep-backend/adapter.ts +240 -0
  283. package/src/languages/astgrep-backend/index.ts +44 -0
  284. package/src/languages/astgrep-backend/lang/README.md +115 -0
  285. package/src/languages/astgrep-backend/lang/bash.ts +78 -0
  286. package/src/languages/astgrep-backend/lang/c.ts +119 -0
  287. package/src/languages/astgrep-backend/lang/cpp.ts +65 -0
  288. package/src/languages/astgrep-backend/lang/csharp.ts +125 -0
  289. package/src/languages/astgrep-backend/lang/index.ts +61 -0
  290. package/src/languages/astgrep-backend/lang/java.ts +115 -0
  291. package/src/languages/astgrep-backend/lang/kotlin.ts +136 -0
  292. package/src/languages/astgrep-backend/lang/php.ts +105 -0
  293. package/src/languages/astgrep-backend/lang/ruby.ts +105 -0
  294. package/src/languages/astgrep-backend/lang/swift.ts +118 -0
  295. package/src/languages/astgrep-backend/languages.ts +238 -0
  296. package/src/languages/astgrep-backend/napi.ts +261 -0
  297. package/src/languages/astgrep-backend/syntax.ts +242 -0
  298. package/src/languages/index.ts +53 -0
  299. package/src/languages/javascript/index.ts +9 -0
  300. package/src/languages/jsx/index.ts +9 -0
  301. package/src/languages/prose/index.ts +270 -0
  302. package/src/languages/prose/line-bytes.ts +52 -0
  303. package/src/languages/python/README.md +246 -0
  304. package/src/languages/python/__golden__/python-basic.json +44 -0
  305. package/src/languages/python/create-adapter.ts +29 -0
  306. package/src/languages/python/index.ts +8 -0
  307. package/src/languages/python/profile.ts +341 -0
  308. package/src/languages/python/signature.ts +183 -0
  309. package/src/languages/python/table.ts +135 -0
  310. package/src/languages/shared/__fixtures__/large-over-32kib.ts.txt +1207 -0
  311. package/src/languages/shared/call-detection.ts +112 -0
  312. package/src/languages/shared/chunks.ts +255 -0
  313. package/src/languages/shared/create-adapter.ts +136 -0
  314. package/src/languages/shared/decisions.ts +204 -0
  315. package/src/languages/shared/dialect.ts +55 -0
  316. package/src/languages/shared/doc-binding.ts +78 -0
  317. package/src/languages/shared/engine.ts +461 -0
  318. package/src/languages/shared/extract-symbols.ts +35 -0
  319. package/src/languages/shared/fingerprint.ts +99 -0
  320. package/src/languages/shared/grammar-loader.ts +67 -0
  321. package/src/languages/shared/import-detection.ts +154 -0
  322. package/src/languages/shared/js-family-profile.ts +246 -0
  323. package/src/languages/shared/node-kinds.ts +153 -0
  324. package/src/languages/shared/node-utils.ts +120 -0
  325. package/src/languages/shared/parse-diagnostics.ts +125 -0
  326. package/src/languages/shared/parse-limits.ts +147 -0
  327. package/src/languages/shared/profile.ts +184 -0
  328. package/src/languages/shared/scope-model.ts +43 -0
  329. package/src/languages/shared/scope-naming.ts +124 -0
  330. package/src/languages/shared/scope-signature.ts +108 -0
  331. package/src/languages/shared/signature.ts +149 -0
  332. package/src/languages/shared/syntax.ts +116 -0
  333. package/src/languages/shared/table-profile-decisions.ts +251 -0
  334. package/src/languages/shared/table-profile-module-facts.ts +177 -0
  335. package/src/languages/shared/table-profile-queries.ts +85 -0
  336. package/src/languages/shared/table-profile-scopes.ts +198 -0
  337. package/src/languages/shared/table-profile.ts +427 -0
  338. package/src/languages/shared/tree-sitter-types.ts +46 -0
  339. package/src/languages/structured-text/index.ts +192 -0
  340. package/src/languages/tsx/index.ts +9 -0
  341. package/src/languages/typescript/index.ts +9 -0
  342. package/src/languages/vue/index.ts +312 -0
  343. package/src/languages/vue/mapping.ts +93 -0
  344. package/src/registry.ts +61 -0
  345. package/src/text/byte-offset-table.ts +63 -0
@@ -0,0 +1,246 @@
1
+ <a id="python-adapter-wp-09"></a>
2
+
3
+ # Python adapter (WP-09)
4
+
5
+ Python `LanguageAdapter` (`@untangle-code/domain`), support level `deep` (spec.md §7.1–§7.3).
6
+ Assigned write scope: `packages/parser-registry/src/languages/python/**`, plus the single
7
+ registration line reserved for WP-09 in `../index.ts` (`registry.register(createPythonAdapter());`).
8
+
9
+ Normative sources: spec.md §7.1–§7.3, §16.2–§16.8; architecture.md §6.5, §15.1. Every type
10
+ (`LanguageAdapter`, `ParsedAst`, `ExtractedSymbol`, `RawImport`, `RawCall`, `ComplexityFacts`,
11
+ `HalsteadTokens`, `AstRegion`, etc.) comes unchanged from domain; this module defines no competing types.
12
+
13
+ <a id="grammatik-wahl"></a>
14
+
15
+ ## Grammar choice
16
+
17
+ **No `tree-sitter-python`.** WP-09's write scope is exclusively `languages/python/**`; adding a
18
+ native grammar requires editing `package.json`, outside that scope and prohibited by the task.
19
+ WP-06's package README explicitly allows either native tree-sitter bindings (recommended, same
20
+ pattern) or another approach; the registry is grammar-agnostic.
21
+
22
+ The chosen approach is a **handwritten indentation-based tokenizer and recursive-descent parser**
23
+ with its own explicit AST (`ast.ts`, discriminated unions, no generic tree-sitter-shaped node).
24
+ `languages/shared/*` (decisions, node kinds, calls/imports, signatures, fingerprints, chunks) is
25
+ bound to JS/TS grammar vocabulary (`if_statement`, `catch_clause`, `binary_expression`, `<`/`>` as
26
+ generic brackets, no `elif`/`except`/`match`/`with`/walrus). It is insufficiently generic for Python
27
+ without distortion. This module supplies small corresponding `engine.ts`, `signature.ts`,
28
+ `fingerprint.ts`, `chunks.ts`, `extract-symbols.ts` implementations satisfying the same domain contracts.
29
+
30
+ **File-to-module mapping:**
31
+
32
+ | File | Role |
33
+ |---|---|
34
+ | `tokenizer.ts` | INDENT/DEDENT/NEWLINE lexer, r/b/f and triple-quoted string prefixes, bracket depth for implicit line joining, backslash continuation |
35
+ | `ast.ts` | Own AST node types (`Stmt`/`Expr` unions) |
36
+ | `parser.ts` | Recursive-descent parser with panic-mode recovery |
37
+ | `engine.ts` | ONE unified traversal: scope tree, `ComplexityFacts`, imports, calls |
38
+ | `signature.ts` | Signature normalization (spec.md §5.5), Python-specific rules |
39
+ | `fingerprint.ts` | `astHash`/`tokenFingerprint` from the custom AST |
40
+ | `chunks.ts` | `AstRegion` tree from scope tree |
41
+ | `extract-symbols.ts` | Scope tree → `ExtractedSymbol[]` |
42
+ | `create-adapter.ts` | `LanguageAdapter` composition, parse-quality classification |
43
+ | `index.ts` | `createPythonAdapter()`, the subdirectory's only public export |
44
+
45
+ <a id="eine-einzige-analyse-pro-datei"></a>
46
+
47
+ ## One analysis per file
48
+
49
+ As in WP-06, every adapter method is a thin projection over ONE `AnalysisResult`, calculated by
50
+ `engine.ts#analyzeModule` in one recursive traversal of the `Module` AST and cached per `ParsedAst`
51
+ through a `WeakMap` in `create-adapter.ts`. A `SymbolScopeFact.symbolScopeId` therefore equals a
52
+ `RawCall.callerScopeId` for calls within that scope.
53
+
54
+ <a id="python-besonderheiten--wie-sie-behandelt-werden"></a>
55
+
56
+ ## Python-specific handling
57
+
58
+ - **Indentation as block structure:** `tokenizer.ts` measures columns, expanding tabs to multiples
59
+ of 8 only for comparison without changing byte/character offsets, and emits INDENT/DEDENT;
60
+ `parser.ts#parseSuite` consumes them.
61
+ - **`elif` is continuation, not new nesting** (spec.md §16.4, like `else if`). `parseIf` builds
62
+ nested `If` chains (`orelse: [If]`), as CPython's `ast` does, marking nested nodes
63
+ `isElifContinuation: true`. The engine emits `DecisionKind: "else_if"` PLUS `NestingFact` with
64
+ `continuation: true` contained within the outer `if`, not a sibling span. This is precisely
65
+ what `@untangle-code/complexity#buildSymbolIR` expects for avoiding a full nesting increment.
66
+ - **`with` / `async with`:** neither decisions nor nesting boundaries (absent from the spec's
67
+ decision list); transparent blocks like plain `{}` in TS/JS.
68
+ - **Multiple-clause comprehensions:** every `for` is `DecisionKind: "loop"` plus
69
+ `NestingFact("loop")` (spec.md §16.2 for-each), every filter `if` is `DecisionKind: "if"` plus
70
+ `NestingFact("if")`. Each range spans its keyword through the comprehension's end, correctly
71
+ containing later clauses and matching the containment stack. Two `for` and one `if` therefore
72
+ produce `["loop", "loop", "if"]`.
73
+ - **`try`/`except`/`else`/`finally`:** only each `except` is a `DecisionKind: "catch"`, like JS/TS
74
+ `catch_clause`; the other bodies are transparent.
75
+ - **`match`/`case`:** `match` itself is ONLY `NestingFact("switch")`, not a decision, like
76
+ `switch_statement`. Every arm is `DecisionKind: "case"`. Patterns are NOT parsed fully
77
+ structurally (decision 3); each `|` alternative beyond the first emits
78
+ `DecisionKind: "pattern_alternative"` (spec.md §16.3, extended cyclomatic,
79
+ `countsForClassic: false`).
80
+ - **Decorators:** no separate `ChunkKind` (`CHUNK_KINDS` has no `"decorator"`). A decorated
81
+ `def`/`class` region starts at its FIRST decorator: `openScope` receives `node.pos` already
82
+ expanded by the parser, preventing decorator lines from falling into gaps (spec.md §8.4), like
83
+ WP-06's export-wrapper-inclusive symbol regions. Decorator EXPRESSIONS are traversed in the
84
+ OUTER scope where definition-time evaluation occurs, attributing `@app.route("/x")`, for
85
+ example, to the enclosing function.
86
+ - **Nested functions/lambdas:** as in TS/JS, `FunctionDef`/`Lambda` within an executable scope
87
+ adds `NestingFact("lambda")` to the OUTER scope in addition to creating its own scope, following
88
+ spec.md §16.4's documented local-function/lambda nesting context.
89
+ - **Walrus (`:=`):** `NamedExpr`; not a decision, but operator token `:=` plus a `declaration`
90
+ identifier fact for its target.
91
+ - **`global`/`nonlocal`:** separate statement nodes with `reference` identifier facts for names.
92
+ Scope resolution is for a later symbol resolver, not this adapter.
93
+ - **`async def`/`await`/`async for`/`async with`:** fully recognized: `isAsync` on
94
+ `FunctionDef`/`For`/`With`, separate `Await` expression nodes and `"await"` operator tokens.
95
+
96
+ <a id="signaturnormalisierung-specmd-55--signaturets"></a>
97
+
98
+ ## Signature normalization (spec.md §5.5) — `signature.ts`
99
+
100
+ 1. **Whitespace** collapses to one space; spacing around `,`/`:` is canonicalized.
101
+ 2. **Default values** (`= <expr>`) are removed from parameter lists, as in TS/JS: defaults are
102
+ calling convenience, not another overload.
103
+ 3. **Type annotations** (`: <type>`) remain literal apart from whitespace normalization.
104
+ 4. **`*args`/`**kwargs`/bare `*`/`/` markers:** `*`/`**`/`/` characters remain exact.
105
+ 5. **Return types** (`-> <type>`) remain literal, with exactly one space around `->`.
106
+
107
+ **Documented TS/JS asymmetry:** TypeScript retains optional `?` independently of defaults because
108
+ it has dedicated syntax. Python has NO equivalent; default presence is unrecoverable after
109
+ normalization, just like TS/JS parameters without `?`. No informational asymmetry is invented;
110
+ there is simply nothing to retain.
111
+
112
+ <a id="entscheidungen"></a>
113
+
114
+ ## Decisions
115
+
116
+ 1. **No `tree-sitter-python`** (see Grammar choice): handwritten tokenizer/parser/traversal and
117
+ own AST. Support remains `deep`: spec.md §7.1 requires complete chunking/symbol/call/import/
118
+ complexity support, not a particular parser technology.
119
+ 2. **`PyScopeNode.kind` has NO `"property"` member**, unlike WP-06's `ScopeNode`. Python class
120
+ attributes are ordinary `Assign`/`AnnAssign` statements, not a separate grammar category with
121
+ signature/visibility like TS fields. They produce no `ExtractedSymbol` or dedicated chunk;
122
+ their text remains in the class body, covered as gaps or by `class_overview`. Named field
123
+ symbols can be added when needed by a consumer.
124
+ 3. **Patterns are NOT fully structurally parsed** (`parser.ts#scanPatternAlternatives`). A
125
+ bracket-depth-aware scan finds `|` alternatives and simple name captures rather than validated
126
+ capture/literal/class/sequence/mapping AST nodes. This supports `pattern_alternative` decisions
127
+ and capture identifier facts; full pattern grammar remains additively implementable if needed.
128
+ 4. **`__init__.py` re-export convention:** Python lacks explicit JS-style `export { x } from "y"`.
129
+ Module-level imports in `__init__.py`/`__init__.pyi` conventionally form public package APIs, so
130
+ EVERY top-level import/from-import, such as `from .mod import X` or `import X`, receives
131
+ `importKind: "re_export"` rather than `"import"`. Nested imports remain `"import"`.
132
+ This is a documented heuristic, not a normative spec/architecture rule.
133
+ 5. **Visibility by naming** (`engine.ts#visibilityOf`): leading `__` without trailing `__` means
134
+ `"private"` (name mangling); one leading `_` means `"protected"`; dunder methods (`__init__`,
135
+ `__repr__`, …) receive `undefined` because they are public protocol, NOT private despite `_`.
136
+ No normative value was prescribed; this directly follows common PEP 8 convention.
137
+ 6. **`exportedNames` from `__all__` or underscore convention:** module `__all__ = [...]` is the
138
+ final list when present; otherwise top-level names not starting `_` count as exported (PEP 8).
139
+ Only top-level functions/classes receive non-empty `exportedNames`; nested methods/functions
140
+ always receive `[]`, following WP-06's module-export semantics.
141
+ 7. **Guard heuristic matches WP-06:** an `if` without `elif`/`else`, whose sole body statement is
142
+ `return`/`raise`/`break`/`continue`, becomes `DecisionKind: "guard"`, not `"if"` (spec.md §16.2).
143
+ 8. **Halstead classification:** brackets, commas, colons and dots are structural, not operators.
144
+ Control/expression keywords (`if`, `for`, `and`, `or`, `not`, `await`, `yield`, `:=`, augmented
145
+ assignment, comparisons `in`/`is`/`is not`/`not in`, etc.) are operators; identifiers/literals,
146
+ including f-string text as `"template"`, are operands, deliberately matching WP-06 decision 9.
147
+ 9. **f-strings:** the tokenizer reads ONE `STRING` with `isFString` and raw body.
148
+ `parseFStringExpressions` extracts brace-depth/string-aware `{…}` segments, strips
149
+ `!conversion`/`:format_spec` and self-documenting `{x=}`, then parses each through a second
150
+ position-adjusted tokenizer/parser pass into real `Expr` nodes (`JoinedStr.values`). Calls and
151
+ conditions INSIDE f-strings (`f"{compute(a, b)}"`, `f"{x if y else z}"`) therefore remain visible.
152
+ Replacement fields INSIDE format specifications (`f"{v:>{width}}"`) are also evaluated, through
153
+ an explicit worklist rather than recursion. Results are sorted by source position so ordering
154
+ depends only on source. For Halstead, the ENTIRE f-string still counts as one `"template"`
155
+ operand, avoiding repeated tokenization of text outside `{}`: a documented simplification.
156
+
157
+ **E4 (WP-115):** subparsing discards nothing silently. Unparseable expressions, depth aborts,
158
+ unclosed `{`, lone `}`, expressionless fields, unconsumed field text and every subparse lexer/
159
+ parser finding become diagnostics on the MAIN parser. `classifyParseQuality` can no longer
160
+ call lost f-string content `"complete"`. Depth aborts use a separate
161
+ `ParseDepthExceededError`, preventing speculative rollback (`tryParseMatch`) from treating
162
+ them as an ordinary "not a `match` after all".
163
+ 10. **Parameter defaults/annotations are traversed in the function's own scope**, not the outer
164
+ scope where definition-time evaluation occurs. This documented simplification affects none
165
+ of spec.md §16's required metrics because parameter lists contain no control flow.
166
+ 11. **Parse-quality thresholds use lines, not nodes** (`create-adapter.ts#classifyParseQuality`).
167
+ The parser has no ERROR/MISSING nodes; panic-mode diagnostics may skip arbitrarily large
168
+ broken regions. Diagnostic/non-empty-line ratios are used instead: ≥30% means `failed`, as
169
+ does an empty module with non-empty source; otherwise `partial`. This is an independently
170
+ documented threshold, analogous to WP-06's 50% node threshold.
171
+ 12. **Error fallback ALWAYS consumes a token**, including INDENT/DEDENT/NEWLINE/ENDMARKER in
172
+ `parser.ts#parseAtom`. Not consuming structural tokens to improve broken-block recovery was
173
+ empirically rejected after infinite loops/OOM in paths whose surrounding loops lacked
174
+ progress guards. Never crashing/hanging (spec.md §7.3) takes priority over maximum syntax
175
+ recovery. Severely broken files become `parseQuality: "failed"` with `ast: null` anyway, so
176
+ the resulting partial AST is never consumed.
177
+ 13. **`for`/comprehension/`with as` targets do NOT use full expression grammar**
178
+ (`parser.ts#parseTargetList`/`parseTargetAtom`). Full grammar reaches `parseComparison`, which
179
+ interprets `in` as comparison: in `for x in a:`, it greedily expands `x` into `x in a` before
180
+ the loop can consume its expected `in`, discovered by `parser.test.ts`. Targets therefore use
181
+ restricted `atom_trailer` grammar—name/attribute/subscript/star/tuple/list—matching valid
182
+ Python target forms.
183
+ 14. **Calls without nameable targets are not reported as calls** (`engine.ts#detectCall`). Only
184
+ `name(...)` and `obj.attr(...)` provide `calleeName`; `f()()`, `d["k"]()`, `(lambda: g)()` and
185
+ similar forms have no source name for a resolver. No placeholder is invented. This is a
186
+ **known limit**, not silent E4 loss: the complete `Call` and arguments remain in AST and
187
+ complexity facts; only the call EDGE is absent. Runtime visibility requires an adapter
188
+ `SkipLedgerV1` channel alongside `RawCall[]`; until then the limit is documented here.
189
+
190
+ ## Tests
191
+
192
+ `npx vitest run`, co-located `*.test.ts` in this directory:
193
+
194
+ - `tokenizer.test.ts`: INDENT/DEDENT, implicit bracket line joining, backslash continuation,
195
+ prefixes/triple quoting, numeric forms and no throws for malformed strings/brackets.
196
+ - `parser.test.ts`: functions, `elif` containment/`isElifContinuation`, multiple `elif`, two-`for`/
197
+ one-`if` comprehensions, filtered dict comprehensions, `async def`/`await`, `async for`/
198
+ `async with`, walrus, `global`/`nonlocal`, decorators, `try`/`except`/`else`/`finally`,
199
+ `match`/`case` (or patterns, guards, wildcard, class/sequence patterns), distinguishing `match`
200
+ identifiers, relative/star imports, parameter markers, syntax recovery, docstrings, f-string
201
+ extraction and a dedicated never-hang/throw stress test of garbage/unbalanced brackets and
202
+ deeply nested garbage input.
203
+ - `parse-honesty.test.ts`: WP-76, parse aborts from stack depth or unexpected internal errors must
204
+ never appear as `parseQuality: "complete"` with empty results.
205
+ - `fstring-honesty.test.ts`: WP-115, the same rule for f-string subparsing. Fourteen loss cases
206
+ (expression/format depth aborts, broken expressions, open `{`, lone `}`, empty fields, leftover
207
+ text, unknown characters) enforce never complete after discarded subparsing; twenty-eight
208
+ valid forms control false positives. Tests prove nested-format calls and whitespace-padded
209
+ fields reach the AST and `case`-guard depth aborts survive speculative `match` parsing.
210
+ - `adapters.test.ts`: partial/failed quality without crashes; nonoverlapping method chunk regions;
211
+ decorators inside symbol regions; `function`/`class`/`method`/`constructor` classification;
212
+ visibility, `exportedNames` with/without `__all__`, docstrings, regular/from/relative/star/
213
+ `__init__.py` imports, calls, formatting-stable signatures, stable `astHash`/`tokenFingerprint`,
214
+ guards, continuation `elif`, comprehension/catch/case/pattern-alternative decisions, grouped
215
+ boolean chains, scope-ID consistency across decisions/calls, nested-function/lambda nesting.
216
+ - `golden.test.ts` and `__golden__/python-basic.json`: symbols, imports, calls, decision kinds,
217
+ scope-ID consistency and AST depth, matching WP-06's golden format.
218
+
219
+ <a id="verifikation"></a>
220
+
221
+ ## Verification
222
+
223
+ ```
224
+ npx tsc --noEmit -p tsconfig.typecheck.json # 0 errors (entire package, including TS/JS/TSX/JSX)
225
+ npx tsc -p tsconfig.json # Build, 0 errors
226
+ npx vitest run # Entire package passes except 2 documented,
227
+ # pre-existing tests outside this directory
228
+ # (see openIssues in the WP-09 completion report)
229
+ ```
230
+
231
+ A standalone script in the WP-09 completion report additionally proves the real
232
+ parser-registry → chunker → complexity seam on realistic Python: a class with
233
+ `__init__`/methods/`async def`/`try`/`except`/`else`/`finally`, plus a module function with list
234
+ comprehension and `match`/`case`. Multiple symbols have cognitive values >0 and chunks have
235
+ non-empty `symbolId`, the same seam demonstrated for TypeScript by `scripts/e2e-smoke.mjs`.
236
+
237
+ <a id="bekannte-grenzen-openissues-siehe-abschlussbericht"></a>
238
+
239
+ ## Known limits (openIssues in the completion report)
240
+
241
+ - `createPythonAdapter` is NOT re-exported by package-public `src/index.ts`, outside
242
+ `languages/python/**`. Likewise `src/index.test.ts` (four registered languages/Python not yet
243
+ supported) is now stale after authorized registration in `../index.ts`. Both edits lie outside
244
+ the assigned scope and are documented rather than performed, following the task's open-issues rule.
245
+ - Pattern grammar deliberately lacks full structural parsing (decision 3).
246
+ - Class attributes produce no dedicated `ExtractedSymbol` (decision 2).
@@ -0,0 +1,44 @@
1
+ {
2
+ "path": "basic.py",
3
+ "source": "import os\nfrom .util import helper\n\n\nclass Greeter:\n \"\"\"Greets people.\"\"\"\n\n def __init__(self, name):\n self.name = name\n\n def greet(self, loud=False):\n if loud or self.name == \"\":\n return helper(self.name.upper())\n return helper(self.name)\n\n\ndef make_greeter(name):\n return Greeter(name)\n",
4
+ "expectedSymbols": [
5
+ {
6
+ "name": "Greeter",
7
+ "kind": "class",
8
+ "qualifiedName": "Greeter",
9
+ "exportedNames": ["Greeter"],
10
+ "hasDocRange": true
11
+ },
12
+ {
13
+ "name": "__init__",
14
+ "kind": "constructor",
15
+ "qualifiedName": "Greeter.__init__",
16
+ "normalizedSignature": "__init__(self, name)",
17
+ "exportedNames": []
18
+ },
19
+ {
20
+ "name": "greet",
21
+ "kind": "method",
22
+ "qualifiedName": "Greeter.greet",
23
+ "normalizedSignature": "greet(self, loud)",
24
+ "exportedNames": []
25
+ },
26
+ {
27
+ "name": "make_greeter",
28
+ "kind": "function",
29
+ "qualifiedName": "make_greeter",
30
+ "normalizedSignature": "make_greeter(name)",
31
+ "exportedNames": ["make_greeter"]
32
+ }
33
+ ],
34
+ "expectedImports": [
35
+ { "specifier": "os", "importKind": "import" },
36
+ { "specifier": ".util", "importKind": "import", "importedNames": ["helper"] }
37
+ ],
38
+ "expectedCalls": [
39
+ { "calleeName": "upper" },
40
+ { "calleeName": "helper" },
41
+ { "calleeName": "Greeter" }
42
+ ],
43
+ "expectedDecisionKinds": ["guard", "logical_or"]
44
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Der Python-`LanguageAdapter`: die Tabelle aus `table.ts` und die
3
+ * Verfeinerung aus `profile.ts` durch das gemeinsame ast-grep-Backend.
4
+ *
5
+ * WAS HIER FRUEHER STAND (WP-239): dieselbe Datei verdrahtete einen eigenen
6
+ * Tokenizer, einen eigenen rekursiven Abstiegsparser, einen eigenen AST und
7
+ * einen eigenen Motor — 5.604 Zeilen, die es nur gab, weil eine Auftragsgrenze
8
+ * das Aufnehmen einer Grammatik verbot. Sie sind ersatzlos entfallen; was
9
+ * bleibt, ist `signature.ts` (reine Textnormalisierung, ohne AST) und die
10
+ * Tabelle daneben.
11
+ *
12
+ * DIE PARSERVERSION HAT SICH GEAENDERT, und das steht in domain
13
+ * `versions.ts`: Python laeuft ab jetzt unter `ASTGREP_PARSER_VERSION`. Ohne
14
+ * diesen Wechsel lieferten die inhaltsadressierten Caches aus WP-100 nach dem
15
+ * Backendwechsel stillschweigend Chunk-IDs und Fingerabdruecke der alten
16
+ * AST-Form (E4).
17
+ */
18
+ import type { LanguageAdapter } from "@untangle-code/domain";
19
+
20
+ import { createAstGrepAdapter } from "../astgrep-backend/index.js";
21
+
22
+ import { createPythonProfile } from "./profile.js";
23
+ import { PYTHON_SOURCE, PYTHON_TABLE } from "./table.js";
24
+
25
+ export function createPythonAdapter(): LanguageAdapter {
26
+ return createAstGrepAdapter(PYTHON_TABLE, PYTHON_SOURCE, {
27
+ profileForFile: createPythonProfile,
28
+ });
29
+ }
@@ -0,0 +1,8 @@
1
+ import type { LanguageAdapter } from "@untangle-code/domain";
2
+
3
+ import { createPythonAdapter as createPythonAdapterImpl } from "./create-adapter.js";
4
+
5
+ /** Python `LanguageAdapter` (`.py`, `.pyi`), support level "deep" (spec.md §7.2, WP-09). */
6
+ export function createPythonAdapter(): LanguageAdapter {
7
+ return createPythonAdapterImpl();
8
+ }