@yalehwang/archguard 0.1.31 → 0.1.32

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 (298) hide show
  1. package/README.md +106 -19
  2. package/assets/grammars/benchmarks.md +101 -0
  3. package/assets/grammars/checksums.json +8 -0
  4. package/{node_modules/tree-sitter/LICENSE → assets/grammars/licenses/tree-sitter-cpp.LICENSE} +2 -2
  5. package/{node_modules/node-gyp-build/LICENSE → assets/grammars/licenses/tree-sitter-go.LICENSE} +5 -5
  6. package/assets/grammars/licenses/tree-sitter-java.LICENSE +21 -0
  7. package/assets/grammars/licenses/tree-sitter-kotlin.LICENSE +21 -0
  8. package/assets/grammars/licenses/tree-sitter-python.LICENSE +21 -0
  9. package/assets/grammars/licenses/tree-sitter.LICENSE +21 -0
  10. package/assets/grammars/provenance.json +66 -0
  11. package/assets/grammars/tree-sitter-cpp.wasm +0 -0
  12. package/assets/grammars/tree-sitter-go.wasm +0 -0
  13. package/assets/grammars/tree-sitter-java.wasm +0 -0
  14. package/assets/grammars/tree-sitter-kotlin.wasm +0 -0
  15. package/assets/grammars/tree-sitter-python.wasm +0 -0
  16. package/assets/grammars/tree-sitter.wasm +0 -0
  17. package/dist/analysis/fitness/rule-types.d.ts +1 -33
  18. package/dist/analysis/fitness/rule-types.d.ts.map +1 -1
  19. package/dist/cli/analyze/run-analysis.d.ts +4 -0
  20. package/dist/cli/analyze/run-analysis.d.ts.map +1 -1
  21. package/dist/cli/analyze/run-analysis.js +63 -43
  22. package/dist/cli/analyze/run-analysis.js.map +1 -1
  23. package/dist/cli/cache/cache-manager.js +1 -1
  24. package/dist/cli/cache/cache-manager.js.map +1 -1
  25. package/dist/cli/mcp/analyze-tool.d.ts +2 -0
  26. package/dist/cli/mcp/analyze-tool.d.ts.map +1 -1
  27. package/dist/cli/mcp/analyze-tool.js +5 -0
  28. package/dist/cli/mcp/analyze-tool.js.map +1 -1
  29. package/dist/cli/mcp/mcp-server.d.ts +7 -2
  30. package/dist/cli/mcp/mcp-server.d.ts.map +1 -1
  31. package/dist/cli/mcp/mcp-server.js +37 -3
  32. package/dist/cli/mcp/mcp-server.js.map +1 -1
  33. package/dist/cli/processors/arch-json-provider-types.d.ts +5 -0
  34. package/dist/cli/processors/arch-json-provider-types.d.ts.map +1 -1
  35. package/dist/cli/processors/arch-json-provider.d.ts +5 -0
  36. package/dist/cli/processors/arch-json-provider.d.ts.map +1 -1
  37. package/dist/cli/processors/arch-json-provider.js +104 -55
  38. package/dist/cli/processors/arch-json-provider.js.map +1 -1
  39. package/dist/cli/processors/arch-json-utils.d.ts.map +1 -1
  40. package/dist/cli/processors/arch-json-utils.js +12 -3
  41. package/dist/cli/processors/arch-json-utils.js.map +1 -1
  42. package/dist/cli/processors/diagram-processor.d.ts +4 -0
  43. package/dist/cli/processors/diagram-processor.d.ts.map +1 -1
  44. package/dist/cli/processors/diagram-processor.js +2 -0
  45. package/dist/cli/processors/diagram-processor.js.map +1 -1
  46. package/dist/cli/processors/worker-pool-factory.d.ts +3 -0
  47. package/dist/cli/processors/worker-pool-factory.d.ts.map +1 -1
  48. package/dist/cli/processors/worker-pool-factory.js +9 -0
  49. package/dist/cli/processors/worker-pool-factory.js.map +1 -1
  50. package/dist/mermaid/generator.d.ts.map +1 -1
  51. package/dist/mermaid/generator.js +19 -1
  52. package/dist/mermaid/generator.js.map +1 -1
  53. package/dist/mermaid/renderer.d.ts.map +1 -1
  54. package/dist/mermaid/renderer.js +1 -1
  55. package/dist/mermaid/renderer.js.map +1 -1
  56. package/dist/mermaid/test-coverage-renderer.d.ts.map +1 -1
  57. package/dist/mermaid/test-coverage-renderer.js +18 -12
  58. package/dist/mermaid/test-coverage-renderer.js.map +1 -1
  59. package/dist/parser/archjson-aggregator.js +1 -1
  60. package/dist/parser/archjson-aggregator.js.map +1 -1
  61. package/dist/parser/parallel-parser.d.ts +10 -0
  62. package/dist/parser/parallel-parser.d.ts.map +1 -1
  63. package/dist/parser/parallel-parser.js +76 -35
  64. package/dist/parser/parallel-parser.js.map +1 -1
  65. package/dist/parser/parse-worker-pool.d.ts +59 -0
  66. package/dist/parser/parse-worker-pool.d.ts.map +1 -0
  67. package/dist/parser/parse-worker-pool.js +170 -0
  68. package/dist/parser/parse-worker-pool.js.map +1 -0
  69. package/dist/parser/parse-worker.d.ts +2 -0
  70. package/dist/parser/parse-worker.d.ts.map +1 -0
  71. package/dist/parser/parse-worker.js +71 -0
  72. package/dist/parser/parse-worker.js.map +1 -0
  73. package/dist/parser/process-parse-worker-pools.d.ts +18 -0
  74. package/dist/parser/process-parse-worker-pools.d.ts.map +1 -0
  75. package/dist/parser/process-parse-worker-pools.js +31 -0
  76. package/dist/parser/process-parse-worker-pools.js.map +1 -0
  77. package/dist/plugins/cpp/builders/class-builder.d.ts +2 -2
  78. package/dist/plugins/cpp/builders/class-builder.d.ts.map +1 -1
  79. package/dist/plugins/cpp/builders/class-builder.js.map +1 -1
  80. package/dist/plugins/cpp/index.d.ts +4 -1
  81. package/dist/plugins/cpp/index.d.ts.map +1 -1
  82. package/dist/plugins/cpp/index.js +11 -2
  83. package/dist/plugins/cpp/index.js.map +1 -1
  84. package/dist/plugins/cpp/tree-sitter-bridge.d.ts +3 -2
  85. package/dist/plugins/cpp/tree-sitter-bridge.d.ts.map +1 -1
  86. package/dist/plugins/cpp/tree-sitter-bridge.js +17 -15
  87. package/dist/plugins/cpp/tree-sitter-bridge.js.map +1 -1
  88. package/dist/plugins/golang/builders/function-builder.d.ts +4 -4
  89. package/dist/plugins/golang/builders/function-builder.d.ts.map +1 -1
  90. package/dist/plugins/golang/builders/function-builder.js.map +1 -1
  91. package/dist/plugins/golang/builders/goroutine-builder.d.ts +2 -2
  92. package/dist/plugins/golang/builders/goroutine-builder.d.ts.map +1 -1
  93. package/dist/plugins/golang/builders/goroutine-builder.js.map +1 -1
  94. package/dist/plugins/golang/builders/interface-builder.d.ts +4 -4
  95. package/dist/plugins/golang/builders/interface-builder.d.ts.map +1 -1
  96. package/dist/plugins/golang/builders/interface-builder.js.map +1 -1
  97. package/dist/plugins/golang/builders/node-utils.d.ts +3 -3
  98. package/dist/plugins/golang/builders/node-utils.d.ts.map +1 -1
  99. package/dist/plugins/golang/builders/node-utils.js.map +1 -1
  100. package/dist/plugins/golang/builders/struct-builder.d.ts +2 -2
  101. package/dist/plugins/golang/builders/struct-builder.d.ts.map +1 -1
  102. package/dist/plugins/golang/builders/struct-builder.js.map +1 -1
  103. package/dist/plugins/golang/go-parse-coordinator.d.ts +10 -2
  104. package/dist/plugins/golang/go-parse-coordinator.d.ts.map +1 -1
  105. package/dist/plugins/golang/go-parse-coordinator.js +44 -6
  106. package/dist/plugins/golang/go-parse-coordinator.js.map +1 -1
  107. package/dist/plugins/golang/gopls-client.d.ts +31 -2
  108. package/dist/plugins/golang/gopls-client.d.ts.map +1 -1
  109. package/dist/plugins/golang/gopls-client.js +230 -32
  110. package/dist/plugins/golang/gopls-client.js.map +1 -1
  111. package/dist/plugins/golang/gopls-interface-resolver.d.ts +14 -1
  112. package/dist/plugins/golang/gopls-interface-resolver.d.ts.map +1 -1
  113. package/dist/plugins/golang/gopls-interface-resolver.js +42 -11
  114. package/dist/plugins/golang/gopls-interface-resolver.js.map +1 -1
  115. package/dist/plugins/golang/index.d.ts +3 -1
  116. package/dist/plugins/golang/index.d.ts.map +1 -1
  117. package/dist/plugins/golang/index.js +17 -3
  118. package/dist/plugins/golang/index.js.map +1 -1
  119. package/dist/plugins/golang/interface-matcher.d.ts.map +1 -1
  120. package/dist/plugins/golang/interface-matcher.js +32 -30
  121. package/dist/plugins/golang/interface-matcher.js.map +1 -1
  122. package/dist/plugins/golang/tree-sitter-bridge.d.ts +3 -2
  123. package/dist/plugins/golang/tree-sitter-bridge.d.ts.map +1 -1
  124. package/dist/plugins/golang/tree-sitter-bridge.js +25 -23
  125. package/dist/plugins/golang/tree-sitter-bridge.js.map +1 -1
  126. package/dist/plugins/java/index.d.ts +4 -0
  127. package/dist/plugins/java/index.d.ts.map +1 -1
  128. package/dist/plugins/java/index.js +12 -1
  129. package/dist/plugins/java/index.js.map +1 -1
  130. package/dist/plugins/java/tree-sitter-bridge.d.ts +3 -2
  131. package/dist/plugins/java/tree-sitter-bridge.d.ts.map +1 -1
  132. package/dist/plugins/java/tree-sitter-bridge.js +33 -31
  133. package/dist/plugins/java/tree-sitter-bridge.js.map +1 -1
  134. package/dist/plugins/kotlin/builders/class-builder.d.ts +2 -1
  135. package/dist/plugins/kotlin/builders/class-builder.d.ts.map +1 -1
  136. package/dist/plugins/kotlin/builders/class-builder.js.map +1 -1
  137. package/dist/plugins/kotlin/builders/function-builder.d.ts +2 -1
  138. package/dist/plugins/kotlin/builders/function-builder.d.ts.map +1 -1
  139. package/dist/plugins/kotlin/builders/function-builder.js.map +1 -1
  140. package/dist/plugins/kotlin/index.d.ts +4 -1
  141. package/dist/plugins/kotlin/index.d.ts.map +1 -1
  142. package/dist/plugins/kotlin/index.js +12 -4
  143. package/dist/plugins/kotlin/index.js.map +1 -1
  144. package/dist/plugins/kotlin/tree-sitter-bridge.d.ts +3 -3
  145. package/dist/plugins/kotlin/tree-sitter-bridge.d.ts.map +1 -1
  146. package/dist/plugins/kotlin/tree-sitter-bridge.js +6 -7
  147. package/dist/plugins/kotlin/tree-sitter-bridge.js.map +1 -1
  148. package/dist/plugins/python/index.d.ts +4 -0
  149. package/dist/plugins/python/index.d.ts.map +1 -1
  150. package/dist/plugins/python/index.js +12 -1
  151. package/dist/plugins/python/index.js.map +1 -1
  152. package/dist/plugins/python/tree-sitter-bridge.d.ts +3 -2
  153. package/dist/plugins/python/tree-sitter-bridge.d.ts.map +1 -1
  154. package/dist/plugins/python/tree-sitter-bridge.js +50 -48
  155. package/dist/plugins/python/tree-sitter-bridge.js.map +1 -1
  156. package/dist/plugins/shared/native-parser-backend.d.ts +33 -0
  157. package/dist/plugins/shared/native-parser-backend.d.ts.map +1 -0
  158. package/dist/plugins/shared/native-parser-backend.js +84 -0
  159. package/dist/plugins/shared/native-parser-backend.js.map +1 -0
  160. package/dist/plugins/shared/parser-backend.d.ts +13 -0
  161. package/dist/plugins/shared/parser-backend.d.ts.map +1 -0
  162. package/dist/plugins/shared/parser-backend.js +38 -0
  163. package/dist/plugins/shared/parser-backend.js.map +1 -0
  164. package/dist/plugins/shared/parser-runtime.d.ts +32 -0
  165. package/dist/plugins/shared/parser-runtime.d.ts.map +1 -0
  166. package/dist/plugins/shared/parser-runtime.js +152 -0
  167. package/dist/plugins/shared/parser-runtime.js.map +1 -0
  168. package/dist/plugins/shared/plugin-factory.d.ts +5 -0
  169. package/dist/plugins/shared/plugin-factory.d.ts.map +1 -0
  170. package/dist/plugins/shared/plugin-factory.js +27 -0
  171. package/dist/plugins/shared/plugin-factory.js.map +1 -0
  172. package/dist/plugins/shared/syntax-tree.d.ts +32 -0
  173. package/dist/plugins/shared/syntax-tree.d.ts.map +1 -0
  174. package/dist/plugins/shared/syntax-tree.js +2 -0
  175. package/dist/plugins/shared/syntax-tree.js.map +1 -0
  176. package/dist/plugins/shared/wasm-parser-backend.d.ts +18 -0
  177. package/dist/plugins/shared/wasm-parser-backend.d.ts.map +1 -0
  178. package/dist/plugins/shared/wasm-parser-backend.js +118 -0
  179. package/dist/plugins/shared/wasm-parser-backend.js.map +1 -0
  180. package/dist/plugins/typescript/builders/module-graph-builder.d.ts.map +1 -1
  181. package/dist/plugins/typescript/builders/module-graph-builder.js +2 -1
  182. package/dist/plugins/typescript/builders/module-graph-builder.js.map +1 -1
  183. package/dist/types/config-global.d.ts +7 -1
  184. package/dist/types/config-global.d.ts.map +1 -1
  185. package/dist/types/config.d.ts +1 -0
  186. package/dist/types/config.d.ts.map +1 -1
  187. package/dist/types/config.js +1 -0
  188. package/dist/types/config.js.map +1 -1
  189. package/dist/types/fitness-rules.d.ts +34 -0
  190. package/dist/types/fitness-rules.d.ts.map +1 -0
  191. package/dist/types/fitness-rules.js +2 -0
  192. package/dist/types/fitness-rules.js.map +1 -0
  193. package/dist/types/parser-runtime.d.ts +4 -0
  194. package/dist/types/parser-runtime.d.ts.map +1 -0
  195. package/dist/types/parser-runtime.js +5 -0
  196. package/dist/types/parser-runtime.js.map +1 -0
  197. package/package.json +29 -16
  198. package/node_modules/node-addon-api/LICENSE.md +0 -9
  199. package/node_modules/node-addon-api/README.md +0 -95
  200. package/node_modules/node-addon-api/common.gypi +0 -21
  201. package/node_modules/node-addon-api/except.gypi +0 -25
  202. package/node_modules/node-addon-api/index.js +0 -14
  203. package/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
  204. package/node_modules/node-addon-api/napi-inl.h +0 -7033
  205. package/node_modules/node-addon-api/napi.h +0 -3309
  206. package/node_modules/node-addon-api/node_addon_api.gyp +0 -42
  207. package/node_modules/node-addon-api/node_api.gyp +0 -9
  208. package/node_modules/node-addon-api/noexcept.gypi +0 -26
  209. package/node_modules/node-addon-api/nothing.c +0 -0
  210. package/node_modules/node-addon-api/package-support.json +0 -21
  211. package/node_modules/node-addon-api/package.json +0 -480
  212. package/node_modules/node-addon-api/tools/README.md +0 -73
  213. package/node_modules/node-addon-api/tools/check-napi.js +0 -99
  214. package/node_modules/node-addon-api/tools/clang-format.js +0 -71
  215. package/node_modules/node-addon-api/tools/conversion.js +0 -301
  216. package/node_modules/node-gyp-build/README.md +0 -58
  217. package/node_modules/node-gyp-build/SECURITY.md +0 -5
  218. package/node_modules/node-gyp-build/bin.js +0 -84
  219. package/node_modules/node-gyp-build/build-test.js +0 -19
  220. package/node_modules/node-gyp-build/index.js +0 -6
  221. package/node_modules/node-gyp-build/node-gyp-build.js +0 -207
  222. package/node_modules/node-gyp-build/optional.js +0 -7
  223. package/node_modules/node-gyp-build/package.json +0 -43
  224. package/node_modules/tree-sitter/README.md +0 -128
  225. package/node_modules/tree-sitter/binding.gyp +0 -80
  226. package/node_modules/tree-sitter/index.js +0 -916
  227. package/node_modules/tree-sitter/package.json +0 -76
  228. package/node_modules/tree-sitter/prebuilds/linux-x64/node.napi.glibc.node +0 -0
  229. package/node_modules/tree-sitter/src/addon_data.h +0 -47
  230. package/node_modules/tree-sitter/src/binding.cc +0 -35
  231. package/node_modules/tree-sitter/src/conversions.cc +0 -140
  232. package/node_modules/tree-sitter/src/conversions.h +0 -22
  233. package/node_modules/tree-sitter/src/language.cc +0 -106
  234. package/node_modules/tree-sitter/src/language.h +0 -17
  235. package/node_modules/tree-sitter/src/logger.cc +0 -70
  236. package/node_modules/tree-sitter/src/logger.h +0 -19
  237. package/node_modules/tree-sitter/src/lookaheaditerator.cc +0 -122
  238. package/node_modules/tree-sitter/src/lookaheaditerator.h +0 -33
  239. package/node_modules/tree-sitter/src/node.cc +0 -1088
  240. package/node_modules/tree-sitter/src/node.h +0 -30
  241. package/node_modules/tree-sitter/src/parser.cc +0 -306
  242. package/node_modules/tree-sitter/src/parser.h +0 -35
  243. package/node_modules/tree-sitter/src/query.cc +0 -397
  244. package/node_modules/tree-sitter/src/query.h +0 -40
  245. package/node_modules/tree-sitter/src/tree.cc +0 -316
  246. package/node_modules/tree-sitter/src/tree.h +0 -45
  247. package/node_modules/tree-sitter/src/tree_cursor.cc +0 -213
  248. package/node_modules/tree-sitter/src/tree_cursor.h +0 -52
  249. package/node_modules/tree-sitter/tree-sitter.d.ts +0 -1042
  250. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +0 -1478
  251. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +0 -48
  252. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +0 -41
  253. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +0 -291
  254. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +0 -68
  255. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +0 -146
  256. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +0 -11
  257. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +0 -523
  258. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +0 -36
  259. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +0 -21
  260. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +0 -293
  261. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +0 -293
  262. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +0 -52
  263. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +0 -483
  264. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +0 -54
  265. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +0 -12
  266. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +0 -875
  267. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +0 -2293
  268. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +0 -286
  269. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +0 -48
  270. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +0 -239
  271. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +0 -4350
  272. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +0 -34
  273. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +0 -95
  274. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +0 -911
  275. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +0 -133
  276. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +0 -1034
  277. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +0 -399
  278. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +0 -170
  279. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +0 -31
  280. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +0 -717
  281. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +0 -48
  282. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +0 -11
  283. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +0 -1
  284. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +0 -414
  285. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +0 -29
  286. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +0 -1
  287. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +0 -448
  288. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +0 -1
  289. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +0 -1
  290. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +0 -733
  291. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +0 -881
  292. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +0 -75
  293. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +0 -24
  294. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +0 -113
  295. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +0 -1314
  296. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +0 -1935
  297. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +0 -31
  298. package/scripts/postinstall-tree-sitter.mjs +0 -28
@@ -1,911 +0,0 @@
1
- #include "./alloc.h"
2
- #include "./language.h"
3
- #include "./subtree.h"
4
- #include "./array.h"
5
- #include "./stack.h"
6
- #include "./length.h"
7
- #include <assert.h>
8
- #include <inttypes.h>
9
- #include <stdio.h>
10
-
11
- #define MAX_LINK_COUNT 8
12
- #define MAX_NODE_POOL_SIZE 50
13
- #define MAX_ITERATOR_COUNT 64
14
-
15
- #if defined _WIN32 && !defined __GNUC__
16
- #define forceinline __forceinline
17
- #else
18
- #define forceinline static inline __attribute__((always_inline))
19
- #endif
20
-
21
- typedef struct StackNode StackNode;
22
-
23
- typedef struct {
24
- StackNode *node;
25
- Subtree subtree;
26
- bool is_pending;
27
- } StackLink;
28
-
29
- struct StackNode {
30
- TSStateId state;
31
- Length position;
32
- StackLink links[MAX_LINK_COUNT];
33
- short unsigned int link_count;
34
- uint32_t ref_count;
35
- unsigned error_cost;
36
- unsigned node_count;
37
- int dynamic_precedence;
38
- };
39
-
40
- typedef struct {
41
- StackNode *node;
42
- SubtreeArray subtrees;
43
- uint32_t subtree_count;
44
- bool is_pending;
45
- } StackIterator;
46
-
47
- typedef Array(StackNode *) StackNodeArray;
48
-
49
- typedef enum {
50
- StackStatusActive,
51
- StackStatusPaused,
52
- StackStatusHalted,
53
- } StackStatus;
54
-
55
- typedef struct {
56
- StackNode *node;
57
- StackSummary *summary;
58
- unsigned node_count_at_last_error;
59
- Subtree last_external_token;
60
- Subtree lookahead_when_paused;
61
- StackStatus status;
62
- } StackHead;
63
-
64
- struct Stack {
65
- Array(StackHead) heads;
66
- StackSliceArray slices;
67
- Array(StackIterator) iterators;
68
- StackNodeArray node_pool;
69
- StackNode *base_node;
70
- SubtreePool *subtree_pool;
71
- };
72
-
73
- typedef unsigned StackAction;
74
- enum {
75
- StackActionNone,
76
- StackActionStop = 1,
77
- StackActionPop = 2,
78
- };
79
-
80
- typedef StackAction (*StackCallback)(void *, const StackIterator *);
81
-
82
- static void stack_node_retain(StackNode *self) {
83
- if (!self)
84
- return;
85
- ts_assert(self->ref_count > 0);
86
- self->ref_count++;
87
- ts_assert(self->ref_count != 0);
88
- }
89
-
90
- static void stack_node_release(
91
- StackNode *self,
92
- StackNodeArray *pool,
93
- SubtreePool *subtree_pool
94
- ) {
95
- recur:
96
- ts_assert(self->ref_count != 0);
97
- self->ref_count--;
98
- if (self->ref_count > 0) return;
99
-
100
- StackNode *first_predecessor = NULL;
101
- if (self->link_count > 0) {
102
- for (unsigned i = self->link_count - 1; i > 0; i--) {
103
- StackLink link = self->links[i];
104
- if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree);
105
- stack_node_release(link.node, pool, subtree_pool);
106
- }
107
- StackLink link = self->links[0];
108
- if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree);
109
- first_predecessor = self->links[0].node;
110
- }
111
-
112
- if (pool->size < MAX_NODE_POOL_SIZE) {
113
- array_push(pool, self);
114
- } else {
115
- ts_free(self);
116
- }
117
-
118
- if (first_predecessor) {
119
- self = first_predecessor;
120
- goto recur;
121
- }
122
- }
123
-
124
- /// Get the number of nodes in the subtree, for the purpose of measuring
125
- /// how much progress has been made by a given version of the stack.
126
- static uint32_t stack__subtree_node_count(Subtree subtree) {
127
- uint32_t count = ts_subtree_visible_descendant_count(subtree);
128
- if (ts_subtree_visible(subtree)) count++;
129
-
130
- // Count intermediate error nodes even though they are not visible,
131
- // because a stack version's node count is used to check whether it
132
- // has made any progress since the last time it encountered an error.
133
- if (ts_subtree_symbol(subtree) == ts_builtin_sym_error_repeat) count++;
134
-
135
- return count;
136
- }
137
-
138
- static StackNode *stack_node_new(
139
- StackNode *previous_node,
140
- Subtree subtree,
141
- bool is_pending,
142
- TSStateId state,
143
- StackNodeArray *pool
144
- ) {
145
- StackNode *node = pool->size > 0
146
- ? array_pop(pool)
147
- : ts_malloc(sizeof(StackNode));
148
- *node = (StackNode) {
149
- .ref_count = 1,
150
- .link_count = 0,
151
- .state = state
152
- };
153
-
154
- if (previous_node) {
155
- node->link_count = 1;
156
- node->links[0] = (StackLink) {
157
- .node = previous_node,
158
- .subtree = subtree,
159
- .is_pending = is_pending,
160
- };
161
-
162
- node->position = previous_node->position;
163
- node->error_cost = previous_node->error_cost;
164
- node->dynamic_precedence = previous_node->dynamic_precedence;
165
- node->node_count = previous_node->node_count;
166
-
167
- if (subtree.ptr) {
168
- node->error_cost += ts_subtree_error_cost(subtree);
169
- node->position = length_add(node->position, ts_subtree_total_size(subtree));
170
- node->node_count += stack__subtree_node_count(subtree);
171
- node->dynamic_precedence += ts_subtree_dynamic_precedence(subtree);
172
- }
173
- } else {
174
- node->position = length_zero();
175
- node->error_cost = 0;
176
- }
177
-
178
- return node;
179
- }
180
-
181
- static bool stack__subtree_is_equivalent(Subtree left, Subtree right) {
182
- if (left.ptr == right.ptr) return true;
183
- if (!left.ptr || !right.ptr) return false;
184
-
185
- // Symbols must match
186
- if (ts_subtree_symbol(left) != ts_subtree_symbol(right)) return false;
187
-
188
- // If both have errors, don't bother keeping both.
189
- if (ts_subtree_error_cost(left) > 0 && ts_subtree_error_cost(right) > 0) return true;
190
-
191
- return (
192
- ts_subtree_padding(left).bytes == ts_subtree_padding(right).bytes &&
193
- ts_subtree_size(left).bytes == ts_subtree_size(right).bytes &&
194
- ts_subtree_child_count(left) == ts_subtree_child_count(right) &&
195
- ts_subtree_extra(left) == ts_subtree_extra(right) &&
196
- ts_subtree_external_scanner_state_eq(left, right)
197
- );
198
- }
199
-
200
- static void stack_node_add_link(
201
- StackNode *self,
202
- StackLink link,
203
- SubtreePool *subtree_pool
204
- ) {
205
- if (link.node == self) return;
206
-
207
- for (int i = 0; i < self->link_count; i++) {
208
- StackLink *existing_link = &self->links[i];
209
- if (stack__subtree_is_equivalent(existing_link->subtree, link.subtree)) {
210
- // In general, we preserve ambiguities until they are removed from the stack
211
- // during a pop operation where multiple paths lead to the same node. But in
212
- // the special case where two links directly connect the same pair of nodes,
213
- // we can safely remove the ambiguity ahead of time without changing behavior.
214
- if (existing_link->node == link.node) {
215
- if (
216
- ts_subtree_dynamic_precedence(link.subtree) >
217
- ts_subtree_dynamic_precedence(existing_link->subtree)
218
- ) {
219
- ts_subtree_retain(link.subtree);
220
- ts_subtree_release(subtree_pool, existing_link->subtree);
221
- existing_link->subtree = link.subtree;
222
- self->dynamic_precedence =
223
- link.node->dynamic_precedence + ts_subtree_dynamic_precedence(link.subtree);
224
- }
225
- return;
226
- }
227
-
228
- // If the previous nodes are mergeable, merge them recursively.
229
- if (
230
- existing_link->node->state == link.node->state &&
231
- existing_link->node->position.bytes == link.node->position.bytes &&
232
- existing_link->node->error_cost == link.node->error_cost
233
- ) {
234
- for (int j = 0; j < link.node->link_count; j++) {
235
- stack_node_add_link(existing_link->node, link.node->links[j], subtree_pool);
236
- }
237
- int32_t dynamic_precedence = link.node->dynamic_precedence;
238
- if (link.subtree.ptr) {
239
- dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree);
240
- }
241
- if (dynamic_precedence > self->dynamic_precedence) {
242
- self->dynamic_precedence = dynamic_precedence;
243
- }
244
- return;
245
- }
246
- }
247
- }
248
-
249
- if (self->link_count == MAX_LINK_COUNT) return;
250
-
251
- stack_node_retain(link.node);
252
- unsigned node_count = link.node->node_count;
253
- int dynamic_precedence = link.node->dynamic_precedence;
254
- self->links[self->link_count++] = link;
255
-
256
- if (link.subtree.ptr) {
257
- ts_subtree_retain(link.subtree);
258
- node_count += stack__subtree_node_count(link.subtree);
259
- dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree);
260
- }
261
-
262
- if (node_count > self->node_count) self->node_count = node_count;
263
- if (dynamic_precedence > self->dynamic_precedence) self->dynamic_precedence = dynamic_precedence;
264
- }
265
-
266
- static void stack_head_delete(
267
- StackHead *self,
268
- StackNodeArray *pool,
269
- SubtreePool *subtree_pool
270
- ) {
271
- if (self->node) {
272
- if (self->last_external_token.ptr) {
273
- ts_subtree_release(subtree_pool, self->last_external_token);
274
- }
275
- if (self->lookahead_when_paused.ptr) {
276
- ts_subtree_release(subtree_pool, self->lookahead_when_paused);
277
- }
278
- if (self->summary) {
279
- array_delete(self->summary);
280
- ts_free(self->summary);
281
- }
282
- stack_node_release(self->node, pool, subtree_pool);
283
- }
284
- }
285
-
286
- static StackVersion ts_stack__add_version(
287
- Stack *self,
288
- StackVersion original_version,
289
- StackNode *node
290
- ) {
291
- StackHead head = {
292
- .node = node,
293
- .node_count_at_last_error = self->heads.contents[original_version].node_count_at_last_error,
294
- .last_external_token = self->heads.contents[original_version].last_external_token,
295
- .status = StackStatusActive,
296
- .lookahead_when_paused = NULL_SUBTREE,
297
- };
298
- array_push(&self->heads, head);
299
- stack_node_retain(node);
300
- if (head.last_external_token.ptr) ts_subtree_retain(head.last_external_token);
301
- return (StackVersion)(self->heads.size - 1);
302
- }
303
-
304
- static void ts_stack__add_slice(
305
- Stack *self,
306
- StackVersion original_version,
307
- StackNode *node,
308
- SubtreeArray *subtrees
309
- ) {
310
- for (uint32_t i = self->slices.size - 1; i + 1 > 0; i--) {
311
- StackVersion version = self->slices.contents[i].version;
312
- if (self->heads.contents[version].node == node) {
313
- StackSlice slice = {*subtrees, version};
314
- array_insert(&self->slices, i + 1, slice);
315
- return;
316
- }
317
- }
318
-
319
- StackVersion version = ts_stack__add_version(self, original_version, node);
320
- StackSlice slice = { *subtrees, version };
321
- array_push(&self->slices, slice);
322
- }
323
-
324
- static StackSliceArray stack__iter(
325
- Stack *self,
326
- StackVersion version,
327
- StackCallback callback,
328
- void *payload,
329
- int goal_subtree_count
330
- ) {
331
- array_clear(&self->slices);
332
- array_clear(&self->iterators);
333
-
334
- StackHead *head = array_get(&self->heads, version);
335
- StackIterator new_iterator = {
336
- .node = head->node,
337
- .subtrees = array_new(),
338
- .subtree_count = 0,
339
- .is_pending = true,
340
- };
341
-
342
- bool include_subtrees = false;
343
- if (goal_subtree_count >= 0) {
344
- include_subtrees = true;
345
- array_reserve(&new_iterator.subtrees, (uint32_t)ts_subtree_alloc_size(goal_subtree_count) / sizeof(Subtree));
346
- }
347
-
348
- array_push(&self->iterators, new_iterator);
349
-
350
- while (self->iterators.size > 0) {
351
- for (uint32_t i = 0, size = self->iterators.size; i < size; i++) {
352
- StackIterator *iterator = &self->iterators.contents[i];
353
- StackNode *node = iterator->node;
354
-
355
- StackAction action = callback(payload, iterator);
356
- bool should_pop = action & StackActionPop;
357
- bool should_stop = action & StackActionStop || node->link_count == 0;
358
-
359
- if (should_pop) {
360
- SubtreeArray subtrees = iterator->subtrees;
361
- if (!should_stop) {
362
- ts_subtree_array_copy(subtrees, &subtrees);
363
- }
364
- ts_subtree_array_reverse(&subtrees);
365
- ts_stack__add_slice(
366
- self,
367
- version,
368
- node,
369
- &subtrees
370
- );
371
- }
372
-
373
- if (should_stop) {
374
- if (!should_pop) {
375
- ts_subtree_array_delete(self->subtree_pool, &iterator->subtrees);
376
- }
377
- array_erase(&self->iterators, i);
378
- i--, size--;
379
- continue;
380
- }
381
-
382
- for (uint32_t j = 1; j <= node->link_count; j++) {
383
- StackIterator *next_iterator;
384
- StackLink link;
385
- if (j == node->link_count) {
386
- link = node->links[0];
387
- next_iterator = &self->iterators.contents[i];
388
- } else {
389
- if (self->iterators.size >= MAX_ITERATOR_COUNT) continue;
390
- link = node->links[j];
391
- StackIterator current_iterator = self->iterators.contents[i];
392
- array_push(&self->iterators, current_iterator);
393
- next_iterator = array_back(&self->iterators);
394
- ts_subtree_array_copy(next_iterator->subtrees, &next_iterator->subtrees);
395
- }
396
-
397
- next_iterator->node = link.node;
398
- if (link.subtree.ptr) {
399
- if (include_subtrees) {
400
- array_push(&next_iterator->subtrees, link.subtree);
401
- ts_subtree_retain(link.subtree);
402
- }
403
-
404
- if (!ts_subtree_extra(link.subtree)) {
405
- next_iterator->subtree_count++;
406
- if (!link.is_pending) {
407
- next_iterator->is_pending = false;
408
- }
409
- }
410
- } else {
411
- next_iterator->subtree_count++;
412
- next_iterator->is_pending = false;
413
- }
414
- }
415
- }
416
- }
417
-
418
- return self->slices;
419
- }
420
-
421
- Stack *ts_stack_new(SubtreePool *subtree_pool) {
422
- Stack *self = ts_calloc(1, sizeof(Stack));
423
-
424
- array_init(&self->heads);
425
- array_init(&self->slices);
426
- array_init(&self->iterators);
427
- array_init(&self->node_pool);
428
- array_reserve(&self->heads, 4);
429
- array_reserve(&self->slices, 4);
430
- array_reserve(&self->iterators, 4);
431
- array_reserve(&self->node_pool, MAX_NODE_POOL_SIZE);
432
-
433
- self->subtree_pool = subtree_pool;
434
- self->base_node = stack_node_new(NULL, NULL_SUBTREE, false, 1, &self->node_pool);
435
- ts_stack_clear(self);
436
-
437
- return self;
438
- }
439
-
440
- void ts_stack_delete(Stack *self) {
441
- if (self->slices.contents)
442
- array_delete(&self->slices);
443
- if (self->iterators.contents)
444
- array_delete(&self->iterators);
445
- stack_node_release(self->base_node, &self->node_pool, self->subtree_pool);
446
- for (uint32_t i = 0; i < self->heads.size; i++) {
447
- stack_head_delete(&self->heads.contents[i], &self->node_pool, self->subtree_pool);
448
- }
449
- array_clear(&self->heads);
450
- if (self->node_pool.contents) {
451
- for (uint32_t i = 0; i < self->node_pool.size; i++)
452
- ts_free(self->node_pool.contents[i]);
453
- array_delete(&self->node_pool);
454
- }
455
- array_delete(&self->heads);
456
- ts_free(self);
457
- }
458
-
459
- uint32_t ts_stack_version_count(const Stack *self) {
460
- return self->heads.size;
461
- }
462
-
463
- uint32_t ts_stack_halted_version_count(Stack *self) {
464
- uint32_t count = 0;
465
- for (uint32_t i = 0; i < self->heads.size; i++) {
466
- StackHead *head = array_get(&self->heads, i);
467
- if (head->status == StackStatusHalted) {
468
- count++;
469
- }
470
- }
471
- return count;
472
- }
473
-
474
- TSStateId ts_stack_state(const Stack *self, StackVersion version) {
475
- return array_get(&self->heads, version)->node->state;
476
- }
477
-
478
- Length ts_stack_position(const Stack *self, StackVersion version) {
479
- return array_get(&self->heads, version)->node->position;
480
- }
481
-
482
- Subtree ts_stack_last_external_token(const Stack *self, StackVersion version) {
483
- return array_get(&self->heads, version)->last_external_token;
484
- }
485
-
486
- void ts_stack_set_last_external_token(Stack *self, StackVersion version, Subtree token) {
487
- StackHead *head = array_get(&self->heads, version);
488
- if (token.ptr) ts_subtree_retain(token);
489
- if (head->last_external_token.ptr) ts_subtree_release(self->subtree_pool, head->last_external_token);
490
- head->last_external_token = token;
491
- }
492
-
493
- unsigned ts_stack_error_cost(const Stack *self, StackVersion version) {
494
- StackHead *head = array_get(&self->heads, version);
495
- unsigned result = head->node->error_cost;
496
- if (
497
- head->status == StackStatusPaused ||
498
- (head->node->state == ERROR_STATE && !head->node->links[0].subtree.ptr)) {
499
- result += ERROR_COST_PER_RECOVERY;
500
- }
501
- return result;
502
- }
503
-
504
- unsigned ts_stack_node_count_since_error(const Stack *self, StackVersion version) {
505
- StackHead *head = array_get(&self->heads, version);
506
- if (head->node->node_count < head->node_count_at_last_error) {
507
- head->node_count_at_last_error = head->node->node_count;
508
- }
509
- return head->node->node_count - head->node_count_at_last_error;
510
- }
511
-
512
- void ts_stack_push(
513
- Stack *self,
514
- StackVersion version,
515
- Subtree subtree,
516
- bool pending,
517
- TSStateId state
518
- ) {
519
- StackHead *head = array_get(&self->heads, version);
520
- StackNode *new_node = stack_node_new(head->node, subtree, pending, state, &self->node_pool);
521
- if (!subtree.ptr) head->node_count_at_last_error = new_node->node_count;
522
- head->node = new_node;
523
- }
524
-
525
- forceinline StackAction pop_count_callback(void *payload, const StackIterator *iterator) {
526
- unsigned *goal_subtree_count = payload;
527
- if (iterator->subtree_count == *goal_subtree_count) {
528
- return StackActionPop | StackActionStop;
529
- } else {
530
- return StackActionNone;
531
- }
532
- }
533
-
534
- StackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, uint32_t count) {
535
- return stack__iter(self, version, pop_count_callback, &count, (int)count);
536
- }
537
-
538
-
539
- forceinline StackAction pop_pending_callback(void *payload, const StackIterator *iterator) {
540
- (void)payload;
541
- if (iterator->subtree_count >= 1) {
542
- if (iterator->is_pending) {
543
- return StackActionPop | StackActionStop;
544
- } else {
545
- return StackActionStop;
546
- }
547
- } else {
548
- return StackActionNone;
549
- }
550
- }
551
-
552
- StackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version) {
553
- StackSliceArray pop = stack__iter(self, version, pop_pending_callback, NULL, 0);
554
- if (pop.size > 0) {
555
- ts_stack_renumber_version(self, pop.contents[0].version, version);
556
- pop.contents[0].version = version;
557
- }
558
- return pop;
559
- }
560
-
561
- forceinline StackAction pop_error_callback(void *payload, const StackIterator *iterator) {
562
- if (iterator->subtrees.size > 0) {
563
- bool *found_error = payload;
564
- if (!*found_error && ts_subtree_is_error(iterator->subtrees.contents[0])) {
565
- *found_error = true;
566
- return StackActionPop | StackActionStop;
567
- } else {
568
- return StackActionStop;
569
- }
570
- } else {
571
- return StackActionNone;
572
- }
573
- }
574
-
575
- SubtreeArray ts_stack_pop_error(Stack *self, StackVersion version) {
576
- StackNode *node = array_get(&self->heads, version)->node;
577
- for (unsigned i = 0; i < node->link_count; i++) {
578
- if (node->links[i].subtree.ptr && ts_subtree_is_error(node->links[i].subtree)) {
579
- bool found_error = false;
580
- StackSliceArray pop = stack__iter(self, version, pop_error_callback, &found_error, 1);
581
- if (pop.size > 0) {
582
- ts_assert(pop.size == 1);
583
- ts_stack_renumber_version(self, pop.contents[0].version, version);
584
- return pop.contents[0].subtrees;
585
- }
586
- break;
587
- }
588
- }
589
- return (SubtreeArray) {.size = 0};
590
- }
591
-
592
- forceinline StackAction pop_all_callback(void *payload, const StackIterator *iterator) {
593
- (void)payload;
594
- return iterator->node->link_count == 0 ? StackActionPop : StackActionNone;
595
- }
596
-
597
- StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version) {
598
- return stack__iter(self, version, pop_all_callback, NULL, 0);
599
- }
600
-
601
- typedef struct {
602
- StackSummary *summary;
603
- unsigned max_depth;
604
- } SummarizeStackSession;
605
-
606
- forceinline StackAction summarize_stack_callback(void *payload, const StackIterator *iterator) {
607
- SummarizeStackSession *session = payload;
608
- TSStateId state = iterator->node->state;
609
- unsigned depth = iterator->subtree_count;
610
- if (depth > session->max_depth) return StackActionStop;
611
- for (unsigned i = session->summary->size - 1; i + 1 > 0; i--) {
612
- StackSummaryEntry entry = session->summary->contents[i];
613
- if (entry.depth < depth) break;
614
- if (entry.depth == depth && entry.state == state) return StackActionNone;
615
- }
616
- array_push(session->summary, ((StackSummaryEntry) {
617
- .position = iterator->node->position,
618
- .depth = depth,
619
- .state = state,
620
- }));
621
- return StackActionNone;
622
- }
623
-
624
- void ts_stack_record_summary(Stack *self, StackVersion version, unsigned max_depth) {
625
- SummarizeStackSession session = {
626
- .summary = ts_malloc(sizeof(StackSummary)),
627
- .max_depth = max_depth
628
- };
629
- array_init(session.summary);
630
- stack__iter(self, version, summarize_stack_callback, &session, -1);
631
- StackHead *head = &self->heads.contents[version];
632
- if (head->summary) {
633
- array_delete(head->summary);
634
- ts_free(head->summary);
635
- }
636
- head->summary = session.summary;
637
- }
638
-
639
- StackSummary *ts_stack_get_summary(Stack *self, StackVersion version) {
640
- return array_get(&self->heads, version)->summary;
641
- }
642
-
643
- int ts_stack_dynamic_precedence(Stack *self, StackVersion version) {
644
- return array_get(&self->heads, version)->node->dynamic_precedence;
645
- }
646
-
647
- bool ts_stack_has_advanced_since_error(const Stack *self, StackVersion version) {
648
- const StackHead *head = array_get(&self->heads, version);
649
- const StackNode *node = head->node;
650
- if (node->error_cost == 0) return true;
651
- while (node) {
652
- if (node->link_count > 0) {
653
- Subtree subtree = node->links[0].subtree;
654
- if (subtree.ptr) {
655
- if (ts_subtree_total_bytes(subtree) > 0) {
656
- return true;
657
- } else if (
658
- node->node_count > head->node_count_at_last_error &&
659
- ts_subtree_error_cost(subtree) == 0
660
- ) {
661
- node = node->links[0].node;
662
- continue;
663
- }
664
- }
665
- }
666
- break;
667
- }
668
- return false;
669
- }
670
-
671
- void ts_stack_remove_version(Stack *self, StackVersion version) {
672
- stack_head_delete(array_get(&self->heads, version), &self->node_pool, self->subtree_pool);
673
- array_erase(&self->heads, version);
674
- }
675
-
676
- void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) {
677
- if (v1 == v2) return;
678
- ts_assert(v2 < v1);
679
- ts_assert((uint32_t)v1 < self->heads.size);
680
- StackHead *source_head = &self->heads.contents[v1];
681
- StackHead *target_head = &self->heads.contents[v2];
682
- if (target_head->summary && !source_head->summary) {
683
- source_head->summary = target_head->summary;
684
- target_head->summary = NULL;
685
- }
686
- stack_head_delete(target_head, &self->node_pool, self->subtree_pool);
687
- *target_head = *source_head;
688
- array_erase(&self->heads, v1);
689
- }
690
-
691
- void ts_stack_swap_versions(Stack *self, StackVersion v1, StackVersion v2) {
692
- StackHead temporary_head = self->heads.contents[v1];
693
- self->heads.contents[v1] = self->heads.contents[v2];
694
- self->heads.contents[v2] = temporary_head;
695
- }
696
-
697
- StackVersion ts_stack_copy_version(Stack *self, StackVersion version) {
698
- ts_assert(version < self->heads.size);
699
- array_push(&self->heads, self->heads.contents[version]);
700
- StackHead *head = array_back(&self->heads);
701
- stack_node_retain(head->node);
702
- if (head->last_external_token.ptr) ts_subtree_retain(head->last_external_token);
703
- head->summary = NULL;
704
- return self->heads.size - 1;
705
- }
706
-
707
- bool ts_stack_merge(Stack *self, StackVersion version1, StackVersion version2) {
708
- if (!ts_stack_can_merge(self, version1, version2)) return false;
709
- StackHead *head1 = &self->heads.contents[version1];
710
- StackHead *head2 = &self->heads.contents[version2];
711
- for (uint32_t i = 0; i < head2->node->link_count; i++) {
712
- stack_node_add_link(head1->node, head2->node->links[i], self->subtree_pool);
713
- }
714
- if (head1->node->state == ERROR_STATE) {
715
- head1->node_count_at_last_error = head1->node->node_count;
716
- }
717
- ts_stack_remove_version(self, version2);
718
- return true;
719
- }
720
-
721
- bool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion version2) {
722
- StackHead *head1 = &self->heads.contents[version1];
723
- StackHead *head2 = &self->heads.contents[version2];
724
- return
725
- head1->status == StackStatusActive &&
726
- head2->status == StackStatusActive &&
727
- head1->node->state == head2->node->state &&
728
- head1->node->position.bytes == head2->node->position.bytes &&
729
- head1->node->error_cost == head2->node->error_cost &&
730
- ts_subtree_external_scanner_state_eq(head1->last_external_token, head2->last_external_token);
731
- }
732
-
733
- void ts_stack_halt(Stack *self, StackVersion version) {
734
- array_get(&self->heads, version)->status = StackStatusHalted;
735
- }
736
-
737
- void ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead) {
738
- StackHead *head = array_get(&self->heads, version);
739
- head->status = StackStatusPaused;
740
- head->lookahead_when_paused = lookahead;
741
- head->node_count_at_last_error = head->node->node_count;
742
- }
743
-
744
- bool ts_stack_is_active(const Stack *self, StackVersion version) {
745
- return array_get(&self->heads, version)->status == StackStatusActive;
746
- }
747
-
748
- bool ts_stack_is_halted(const Stack *self, StackVersion version) {
749
- return array_get(&self->heads, version)->status == StackStatusHalted;
750
- }
751
-
752
- bool ts_stack_is_paused(const Stack *self, StackVersion version) {
753
- return array_get(&self->heads, version)->status == StackStatusPaused;
754
- }
755
-
756
- Subtree ts_stack_resume(Stack *self, StackVersion version) {
757
- StackHead *head = array_get(&self->heads, version);
758
- ts_assert(head->status == StackStatusPaused);
759
- Subtree result = head->lookahead_when_paused;
760
- head->status = StackStatusActive;
761
- head->lookahead_when_paused = NULL_SUBTREE;
762
- return result;
763
- }
764
-
765
- void ts_stack_clear(Stack *self) {
766
- stack_node_retain(self->base_node);
767
- for (uint32_t i = 0; i < self->heads.size; i++) {
768
- stack_head_delete(&self->heads.contents[i], &self->node_pool, self->subtree_pool);
769
- }
770
- array_clear(&self->heads);
771
- array_push(&self->heads, ((StackHead) {
772
- .node = self->base_node,
773
- .status = StackStatusActive,
774
- .last_external_token = NULL_SUBTREE,
775
- .lookahead_when_paused = NULL_SUBTREE,
776
- }));
777
- }
778
-
779
- bool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, FILE *f) {
780
- array_reserve(&self->iterators, 32);
781
- if (!f) f = stderr;
782
-
783
- fprintf(f, "digraph stack {\n");
784
- fprintf(f, "rankdir=\"RL\";\n");
785
- fprintf(f, "edge [arrowhead=none]\n");
786
-
787
- Array(StackNode *) visited_nodes = array_new();
788
-
789
- array_clear(&self->iterators);
790
- for (uint32_t i = 0; i < self->heads.size; i++) {
791
- StackHead *head = &self->heads.contents[i];
792
- if (head->status == StackStatusHalted) continue;
793
-
794
- fprintf(f, "node_head_%u [shape=none, label=\"\"]\n", i);
795
- fprintf(f, "node_head_%u -> node_%p [", i, (void *)head->node);
796
-
797
- if (head->status == StackStatusPaused) {
798
- fprintf(f, "color=red ");
799
- }
800
- fprintf(f,
801
- "label=%u, fontcolor=blue, weight=10000, labeltooltip=\"node_count: %u\nerror_cost: %u",
802
- i,
803
- ts_stack_node_count_since_error(self, i),
804
- ts_stack_error_cost(self, i)
805
- );
806
-
807
- if (head->summary) {
808
- fprintf(f, "\nsummary:");
809
- for (uint32_t j = 0; j < head->summary->size; j++) fprintf(f, " %u", head->summary->contents[j].state);
810
- }
811
-
812
- if (head->last_external_token.ptr) {
813
- const ExternalScannerState *state = &head->last_external_token.ptr->external_scanner_state;
814
- const char *data = ts_external_scanner_state_data(state);
815
- fprintf(f, "\nexternal_scanner_state:");
816
- for (uint32_t j = 0; j < state->length; j++) fprintf(f, " %2X", data[j]);
817
- }
818
-
819
- fprintf(f, "\"]\n");
820
- array_push(&self->iterators, ((StackIterator) {
821
- .node = head->node
822
- }));
823
- }
824
-
825
- bool all_iterators_done = false;
826
- while (!all_iterators_done) {
827
- all_iterators_done = true;
828
-
829
- for (uint32_t i = 0; i < self->iterators.size; i++) {
830
- StackIterator iterator = self->iterators.contents[i];
831
- StackNode *node = iterator.node;
832
-
833
- for (uint32_t j = 0; j < visited_nodes.size; j++) {
834
- if (visited_nodes.contents[j] == node) {
835
- node = NULL;
836
- break;
837
- }
838
- }
839
-
840
- if (!node) continue;
841
- all_iterators_done = false;
842
-
843
- fprintf(f, "node_%p [", (void *)node);
844
- if (node->state == ERROR_STATE) {
845
- fprintf(f, "label=\"?\"");
846
- } else if (
847
- node->link_count == 1 &&
848
- node->links[0].subtree.ptr &&
849
- ts_subtree_extra(node->links[0].subtree)
850
- ) {
851
- fprintf(f, "shape=point margin=0 label=\"\"");
852
- } else {
853
- fprintf(f, "label=\"%d\"", node->state);
854
- }
855
-
856
- fprintf(
857
- f,
858
- " tooltip=\"position: %u,%u\nnode_count:%u\nerror_cost: %u\ndynamic_precedence: %d\"];\n",
859
- node->position.extent.row + 1,
860
- node->position.extent.column,
861
- node->node_count,
862
- node->error_cost,
863
- node->dynamic_precedence
864
- );
865
-
866
- for (int j = 0; j < node->link_count; j++) {
867
- StackLink link = node->links[j];
868
- fprintf(f, "node_%p -> node_%p [", (void *)node, (void *)link.node);
869
- if (link.is_pending) fprintf(f, "style=dashed ");
870
- if (link.subtree.ptr && ts_subtree_extra(link.subtree)) fprintf(f, "fontcolor=gray ");
871
-
872
- if (!link.subtree.ptr) {
873
- fprintf(f, "color=red");
874
- } else {
875
- fprintf(f, "label=\"");
876
- bool quoted = ts_subtree_visible(link.subtree) && !ts_subtree_named(link.subtree);
877
- if (quoted) fprintf(f, "'");
878
- ts_language_write_symbol_as_dot_string(language, f, ts_subtree_symbol(link.subtree));
879
- if (quoted) fprintf(f, "'");
880
- fprintf(f, "\"");
881
- fprintf(
882
- f,
883
- "labeltooltip=\"error_cost: %u\ndynamic_precedence: %" PRId32 "\"",
884
- ts_subtree_error_cost(link.subtree),
885
- ts_subtree_dynamic_precedence(link.subtree)
886
- );
887
- }
888
-
889
- fprintf(f, "];\n");
890
-
891
- StackIterator *next_iterator;
892
- if (j == 0) {
893
- next_iterator = &self->iterators.contents[i];
894
- } else {
895
- array_push(&self->iterators, iterator);
896
- next_iterator = array_back(&self->iterators);
897
- }
898
- next_iterator->node = link.node;
899
- }
900
-
901
- array_push(&visited_nodes, node);
902
- }
903
- }
904
-
905
- fprintf(f, "}\n");
906
-
907
- array_delete(&visited_nodes);
908
- return true;
909
- }
910
-
911
- #undef forceinline