@mrclrchtr/supi-code-intelligence 1.7.0 → 1.8.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 (307) hide show
  1. package/README.md +13 -2
  2. package/node_modules/@mrclrchtr/supi-core/package.json +13 -2
  3. package/node_modules/@mrclrchtr/supi-core/src/api.ts +26 -92
  4. package/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
  5. package/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
  6. package/node_modules/@mrclrchtr/supi-core/src/index.ts +26 -92
  7. package/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
  8. package/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
  9. package/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
  10. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
  11. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
  12. package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
  13. package/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
  14. package/node_modules/@mrclrchtr/supi-lsp/README.md +13 -8
  15. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +13 -2
  16. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +26 -92
  17. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
  18. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
  19. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +26 -92
  20. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
  21. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
  22. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
  23. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
  24. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
  25. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
  26. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
  27. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/License.txt +11 -0
  28. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/README.md +69 -0
  29. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
  30. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/browser.js +7 -0
  31. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
  32. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
  33. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
  34. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
  35. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/connection.js +1214 -0
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
  53. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
  54. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
  55. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
  56. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
  57. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
  58. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
  59. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
  60. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
  61. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
  62. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
  63. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
  64. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
  65. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
  66. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
  67. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
  68. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
  69. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/node.cmd +5 -0
  70. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/node.d.ts +6 -0
  71. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/node.js +7 -0
  72. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/package.json +45 -0
  73. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
  74. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
  75. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/License.txt +11 -0
  76. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/README.md +16 -0
  77. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/browser.d.ts +6 -0
  78. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/browser.js +7 -0
  79. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/browser/main.d.ts +4 -0
  80. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/browser/main.js +28 -0
  81. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/api.d.ts +58 -0
  82. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/api.js +77 -0
  83. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/connection.d.ts +187 -0
  84. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/connection.js +15 -0
  85. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/messages.d.ts +51 -0
  86. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/messages.js +44 -0
  87. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.d.ts +1 -0
  88. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.js +43 -0
  89. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.d.ts +86 -0
  90. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.js +42 -0
  91. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.d.ts +66 -0
  92. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.js +32 -0
  93. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.d.ts +35 -0
  94. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.js +24 -0
  95. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.d.ts +3252 -0
  96. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.d.ts +37 -0
  97. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.js +22 -0
  98. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.d.ts +341 -0
  99. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.js +74 -0
  100. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.d.ts +306 -0
  101. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.js +101 -0
  102. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.d.ts +109 -0
  103. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.js +30 -0
  104. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.d.ts +38 -0
  105. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.js +21 -0
  106. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.d.ts +110 -0
  107. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.js +43 -0
  108. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.d.ts +57 -0
  109. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.js +22 -0
  110. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.d.ts +86 -0
  111. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.js +30 -0
  112. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.js +943 -0
  113. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.d.ts +52 -0
  114. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.js +19 -0
  115. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.d.ts +106 -0
  116. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.js +68 -0
  117. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.d.ts +400 -0
  118. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.js +214 -0
  119. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.d.ts +107 -0
  120. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.js +37 -0
  121. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.d.ts +41 -0
  122. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.js +20 -0
  123. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.d.ts +223 -0
  124. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.js +57 -0
  125. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.d.ts +72 -0
  126. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.js +22 -0
  127. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.d.ts +38 -0
  128. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.js +21 -0
  129. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.d.ts +83 -0
  130. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.js +42 -0
  131. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.d.ts +74 -0
  132. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.js +27 -0
  133. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/utils/is.d.ts +9 -0
  134. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/utils/is.js +46 -0
  135. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/node/main.d.ts +6 -0
  136. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/node/main.js +28 -0
  137. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/metaModel.schema.json +783 -0
  138. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node.cmd +5 -0
  139. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node.d.ts +6 -0
  140. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node.js +7 -0
  141. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/License.txt +11 -0
  142. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/README.md +69 -0
  143. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
  144. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.js +7 -0
  145. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
  146. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
  147. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
  148. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
  149. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
  150. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
  151. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
  152. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
  153. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
  154. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.js +1212 -0
  155. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
  156. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
  157. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
  158. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
  159. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
  160. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
  161. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
  162. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
  163. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
  164. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
  165. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
  166. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
  167. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
  168. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
  169. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
  170. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
  171. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
  172. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
  173. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
  174. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
  175. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
  176. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
  177. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
  178. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
  179. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
  180. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
  181. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
  182. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
  183. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.cmd +5 -0
  184. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.d.ts +6 -0
  185. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.js +7 -0
  186. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/package.json +45 -0
  187. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
  188. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
  189. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/package.json +45 -0
  190. package/node_modules/@mrclrchtr/{supi-tree-sitter/node_modules/web-tree-sitter/LICENSE → supi-lsp/node_modules/vscode-languageserver-protocol/thirdpartynotices.txt} +16 -6
  191. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/License.txt +11 -0
  192. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/README.md +17 -0
  193. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/esm/main.d.ts +3139 -0
  194. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/esm/main.js +2222 -0
  195. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/esm/package.json +3 -0
  196. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/umd/main.d.ts +3139 -0
  197. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/umd/main.js +2272 -0
  198. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/package.json +38 -0
  199. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/thirdpartynotices.txt +16 -0
  200. package/node_modules/@mrclrchtr/supi-lsp/package.json +2 -2
  201. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +1 -1
  202. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/diagnostic-injection.ts +182 -0
  203. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/session-lifecycle.ts +139 -0
  204. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/status-command.ts +38 -0
  205. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/workspace-recovery.ts +92 -0
  206. package/node_modules/@mrclrchtr/supi-lsp/src/lsp.ts +15 -413
  207. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-helpers.ts +1 -1
  208. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +1 -1
  209. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +1 -1
  210. package/node_modules/@mrclrchtr/supi-lsp/src/session/scanner.ts +1 -1
  211. package/node_modules/@mrclrchtr/supi-lsp/src/session/service-registry.ts +1 -1
  212. package/node_modules/@mrclrchtr/supi-lsp/src/session/settings-registration.ts +1 -1
  213. package/node_modules/@mrclrchtr/supi-lsp/src/tool/guidance.ts +5 -14
  214. package/node_modules/@mrclrchtr/supi-lsp/src/tool/names.ts +12 -4
  215. package/node_modules/@mrclrchtr/supi-lsp/src/tool/register-tools.ts +2 -3
  216. package/node_modules/@mrclrchtr/supi-lsp/src/tool/service-actions.ts +141 -0
  217. package/node_modules/@mrclrchtr/supi-lsp/src/tool/tool-specs.ts +93 -93
  218. package/node_modules/@mrclrchtr/supi-lsp/src/utils.ts +1 -1
  219. package/node_modules/@mrclrchtr/supi-lsp/src/workspace-change.ts +40 -0
  220. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +26 -15
  221. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +13 -2
  222. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +26 -92
  223. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
  224. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
  225. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +26 -92
  226. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
  227. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
  228. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
  229. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
  230. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
  231. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
  232. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
  233. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +2 -2
  234. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime.ts +1 -1
  235. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/service-registry.ts +1 -1
  236. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/guidance.ts +29 -25
  237. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/handlers.ts +196 -0
  238. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/register-tools.ts +107 -0
  239. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/tool-specs.ts +117 -0
  240. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tree-sitter.ts +4 -300
  241. package/package.json +4 -4
  242. package/src/api.ts +15 -0
  243. package/src/architecture.ts +1 -1
  244. package/src/brief.ts +9 -53
  245. package/src/code-intelligence.ts +6 -2
  246. package/src/index.ts +15 -0
  247. package/src/pattern-structured.ts +26 -26
  248. package/src/presentation/markdown/affected.ts +170 -0
  249. package/src/presentation/markdown/brief.ts +174 -0
  250. package/src/presentation/markdown/map.ts +54 -0
  251. package/src/presentation/markdown/overview.ts +59 -0
  252. package/src/presentation/markdown/pattern.ts +239 -0
  253. package/src/presentation/markdown/relations.ts +121 -0
  254. package/src/prioritization-signals.ts +1 -1
  255. package/src/resolve-target.ts +58 -40
  256. package/src/search-helpers.ts +17 -4
  257. package/src/substrates/lsp-adapter.ts +197 -0
  258. package/src/substrates/tree-sitter-adapter.ts +173 -0
  259. package/src/substrates/types.ts +113 -0
  260. package/src/target-resolution.ts +35 -416
  261. package/src/targeting/query.ts +60 -0
  262. package/src/targeting/resolve-anchored.ts +80 -0
  263. package/src/targeting/resolve-file.ts +197 -0
  264. package/src/targeting/resolve-symbol.ts +110 -0
  265. package/src/targeting/types.ts +111 -0
  266. package/src/tool/execute-affected.ts +3 -3
  267. package/src/tool/execute-brief.ts +29 -3
  268. package/src/tool/execute-map.ts +5 -2
  269. package/src/tool/execute-pattern.ts +5 -3
  270. package/src/tool/execute-relations.ts +15 -23
  271. package/src/tool/guidance.ts +30 -1
  272. package/src/tool/tool-specs.ts +29 -48
  273. package/src/use-case/build-overview.ts +36 -0
  274. package/src/use-case/generate-affected.ts +279 -0
  275. package/src/use-case/generate-brief.ts +324 -0
  276. package/src/{actions/map-action.ts → use-case/generate-map.ts} +30 -60
  277. package/src/use-case/generate-pattern.ts +270 -0
  278. package/src/use-case/generate-relations.ts +392 -0
  279. package/src/use-case/support/semantic-references.ts +114 -0
  280. package/src/use-case/types.ts +43 -0
  281. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/README.md +0 -265
  282. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs +0 -4661
  283. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs.map +0 -7
  284. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js +0 -4605
  285. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js.map +0 -7
  286. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm +0 -0
  287. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm.map +0 -57
  288. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/package.json +0 -100
  289. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs +0 -4063
  290. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs.map +0 -7
  291. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts +0 -1025
  292. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts.map +0 -58
  293. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts +0 -1025
  294. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts.map +0 -58
  295. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js +0 -4007
  296. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js.map +0 -7
  297. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm +0 -0
  298. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm.map +0 -55
  299. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/action-specs.ts +0 -92
  300. package/src/actions/affected-action.ts +0 -452
  301. package/src/actions/brief-action.ts +0 -378
  302. package/src/actions/callees-action.ts +0 -155
  303. package/src/actions/callers-action.ts +0 -253
  304. package/src/actions/implementations-action.ts +0 -172
  305. package/src/actions/pattern-action.ts +0 -392
  306. package/src/providers/semantic-provider.ts +0 -34
  307. package/src/providers/structural-provider.ts +0 -26
@@ -1,55 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [
4
- "lib/alloc.c",
5
- "lib/get_changed_ranges.c",
6
- "lib/array.h",
7
- "lib/point.h",
8
- "lib/length.h",
9
- "lib/subtree.h",
10
- "lib/language.h",
11
- "lib/subtree.c",
12
- "lib/language.c",
13
- "lib/lexer.c",
14
- "lib/node.c",
15
- "lib/tree.c",
16
- "lib/point.c",
17
- "lib/parser.c",
18
- "lib/stack.c",
19
- "lib/atomic.h",
20
- "lib/reusable_node.h",
21
- "lib/reduce_action.h",
22
- "lib/query.c",
23
- "lib/unicode.h",
24
- "lib/tree_cursor.c",
25
- "lib/tree_cursor.h",
26
- "lib/tree-sitter.c"
27
- ],
28
- "sourcesContent": [
29
- "#include \"alloc.h\"\n#include \"tree_sitter/api.h\"\n#include <stdlib.h>\n\nstatic void *ts_malloc_default(size_t size) {\n void *result = malloc(size);\n if (size > 0 && !result) {\n fprintf(stderr, \"tree-sitter failed to allocate %zu bytes\", size);\n abort();\n }\n return result;\n}\n\nstatic void *ts_calloc_default(size_t count, size_t size) {\n void *result = calloc(count, size);\n if (count > 0 && !result) {\n fprintf(stderr, \"tree-sitter failed to allocate %zu bytes\", count * size);\n abort();\n }\n return result;\n}\n\nstatic void *ts_realloc_default(void *buffer, size_t size) {\n void *result = realloc(buffer, size);\n if (size > 0 && !result) {\n fprintf(stderr, \"tree-sitter failed to reallocate %zu bytes\", size);\n abort();\n }\n return result;\n}\n\n// Allow clients to override allocation functions dynamically\nTS_PUBLIC void *(*ts_current_malloc)(size_t) = ts_malloc_default;\nTS_PUBLIC void *(*ts_current_calloc)(size_t, size_t) = ts_calloc_default;\nTS_PUBLIC void *(*ts_current_realloc)(void *, size_t) = ts_realloc_default;\nTS_PUBLIC void (*ts_current_free)(void *) = free;\n\nvoid ts_set_allocator(\n void *(*new_malloc)(size_t size),\n void *(*new_calloc)(size_t count, size_t size),\n void *(*new_realloc)(void *ptr, size_t size),\n void (*new_free)(void *ptr)\n) {\n ts_current_malloc = new_malloc ? new_malloc : ts_malloc_default;\n ts_current_calloc = new_calloc ? new_calloc : ts_calloc_default;\n ts_current_realloc = new_realloc ? new_realloc : ts_realloc_default;\n ts_current_free = new_free ? new_free : free;\n}\n",
30
- "#include \"./get_changed_ranges.h\"\n#include \"./subtree.h\"\n#include \"./language.h\"\n#include \"./error_costs.h\"\n#include \"./tree_cursor.h\"\n#include \"./ts_assert.h\"\n\n// #define DEBUG_GET_CHANGED_RANGES\n\nstatic void ts_range_array_add(\n TSRangeArray *self,\n Length start,\n Length end\n) {\n if (self->size > 0) {\n TSRange *last_range = array_back(self);\n if (start.bytes <= last_range->end_byte) {\n last_range->end_byte = end.bytes;\n last_range->end_point = end.extent;\n return;\n }\n }\n\n if (start.bytes < end.bytes) {\n TSRange range = { start.extent, end.extent, start.bytes, end.bytes };\n array_push(self, range);\n }\n}\n\nbool ts_range_array_intersects(\n const TSRangeArray *self,\n unsigned start_index,\n uint32_t start_byte,\n uint32_t end_byte\n) {\n for (unsigned i = start_index; i < self->size; i++) {\n TSRange *range = array_get(self, i);\n if (range->end_byte > start_byte) {\n if (range->start_byte >= end_byte) break;\n return true;\n }\n }\n return false;\n}\n\nvoid ts_range_array_get_changed_ranges(\n const TSRange *old_ranges, unsigned old_range_count,\n const TSRange *new_ranges, unsigned new_range_count,\n TSRangeArray *differences\n) {\n unsigned new_index = 0;\n unsigned old_index = 0;\n Length current_position = length_zero();\n bool in_old_range = false;\n bool in_new_range = false;\n\n while (old_index < old_range_count || new_index < new_range_count) {\n const TSRange *old_range = &old_ranges[old_index];\n const TSRange *new_range = &new_ranges[new_index];\n\n Length next_old_position;\n if (in_old_range) {\n next_old_position = (Length) {old_range->end_byte, old_range->end_point};\n } else if (old_index < old_range_count) {\n next_old_position = (Length) {old_range->start_byte, old_range->start_point};\n } else {\n next_old_position = LENGTH_MAX;\n }\n\n Length next_new_position;\n if (in_new_range) {\n next_new_position = (Length) {new_range->end_byte, new_range->end_point};\n } else if (new_index < new_range_count) {\n next_new_position = (Length) {new_range->start_byte, new_range->start_point};\n } else {\n next_new_position = LENGTH_MAX;\n }\n\n if (next_old_position.bytes < next_new_position.bytes) {\n if (in_old_range != in_new_range) {\n ts_range_array_add(differences, current_position, next_old_position);\n }\n if (in_old_range) old_index++;\n current_position = next_old_position;\n in_old_range = !in_old_range;\n } else if (next_new_position.bytes < next_old_position.bytes) {\n if (in_old_range != in_new_range) {\n ts_range_array_add(differences, current_position, next_new_position);\n }\n if (in_new_range) new_index++;\n current_position = next_new_position;\n in_new_range = !in_new_range;\n } else {\n if (in_old_range != in_new_range) {\n ts_range_array_add(differences, current_position, next_new_position);\n }\n if (in_old_range) old_index++;\n if (in_new_range) new_index++;\n in_old_range = !in_old_range;\n in_new_range = !in_new_range;\n current_position = next_new_position;\n }\n }\n}\n\nvoid ts_range_edit(TSRange *range, const TSInputEdit *edit) {\n if (range->end_byte >= edit->old_end_byte) {\n if (range->end_byte != UINT32_MAX) {\n range->end_byte = edit->new_end_byte + (range->end_byte - edit->old_end_byte);\n range->end_point = point_add(\n edit->new_end_point,\n point_sub(range->end_point, edit->old_end_point)\n );\n if (range->end_byte < edit->new_end_byte) {\n range->end_byte = UINT32_MAX;\n range->end_point = POINT_MAX;\n }\n }\n } else if (range->end_byte > edit->start_byte) {\n range->end_byte = edit->start_byte;\n range->end_point = edit->start_point;\n }\n\n if (range->start_byte >= edit->old_end_byte) {\n range->start_byte = edit->new_end_byte + (range->start_byte - edit->old_end_byte);\n range->start_point = point_add(\n edit->new_end_point,\n point_sub(range->start_point, edit->old_end_point)\n );\n if (range->start_byte < edit->new_end_byte) {\n range->start_byte = UINT32_MAX;\n range->start_point = POINT_MAX;\n }\n } else if (range->start_byte > edit->start_byte) {\n range->start_byte = edit->start_byte;\n range->start_point = edit->start_point;\n }\n}\n\ntypedef struct {\n TreeCursor cursor;\n const TSLanguage *language;\n unsigned visible_depth;\n bool in_padding;\n Subtree prev_external_token;\n} Iterator;\n\nstatic Iterator iterator_new(\n TreeCursor *cursor,\n const Subtree *tree,\n const TSLanguage *language\n) {\n array_clear(&cursor->stack);\n array_push(&cursor->stack, ((TreeCursorEntry) {\n .subtree = tree,\n .position = length_zero(),\n .child_index = 0,\n .structural_child_index = 0,\n }));\n return (Iterator) {\n .cursor = *cursor,\n .language = language,\n .visible_depth = 1,\n .in_padding = false,\n .prev_external_token = NULL_SUBTREE,\n };\n}\n\nstatic bool iterator_done(Iterator *self) {\n return self->cursor.stack.size == 0;\n}\n\nstatic Length iterator_start_position(Iterator *self) {\n TreeCursorEntry entry = *array_back(&self->cursor.stack);\n if (self->in_padding) {\n return entry.position;\n } else {\n return length_add(entry.position, ts_subtree_padding(*entry.subtree));\n }\n}\n\nstatic Length iterator_end_position(Iterator *self) {\n TreeCursorEntry entry = *array_back(&self->cursor.stack);\n Length result = length_add(entry.position, ts_subtree_padding(*entry.subtree));\n if (self->in_padding) {\n return result;\n } else {\n return length_add(result, ts_subtree_size(*entry.subtree));\n }\n}\n\nstatic bool iterator_tree_is_visible(const Iterator *self) {\n TreeCursorEntry entry = *array_back(&self->cursor.stack);\n if (ts_subtree_visible(*entry.subtree)) return true;\n if (self->cursor.stack.size > 1) {\n Subtree parent = *array_get(&self->cursor.stack, self->cursor.stack.size - 2)->subtree;\n return ts_language_alias_at(\n self->language,\n parent.ptr->production_id,\n entry.structural_child_index\n ) != 0;\n }\n return false;\n}\n\nstatic void iterator_get_visible_state(\n const Iterator *self,\n Subtree *tree,\n TSSymbol *alias_symbol,\n uint32_t *start_byte\n) {\n uint32_t i = self->cursor.stack.size - 1;\n\n if (self->in_padding) {\n if (i == 0) return;\n i--;\n }\n\n for (; i + 1 > 0; i--) {\n TreeCursorEntry entry = *array_get(&self->cursor.stack, i);\n\n if (i > 0) {\n const Subtree *parent = array_get(&self->cursor.stack, i - 1)->subtree;\n *alias_symbol = ts_language_alias_at(\n self->language,\n parent->ptr->production_id,\n entry.structural_child_index\n );\n }\n\n if (ts_subtree_visible(*entry.subtree) || *alias_symbol) {\n *tree = *entry.subtree;\n *start_byte = entry.position.bytes;\n break;\n }\n }\n}\n\nstatic void iterator_ascend(Iterator *self) {\n if (iterator_done(self)) return;\n if (iterator_tree_is_visible(self) && !self->in_padding) self->visible_depth--;\n if (array_back(&self->cursor.stack)->child_index > 0) self->in_padding = false;\n self->cursor.stack.size--;\n}\n\nstatic bool iterator_descend(Iterator *self, uint32_t goal_position) {\n if (self->in_padding) return false;\n\n bool did_descend = false;\n do {\n did_descend = false;\n TreeCursorEntry entry = *array_back(&self->cursor.stack);\n Length position = entry.position;\n uint32_t structural_child_index = 0;\n for (uint32_t i = 0, n = ts_subtree_child_count(*entry.subtree); i < n; i++) {\n const Subtree *child = &ts_subtree_children(*entry.subtree)[i];\n Length child_left = length_add(position, ts_subtree_padding(*child));\n Length child_right = length_add(child_left, ts_subtree_size(*child));\n\n if (child_right.bytes > goal_position) {\n array_push(&self->cursor.stack, ((TreeCursorEntry) {\n .subtree = child,\n .position = position,\n .child_index = i,\n .structural_child_index = structural_child_index,\n }));\n\n if (iterator_tree_is_visible(self)) {\n if (child_left.bytes > goal_position) {\n self->in_padding = true;\n } else {\n self->visible_depth++;\n }\n return true;\n }\n\n did_descend = true;\n break;\n }\n\n position = child_right;\n if (!ts_subtree_extra(*child)) structural_child_index++;\n Subtree last_external_token = ts_subtree_last_external_token(*child);\n if (last_external_token.ptr) {\n self->prev_external_token = last_external_token;\n }\n }\n } while (did_descend);\n\n return false;\n}\n\nstatic void iterator_advance(Iterator *self) {\n if (self->in_padding) {\n self->in_padding = false;\n if (iterator_tree_is_visible(self)) {\n self->visible_depth++;\n } else {\n iterator_descend(self, 0);\n }\n return;\n }\n\n for (;;) {\n if (iterator_tree_is_visible(self)) self->visible_depth--;\n TreeCursorEntry entry = array_pop(&self->cursor.stack);\n if (iterator_done(self)) return;\n\n const Subtree *parent = array_back(&self->cursor.stack)->subtree;\n uint32_t child_index = entry.child_index + 1;\n Subtree last_external_token = ts_subtree_last_external_token(*entry.subtree);\n if (last_external_token.ptr) {\n self->prev_external_token = last_external_token;\n }\n if (ts_subtree_child_count(*parent) > child_index) {\n Length position = length_add(entry.position, ts_subtree_total_size(*entry.subtree));\n uint32_t structural_child_index = entry.structural_child_index;\n if (!ts_subtree_extra(*entry.subtree)) structural_child_index++;\n const Subtree *next_child = &ts_subtree_children(*parent)[child_index];\n\n array_push(&self->cursor.stack, ((TreeCursorEntry) {\n .subtree = next_child,\n .position = position,\n .child_index = child_index,\n .structural_child_index = structural_child_index,\n }));\n\n if (iterator_tree_is_visible(self)) {\n if (ts_subtree_padding(*next_child).bytes > 0) {\n self->in_padding = true;\n } else {\n self->visible_depth++;\n }\n } else {\n iterator_descend(self, 0);\n }\n break;\n }\n }\n}\n\ntypedef enum {\n IteratorDiffers,\n IteratorMayDiffer,\n IteratorMatches,\n} IteratorComparison;\n\nstatic IteratorComparison iterator_compare(\n const Iterator *old_iter,\n const Iterator *new_iter\n) {\n Subtree old_tree = NULL_SUBTREE;\n Subtree new_tree = NULL_SUBTREE;\n uint32_t old_start = 0;\n uint32_t new_start = 0;\n TSSymbol old_alias_symbol = 0;\n TSSymbol new_alias_symbol = 0;\n iterator_get_visible_state(old_iter, &old_tree, &old_alias_symbol, &old_start);\n iterator_get_visible_state(new_iter, &new_tree, &new_alias_symbol, &new_start);\n TSSymbol old_symbol = ts_subtree_symbol(old_tree);\n TSSymbol new_symbol = ts_subtree_symbol(new_tree);\n\n if (!old_tree.ptr && !new_tree.ptr) return IteratorMatches;\n if (!old_tree.ptr || !new_tree.ptr) return IteratorDiffers;\n if (old_alias_symbol != new_alias_symbol || old_symbol != new_symbol) return IteratorDiffers;\n\n uint32_t old_size = ts_subtree_size(old_tree).bytes;\n uint32_t new_size = ts_subtree_size(new_tree).bytes;\n TSStateId old_state = ts_subtree_parse_state(old_tree);\n TSStateId new_state = ts_subtree_parse_state(new_tree);\n bool old_has_external_tokens = ts_subtree_has_external_tokens(old_tree);\n bool new_has_external_tokens = ts_subtree_has_external_tokens(new_tree);\n uint32_t old_error_cost = ts_subtree_error_cost(old_tree);\n uint32_t new_error_cost = ts_subtree_error_cost(new_tree);\n\n if (\n old_start != new_start ||\n old_symbol == ts_builtin_sym_error ||\n old_size != new_size ||\n old_state == TS_TREE_STATE_NONE ||\n new_state == TS_TREE_STATE_NONE ||\n ((old_state == ERROR_STATE) != (new_state == ERROR_STATE)) ||\n old_error_cost != new_error_cost ||\n old_has_external_tokens != new_has_external_tokens ||\n ts_subtree_has_changes(old_tree) ||\n (\n old_has_external_tokens &&\n !ts_subtree_external_scanner_state_eq(old_iter->prev_external_token, new_iter->prev_external_token)\n )\n ) {\n return IteratorMayDiffer;\n }\n\n return IteratorMatches;\n}\n\n#ifdef DEBUG_GET_CHANGED_RANGES\nstatic inline void iterator_print_state(Iterator *self) {\n TreeCursorEntry entry = *array_back(&self->cursor.stack);\n TSPoint start = iterator_start_position(self).extent;\n TSPoint end = iterator_end_position(self).extent;\n const char *name = ts_language_symbol_name(self->language, ts_subtree_symbol(*entry.subtree));\n printf(\n \"(%-25s %s\\t depth:%u [%u, %u] - [%u, %u])\",\n name, self->in_padding ? \"(p)\" : \" \",\n self->visible_depth,\n start.row, start.column,\n end.row, end.column\n );\n}\n#endif\n\nunsigned ts_subtree_get_changed_ranges(\n const Subtree *old_tree, const Subtree *new_tree,\n TreeCursor *cursor1, TreeCursor *cursor2,\n const TSLanguage *language,\n const TSRangeArray *included_range_differences,\n TSRange **ranges\n) {\n TSRangeArray results = array_new();\n\n Iterator old_iter = iterator_new(cursor1, old_tree, language);\n Iterator new_iter = iterator_new(cursor2, new_tree, language);\n\n unsigned included_range_difference_index = 0;\n\n Length position = iterator_start_position(&old_iter);\n Length next_position = iterator_start_position(&new_iter);\n if (position.bytes < next_position.bytes) {\n ts_range_array_add(&results, position, next_position);\n position = next_position;\n } else if (position.bytes > next_position.bytes) {\n ts_range_array_add(&results, next_position, position);\n next_position = position;\n }\n\n do {\n #ifdef DEBUG_GET_CHANGED_RANGES\n printf(\"At [%-2u, %-2u] Compare \", position.extent.row, position.extent.column);\n iterator_print_state(&old_iter);\n printf(\"\\tvs\\t\");\n iterator_print_state(&new_iter);\n puts(\"\");\n #endif\n\n // Compare the old and new subtrees.\n IteratorComparison comparison = iterator_compare(&old_iter, &new_iter);\n\n // Even if the two subtrees appear to be identical, they could differ\n // internally if they contain a range of text that was previously\n // excluded from the parse, and is now included, or vice-versa.\n if (comparison == IteratorMatches && ts_range_array_intersects(\n included_range_differences,\n included_range_difference_index,\n position.bytes,\n iterator_end_position(&old_iter).bytes\n )) {\n comparison = IteratorMayDiffer;\n }\n\n bool is_changed = false;\n switch (comparison) {\n // If the subtrees are definitely identical, move to the end\n // of both subtrees.\n case IteratorMatches:\n next_position = iterator_end_position(&old_iter);\n break;\n\n // If the subtrees might differ internally, descend into both\n // subtrees, finding the first child that spans the current position.\n case IteratorMayDiffer:\n if (iterator_descend(&old_iter, position.bytes)) {\n if (!iterator_descend(&new_iter, position.bytes)) {\n is_changed = true;\n next_position = iterator_end_position(&old_iter);\n }\n } else if (iterator_descend(&new_iter, position.bytes)) {\n is_changed = true;\n next_position = iterator_end_position(&new_iter);\n } else {\n next_position = length_min(\n iterator_end_position(&old_iter),\n iterator_end_position(&new_iter)\n );\n }\n break;\n\n // If the subtrees are different, record a change and then move\n // to the end of both subtrees.\n case IteratorDiffers:\n is_changed = true;\n next_position = length_min(\n iterator_end_position(&old_iter),\n iterator_end_position(&new_iter)\n );\n break;\n }\n\n // Ensure that both iterators are caught up to the current position.\n while (\n !iterator_done(&old_iter) &&\n iterator_end_position(&old_iter).bytes <= next_position.bytes\n ) iterator_advance(&old_iter);\n while (\n !iterator_done(&new_iter) &&\n iterator_end_position(&new_iter).bytes <= next_position.bytes\n ) iterator_advance(&new_iter);\n\n // Ensure that both iterators are at the same depth in the tree.\n while (old_iter.visible_depth > new_iter.visible_depth) {\n iterator_ascend(&old_iter);\n }\n while (new_iter.visible_depth > old_iter.visible_depth) {\n iterator_ascend(&new_iter);\n }\n\n if (is_changed) {\n #ifdef DEBUG_GET_CHANGED_RANGES\n printf(\n \" change: [[%u, %u] - [%u, %u]]\\n\",\n position.extent.row + 1, position.extent.column,\n next_position.extent.row + 1, next_position.extent.column\n );\n #endif\n\n ts_range_array_add(&results, position, next_position);\n }\n\n position = next_position;\n\n // Keep track of the current position in the included range differences\n // array in order to avoid scanning the entire array on each iteration.\n while (included_range_difference_index < included_range_differences->size) {\n const TSRange *range = array_get(included_range_differences,\n included_range_difference_index\n );\n if (range->end_byte <= position.bytes) {\n included_range_difference_index++;\n } else {\n break;\n }\n }\n } while (!iterator_done(&old_iter) && !iterator_done(&new_iter));\n\n Length old_size = ts_subtree_total_size(*old_tree);\n Length new_size = ts_subtree_total_size(*new_tree);\n if (old_size.bytes < new_size.bytes) {\n ts_range_array_add(&results, old_size, new_size);\n } else if (new_size.bytes < old_size.bytes) {\n ts_range_array_add(&results, new_size, old_size);\n }\n\n *cursor1 = old_iter.cursor;\n *cursor2 = new_iter.cursor;\n *ranges = results.contents;\n return results.size;\n}\n",
31
- "#ifndef TREE_SITTER_ARRAY_H_\n#define TREE_SITTER_ARRAY_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"./alloc.h\"\n#include \"./ts_assert.h\"\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4101)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-variable\"\n#endif\n\n#define Array(T) \\\n struct { \\\n T *contents; \\\n uint32_t size; \\\n uint32_t capacity; \\\n }\n\n/// Initialize an array.\n#define array_init(self) \\\n ((self)->size = 0, (self)->capacity = 0, (self)->contents = NULL)\n\n/// Create an empty array.\n#define array_new() \\\n { NULL, 0, 0 }\n\n/// Get a pointer to the element at a given `index` in the array.\n#define array_get(self, _index) \\\n (ts_assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index])\n\n/// Get a pointer to the first element in the array.\n#define array_front(self) array_get(self, 0)\n\n/// Get a pointer to the last element in the array.\n#define array_back(self) array_get(self, (self)->size - 1)\n\n/// Clear the array, setting its size to zero. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_clear(self) ((self)->size = 0)\n\n/// Reserve `new_capacity` elements of space in the array. If `new_capacity` is\n/// less than the array's current capacity, this function has no effect.\n#define array_reserve(self, new_capacity) \\\n ((self)->contents = _array__reserve( \\\n (void *)(self)->contents, &(self)->capacity, \\\n array_elem_size(self), new_capacity) \\\n )\n\n/// Free any memory allocated for this array. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_delete(self) \\\n do { \\\n if ((self)->contents) ts_free((self)->contents); \\\n (self)->contents = NULL; \\\n (self)->size = 0; \\\n (self)->capacity = 0; \\\n } while (0)\n\n/// Push a new `element` onto the end of the array.\n#define array_push(self, element) \\\n do { \\\n (self)->contents = _array__grow( \\\n (void *)(self)->contents, (self)->size, &(self)->capacity, \\\n 1, array_elem_size(self) \\\n ); \\\n (self)->contents[(self)->size++] = (element); \\\n } while(0)\n\n/// Increase the array's size by `count` elements.\n/// New elements are zero-initialized.\n#define array_grow_by(self, count) \\\n do { \\\n if ((count) == 0) break; \\\n (self)->contents = _array__grow( \\\n (self)->contents, (self)->size, &(self)->capacity, \\\n count, array_elem_size(self) \\\n ); \\\n memset((self)->contents + (self)->size, 0, (count) * array_elem_size(self)); \\\n (self)->size += (count); \\\n } while (0)\n\n/// Append all elements from one array to the end of another.\n#define array_push_all(self, other) \\\n array_extend((self), (other)->size, (other)->contents)\n\n/// Append `count` elements to the end of the array, reading their values from the\n/// `contents` pointer.\n#define array_extend(self, count, other_contents) \\\n (self)->contents = _array__splice( \\\n (void*)(self)->contents, &(self)->size, &(self)->capacity, \\\n array_elem_size(self), (self)->size, 0, count, other_contents \\\n )\n\n/// Remove `old_count` elements from the array starting at the given `index`. At\n/// the same index, insert `new_count` new elements, reading their values from the\n/// `new_contents` pointer.\n#define array_splice(self, _index, old_count, new_count, new_contents) \\\n (self)->contents = _array__splice( \\\n (void *)(self)->contents, &(self)->size, &(self)->capacity, \\\n array_elem_size(self), _index, old_count, new_count, new_contents \\\n )\n\n/// Insert one `element` into the array at the given `index`.\n#define array_insert(self, _index, element) \\\n (self)->contents = _array__splice( \\\n (void *)(self)->contents, &(self)->size, &(self)->capacity, \\\n array_elem_size(self), _index, 0, 1, &(element) \\\n )\n\n/// Remove one element from the array at the given `index`.\n#define array_erase(self, _index) \\\n _array__erase((void *)(self)->contents, &(self)->size, array_elem_size(self), _index)\n\n/// Pop the last element off the array, returning the element by value.\n#define array_pop(self) ((self)->contents[--(self)->size])\n\n/// Assign the contents of one array to another, reallocating if necessary.\n#define array_assign(self, other) \\\n (self)->contents = _array__assign( \\\n (void *)(self)->contents, &(self)->size, &(self)->capacity, \\\n (const void *)(other)->contents, (other)->size, array_elem_size(self) \\\n )\n\n/// Swap one array with another\n#define array_swap(self, other) \\\n do { \\\n void *_array_swap_tmp = (void *)(self)->contents; \\\n (self)->contents = (other)->contents; \\\n (other)->contents = _array_swap_tmp; \\\n _array__swap(&(self)->size, &(self)->capacity, \\\n &(other)->size, &(other)->capacity); \\\n } while (0)\n\n/// Get the size of the array contents\n#define array_elem_size(self) (sizeof *(self)->contents)\n\n/// Search a sorted array for a given `needle` value, using the given `compare`\n/// callback to determine the order.\n///\n/// If an existing element is found to be equal to `needle`, then the `index`\n/// out-parameter is set to the existing value's index, and the `exists`\n/// out-parameter is set to true. Otherwise, `index` is set to an index where\n/// `needle` should be inserted in order to preserve the sorting, and `exists`\n/// is set to false.\n#define array_search_sorted_with(self, compare, needle, _index, _exists) \\\n _array__search_sorted(self, 0, compare, , needle, _index, _exists)\n\n/// Search a sorted array for a given `needle` value, using integer comparisons\n/// of a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_with`.\n#define array_search_sorted_by(self, field, needle, _index, _exists) \\\n _array__search_sorted(self, 0, _compare_int, field, needle, _index, _exists)\n\n/// Insert a given `value` into a sorted array, using the given `compare`\n/// callback to determine the order.\n#define array_insert_sorted_with(self, compare, value) \\\n do { \\\n unsigned _index, _exists; \\\n array_search_sorted_with(self, compare, &(value), &_index, &_exists); \\\n if (!_exists) array_insert(self, _index, value); \\\n } while (0)\n\n/// Insert a given `value` into a sorted array, using integer comparisons of\n/// a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_by`.\n#define array_insert_sorted_by(self, field, value) \\\n do { \\\n unsigned _index, _exists; \\\n array_search_sorted_by(self, field, (value) field, &_index, &_exists); \\\n if (!_exists) array_insert(self, _index, value); \\\n } while (0)\n\n// Private\n\n// Pointers to individual `Array` fields (rather than the entire `Array` itself)\n// are passed to the various `_array__*` functions below to address strict aliasing\n// violations that arises when the _entire_ `Array` struct is passed as `Array(void)*`.\n//\n// The `Array` type itself was not altered as a solution in order to avoid breakage\n// with existing consumers (in particular, parsers with external scanners).\n\n/// This is not what you're looking for, see `array_erase`.\nstatic inline void _array__erase(void* self_contents, uint32_t *size,\n size_t element_size, uint32_t index) {\n ts_assert(index < *size);\n char *contents = (char *)self_contents;\n memmove(contents + index * element_size, contents + (index + 1) * element_size,\n (*size - index - 1) * element_size);\n (*size)--;\n}\n\n/// This is not what you're looking for, see `array_reserve`.\nstatic inline void *_array__reserve(void *contents, uint32_t *capacity,\n size_t element_size, uint32_t new_capacity) {\n void *new_contents = contents;\n if (new_capacity > *capacity) {\n if (contents) {\n new_contents = ts_realloc(contents, new_capacity * element_size);\n } else {\n new_contents = ts_malloc(new_capacity * element_size);\n }\n *capacity = new_capacity;\n }\n return new_contents;\n}\n\n/// This is not what you're looking for, see `array_assign`.\nstatic inline void *_array__assign(void* self_contents, uint32_t *self_size, uint32_t *self_capacity,\n const void *other_contents, uint32_t other_size, size_t element_size) {\n void *new_contents = _array__reserve(self_contents, self_capacity, element_size, other_size);\n *self_size = other_size;\n memcpy(new_contents, other_contents, *self_size * element_size);\n return new_contents;\n}\n\n/// This is not what you're looking for, see `array_swap`.\nstatic inline void _array__swap(uint32_t *self_size, uint32_t *self_capacity,\n uint32_t *other_size, uint32_t *other_capacity) {\n uint32_t tmp_size = *self_size;\n uint32_t tmp_capacity = *self_capacity;\n *self_size = *other_size;\n *self_capacity = *other_capacity;\n *other_size = tmp_size;\n *other_capacity = tmp_capacity;\n}\n\n/// This is not what you're looking for, see `array_push` or `array_grow_by`.\nstatic inline void *_array__grow(void *contents, uint32_t size, uint32_t *capacity,\n uint32_t count, size_t element_size) {\n void *new_contents = contents;\n uint32_t new_size = size + count;\n if (new_size > *capacity) {\n uint32_t new_capacity = *capacity * 2;\n if (new_capacity < 8) new_capacity = 8;\n if (new_capacity < new_size) new_capacity = new_size;\n new_contents = _array__reserve(contents, capacity, element_size, new_capacity);\n }\n return new_contents;\n}\n\n/// This is not what you're looking for, see `array_splice`.\nstatic inline void *_array__splice(void *self_contents, uint32_t *size, uint32_t *capacity,\n size_t element_size,\n uint32_t index, uint32_t old_count,\n uint32_t new_count, const void *elements) {\n uint32_t new_size = *size + new_count - old_count;\n uint32_t old_end = index + old_count;\n uint32_t new_end = index + new_count;\n ts_assert(old_end <= *size);\n\n void *new_contents = _array__reserve(self_contents, capacity, element_size, new_size);\n\n char *contents = (char *)new_contents;\n if (*size > old_end) {\n memmove(\n contents + new_end * element_size,\n contents + old_end * element_size,\n (*size - old_end) * element_size\n );\n }\n if (new_count > 0) {\n if (elements) {\n memcpy(\n (contents + index * element_size),\n elements,\n new_count * element_size\n );\n } else {\n memset(\n (contents + index * element_size),\n 0,\n new_count * element_size\n );\n }\n }\n *size += new_count - old_count;\n\n return new_contents;\n}\n\n/// A binary search routine, based on Rust's `std::slice::binary_search_by`.\n/// This is not what you're looking for, see `array_search_sorted_with` or `array_search_sorted_by`.\n#define _array__search_sorted(self, start, compare, suffix, needle, _index, _exists) \\\n do { \\\n *(_index) = start; \\\n *(_exists) = false; \\\n uint32_t size = (self)->size - *(_index); \\\n if (size == 0) break; \\\n int comparison; \\\n while (size > 1) { \\\n uint32_t half_size = size / 2; \\\n uint32_t mid_index = *(_index) + half_size; \\\n comparison = compare(&((self)->contents[mid_index] suffix), (needle)); \\\n if (comparison <= 0) *(_index) = mid_index; \\\n size -= half_size; \\\n } \\\n comparison = compare(&((self)->contents[*(_index)] suffix), (needle)); \\\n if (comparison == 0) *(_exists) = true; \\\n else if (comparison < 0) *(_index) += 1; \\\n } while (0)\n\n/// Helper macro for the `_sorted_by` routines below. This takes the left (existing)\n/// parameter by reference in order to work with the generic sorting function above.\n#define _compare_int(a, b) ((int)*(a) - (int)(b))\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic pop\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_ARRAY_H_\n",
32
- "#ifndef TREE_SITTER_POINT_H_\n#define TREE_SITTER_POINT_H_\n\n#include \"tree_sitter/api.h\"\n\n#define POINT_ZERO ((TSPoint) {0, 0})\n#define POINT_MAX ((TSPoint) {UINT32_MAX, UINT32_MAX})\n\nstatic inline TSPoint point__new(unsigned row, unsigned column) {\n TSPoint result = {row, column};\n return result;\n}\n\nstatic inline TSPoint point_add(TSPoint a, TSPoint b) {\n if (b.row > 0)\n return point__new(a.row + b.row, b.column);\n else\n return point__new(a.row, a.column + b.column);\n}\n\nstatic inline TSPoint point_sub(TSPoint a, TSPoint b) {\n if (a.row > b.row)\n return point__new(a.row - b.row, a.column);\n else\n return point__new(0, (a.column >= b.column) ? a.column - b.column : 0);\n}\n\nstatic inline bool point_lte(TSPoint a, TSPoint b) {\n return (a.row < b.row) || (a.row == b.row && a.column <= b.column);\n}\n\nstatic inline bool point_lt(TSPoint a, TSPoint b) {\n return (a.row < b.row) || (a.row == b.row && a.column < b.column);\n}\n\nstatic inline bool point_gt(TSPoint a, TSPoint b) {\n return (a.row > b.row) || (a.row == b.row && a.column > b.column);\n}\n\nstatic inline bool point_gte(TSPoint a, TSPoint b) {\n return (a.row > b.row) || (a.row == b.row && a.column >= b.column);\n}\n\nstatic inline bool point_eq(TSPoint a, TSPoint b) {\n return a.row == b.row && a.column == b.column;\n}\n\n#endif\n",
33
- "#ifndef TREE_SITTER_LENGTH_H_\n#define TREE_SITTER_LENGTH_H_\n\n#include <stdlib.h>\n#include <stdbool.h>\n#include \"./point.h\"\n#include \"tree_sitter/api.h\"\n\ntypedef struct {\n uint32_t bytes;\n TSPoint extent;\n} Length;\n\nstatic const Length LENGTH_UNDEFINED = {0, {0, 1}};\nstatic const Length LENGTH_MAX = {UINT32_MAX, {UINT32_MAX, UINT32_MAX}};\n\nstatic inline bool length_is_undefined(Length length) {\n return length.bytes == 0 && length.extent.column != 0;\n}\n\nstatic inline Length length_min(Length len1, Length len2) {\n return (len1.bytes < len2.bytes) ? len1 : len2;\n}\n\nstatic inline Length length_add(Length len1, Length len2) {\n Length result;\n result.bytes = len1.bytes + len2.bytes;\n result.extent = point_add(len1.extent, len2.extent);\n return result;\n}\n\nstatic inline Length length_sub(Length len1, Length len2) {\n Length result;\n result.bytes = (len1.bytes >= len2.bytes) ? len1.bytes - len2.bytes : 0;\n result.extent = point_sub(len1.extent, len2.extent);\n return result;\n}\n\nstatic inline Length length_zero(void) {\n Length result = {0, {0, 0}};\n return result;\n}\n\nstatic inline Length length_saturating_sub(Length len1, Length len2) {\n if (len1.bytes > len2.bytes) {\n return length_sub(len1, len2);\n } else {\n return length_zero();\n }\n}\n\n#endif\n",
34
- "#ifndef TREE_SITTER_SUBTREE_H_\n#define TREE_SITTER_SUBTREE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <limits.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include \"./length.h\"\n#include \"./array.h\"\n#include \"./error_costs.h\"\n#include \"./host.h\"\n#include \"tree_sitter/api.h\"\n#include \"./parser.h\"\n\n#define TS_TREE_STATE_NONE USHRT_MAX\n#define NULL_SUBTREE ((Subtree) {.ptr = NULL})\n\n// The serialized state of an external scanner.\n//\n// Every time an external token subtree is created after a call to an\n// external scanner, the scanner's `serialize` function is called to\n// retrieve a serialized copy of its state. The bytes are then copied\n// onto the subtree itself so that the scanner's state can later be\n// restored using its `deserialize` function.\n//\n// Small byte arrays are stored inline, and long ones are allocated\n// separately on the heap.\ntypedef struct {\n union {\n char *long_data;\n char short_data[24];\n };\n uint32_t length;\n} ExternalScannerState;\n\n// A compact representation of a subtree.\n//\n// This representation is used for small leaf nodes that are not\n// errors, and were not created by an external scanner.\n//\n// The idea behind the layout of this struct is that the `is_inline`\n// bit will fall exactly into the same location as the least significant\n// bit of the pointer in `Subtree` or `MutableSubtree`, respectively.\n// Because of alignment, for any valid pointer this will be 0, giving\n// us the opportunity to make use of this bit to signify whether to use\n// the pointer or the inline struct.\ntypedef struct SubtreeInlineData SubtreeInlineData;\n\n#define SUBTREE_BITS \\\n bool visible : 1; \\\n bool named : 1; \\\n bool extra : 1; \\\n bool has_changes : 1; \\\n bool is_missing : 1; \\\n bool is_keyword : 1;\n\n#define SUBTREE_SIZE \\\n uint8_t padding_columns; \\\n uint8_t padding_rows : 4; \\\n uint8_t lookahead_bytes : 4; \\\n uint8_t padding_bytes; \\\n uint8_t size_bytes;\n\n#if TS_BIG_ENDIAN\n#if TS_PTR_SIZE == 32\n\nstruct SubtreeInlineData {\n uint16_t parse_state;\n uint8_t symbol;\n SUBTREE_BITS\n bool unused : 1;\n bool is_inline : 1;\n SUBTREE_SIZE\n};\n\n#else\n\nstruct SubtreeInlineData {\n SUBTREE_SIZE\n uint16_t parse_state;\n uint8_t symbol;\n SUBTREE_BITS\n bool unused : 1;\n bool is_inline : 1;\n};\n\n#endif\n#else\n\nstruct SubtreeInlineData {\n bool is_inline : 1;\n SUBTREE_BITS\n uint8_t symbol;\n uint16_t parse_state;\n SUBTREE_SIZE\n};\n\n#endif\n\n#undef SUBTREE_BITS\n#undef SUBTREE_SIZE\n\n// A heap-allocated representation of a subtree.\n//\n// This representation is used for parent nodes, external tokens,\n// errors, and other leaf nodes whose data is too large to fit into\n// the inline representation.\ntypedef struct {\n volatile uint32_t ref_count;\n Length padding;\n Length size;\n uint32_t lookahead_bytes;\n uint32_t error_cost;\n uint32_t child_count;\n TSSymbol symbol;\n TSStateId parse_state;\n\n bool visible : 1;\n bool named : 1;\n bool extra : 1;\n bool fragile_left : 1;\n bool fragile_right : 1;\n bool has_changes : 1;\n bool has_external_tokens : 1;\n bool has_external_scanner_state_change : 1;\n bool depends_on_column: 1;\n bool is_missing : 1;\n bool is_keyword : 1;\n\n union {\n // Non-terminal subtrees (`child_count > 0`)\n struct {\n uint32_t visible_child_count;\n uint32_t named_child_count;\n uint32_t visible_descendant_count;\n int32_t dynamic_precedence;\n uint16_t repeat_depth;\n uint16_t production_id;\n struct {\n TSSymbol symbol;\n TSStateId parse_state;\n } first_leaf;\n };\n\n // External terminal subtrees (`child_count == 0 && has_external_tokens`)\n ExternalScannerState external_scanner_state;\n\n // Error terminal subtrees (`child_count == 0 && symbol == ts_builtin_sym_error`)\n int32_t lookahead_char;\n };\n} SubtreeHeapData;\n\n// The fundamental building block of a syntax tree.\ntypedef union {\n SubtreeInlineData data;\n const SubtreeHeapData *ptr;\n} Subtree;\n\n// Like Subtree, but mutable.\ntypedef union {\n SubtreeInlineData data;\n SubtreeHeapData *ptr;\n} MutableSubtree;\n\ntypedef Array(Subtree) SubtreeArray;\ntypedef Array(MutableSubtree) MutableSubtreeArray;\n\ntypedef struct {\n MutableSubtreeArray free_trees;\n MutableSubtreeArray tree_stack;\n} SubtreePool;\n\nvoid ts_external_scanner_state_init(ExternalScannerState *self, const char *data, unsigned length);\nconst char *ts_external_scanner_state_data(const ExternalScannerState *self);\nbool ts_external_scanner_state_eq(const ExternalScannerState *self, const char *buffer, unsigned length);\nvoid ts_external_scanner_state_delete(ExternalScannerState *self);\n\nvoid ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest);\nvoid ts_subtree_array_clear(SubtreePool *pool, SubtreeArray *self);\nvoid ts_subtree_array_delete(SubtreePool *pool, SubtreeArray *self);\nvoid ts_subtree_array_remove_trailing_extras(SubtreeArray *self, SubtreeArray *destination);\nvoid ts_subtree_array_reverse(SubtreeArray *self);\n\nSubtreePool ts_subtree_pool_new(uint32_t capacity);\nvoid ts_subtree_pool_delete(SubtreePool *self);\n\nSubtree ts_subtree_new_leaf(\n SubtreePool *pool, TSSymbol symbol, Length padding, Length size,\n uint32_t lookahead_bytes, TSStateId parse_state,\n bool has_external_tokens, bool depends_on_column,\n bool is_keyword, const TSLanguage *language\n);\nSubtree ts_subtree_new_error(\n SubtreePool *pool, int32_t lookahead_char, Length padding, Length size,\n uint32_t bytes_scanned, TSStateId parse_state, const TSLanguage *language\n);\nMutableSubtree ts_subtree_new_node(\n TSSymbol symbol,\n SubtreeArray *chiildren,\n unsigned production_id,\n const TSLanguage *language\n);\nSubtree ts_subtree_new_error_node(\n SubtreeArray *children,\n bool extra,\n const TSLanguage * language\n);\nSubtree ts_subtree_new_missing_leaf(\n SubtreePool *pool,\n TSSymbol symbol,\n Length padding,\n uint32_t lookahead_bytes,\n const TSLanguage *language\n);\nMutableSubtree ts_subtree_make_mut(SubtreePool *pool, Subtree self);\nvoid ts_subtree_retain(Subtree self);\nvoid ts_subtree_release(SubtreePool *pool, Subtree self);\nint ts_subtree_compare(Subtree left, Subtree right, SubtreePool *pool);\nvoid ts_subtree_set_symbol(MutableSubtree *self, TSSymbol symbol, const TSLanguage *language);\nvoid ts_subtree_compress(MutableSubtree self, unsigned count, const TSLanguage *language, MutableSubtreeArray *stack);\nvoid ts_subtree_summarize_children(MutableSubtree self, const TSLanguage *language);\nSubtree ts_subtree_edit(Subtree self, const TSInputEdit *edit, SubtreePool *pool);\nchar *ts_subtree_string(Subtree self, TSSymbol alias_symbol, bool alias_is_named, const TSLanguage *language, bool include_all);\nvoid ts_subtree_print_dot_graph(Subtree self, const TSLanguage *language, FILE *f);\nSubtree ts_subtree_last_external_token(Subtree tree);\nconst ExternalScannerState *ts_subtree_external_scanner_state(Subtree self);\nbool ts_subtree_external_scanner_state_eq(Subtree self, Subtree other);\n\n#define SUBTREE_GET(self, name) ((self).data.is_inline ? (self).data.name : (self).ptr->name)\n\nstatic inline TSSymbol ts_subtree_symbol(Subtree self) { return SUBTREE_GET(self, symbol); }\nstatic inline bool ts_subtree_visible(Subtree self) { return SUBTREE_GET(self, visible); }\nstatic inline bool ts_subtree_named(Subtree self) { return SUBTREE_GET(self, named); }\nstatic inline bool ts_subtree_extra(Subtree self) { return SUBTREE_GET(self, extra); }\nstatic inline bool ts_subtree_has_changes(Subtree self) { return SUBTREE_GET(self, has_changes); }\nstatic inline bool ts_subtree_missing(Subtree self) { return SUBTREE_GET(self, is_missing); }\nstatic inline bool ts_subtree_is_keyword(Subtree self) { return SUBTREE_GET(self, is_keyword); }\nstatic inline TSStateId ts_subtree_parse_state(Subtree self) { return SUBTREE_GET(self, parse_state); }\nstatic inline uint32_t ts_subtree_lookahead_bytes(Subtree self) { return SUBTREE_GET(self, lookahead_bytes); }\n\n#undef SUBTREE_GET\n\n// Get the size needed to store a heap-allocated subtree with the given\n// number of children.\nstatic inline size_t ts_subtree_alloc_size(uint32_t child_count) {\n return child_count * sizeof(Subtree) + sizeof(SubtreeHeapData);\n}\n\n// Get a subtree's children, which are allocated immediately before the\n// tree's own heap data.\n#define ts_subtree_children(self) \\\n ((self).data.is_inline ? (Subtree *)NULL : (Subtree *)((self).ptr) - (self).ptr->child_count)\n\nstatic inline void ts_subtree_set_extra(MutableSubtree *self, bool is_extra) {\n if (self->data.is_inline) {\n self->data.extra = is_extra;\n } else {\n self->ptr->extra = is_extra;\n }\n}\n\nstatic inline TSSymbol ts_subtree_leaf_symbol(Subtree self) {\n if (self.data.is_inline) return self.data.symbol;\n if (self.ptr->child_count == 0) return self.ptr->symbol;\n return self.ptr->first_leaf.symbol;\n}\n\nstatic inline TSStateId ts_subtree_leaf_parse_state(Subtree self) {\n if (self.data.is_inline) return self.data.parse_state;\n if (self.ptr->child_count == 0) return self.ptr->parse_state;\n return self.ptr->first_leaf.parse_state;\n}\n\nstatic inline Length ts_subtree_padding(Subtree self) {\n if (self.data.is_inline) {\n Length result = {self.data.padding_bytes, {self.data.padding_rows, self.data.padding_columns}};\n return result;\n } else {\n return self.ptr->padding;\n }\n}\n\nstatic inline Length ts_subtree_size(Subtree self) {\n if (self.data.is_inline) {\n Length result = {self.data.size_bytes, {0, self.data.size_bytes}};\n return result;\n } else {\n return self.ptr->size;\n }\n}\n\nstatic inline Length ts_subtree_total_size(Subtree self) {\n return length_add(ts_subtree_padding(self), ts_subtree_size(self));\n}\n\nstatic inline uint32_t ts_subtree_total_bytes(Subtree self) {\n return ts_subtree_total_size(self).bytes;\n}\n\nstatic inline uint32_t ts_subtree_child_count(Subtree self) {\n return self.data.is_inline ? 0 : self.ptr->child_count;\n}\n\nstatic inline uint32_t ts_subtree_repeat_depth(Subtree self) {\n return self.data.is_inline ? 0 : self.ptr->repeat_depth;\n}\n\nstatic inline uint32_t ts_subtree_is_repetition(Subtree self) {\n return self.data.is_inline\n ? 0\n : !self.ptr->named && !self.ptr->visible && self.ptr->child_count != 0;\n}\n\nstatic inline uint32_t ts_subtree_visible_descendant_count(Subtree self) {\n return (self.data.is_inline || self.ptr->child_count == 0)\n ? 0\n : self.ptr->visible_descendant_count;\n}\n\nstatic inline uint32_t ts_subtree_visible_child_count(Subtree self) {\n if (ts_subtree_child_count(self) > 0) {\n return self.ptr->visible_child_count;\n } else {\n return 0;\n }\n}\n\nstatic inline uint32_t ts_subtree_error_cost(Subtree self) {\n if (ts_subtree_missing(self)) {\n return ERROR_COST_PER_MISSING_TREE + ERROR_COST_PER_RECOVERY;\n } else {\n return self.data.is_inline ? 0 : self.ptr->error_cost;\n }\n}\n\nstatic inline int32_t ts_subtree_dynamic_precedence(Subtree self) {\n return (self.data.is_inline || self.ptr->child_count == 0) ? 0 : self.ptr->dynamic_precedence;\n}\n\nstatic inline uint16_t ts_subtree_production_id(Subtree self) {\n if (ts_subtree_child_count(self) > 0) {\n return self.ptr->production_id;\n } else {\n return 0;\n }\n}\n\nstatic inline bool ts_subtree_fragile_left(Subtree self) {\n return self.data.is_inline ? false : self.ptr->fragile_left;\n}\n\nstatic inline bool ts_subtree_fragile_right(Subtree self) {\n return self.data.is_inline ? false : self.ptr->fragile_right;\n}\n\nstatic inline bool ts_subtree_has_external_tokens(Subtree self) {\n return self.data.is_inline ? false : self.ptr->has_external_tokens;\n}\n\nstatic inline bool ts_subtree_has_external_scanner_state_change(Subtree self) {\n return self.data.is_inline ? false : self.ptr->has_external_scanner_state_change;\n}\n\nstatic inline bool ts_subtree_depends_on_column(Subtree self) {\n return self.data.is_inline ? false : self.ptr->depends_on_column;\n}\n\nstatic inline bool ts_subtree_is_fragile(Subtree self) {\n return self.data.is_inline ? false : (self.ptr->fragile_left || self.ptr->fragile_right);\n}\n\nstatic inline bool ts_subtree_is_error(Subtree self) {\n return ts_subtree_symbol(self) == ts_builtin_sym_error;\n}\n\nstatic inline bool ts_subtree_is_eof(Subtree self) {\n return ts_subtree_symbol(self) == ts_builtin_sym_end;\n}\n\nstatic inline Subtree ts_subtree_from_mut(MutableSubtree self) {\n Subtree result;\n result.data = self.data;\n return result;\n}\n\nstatic inline MutableSubtree ts_subtree_to_mut_unsafe(Subtree self) {\n MutableSubtree result;\n result.data = self.data;\n return result;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_SUBTREE_H_\n",
35
- "#ifndef TREE_SITTER_LANGUAGE_H_\n#define TREE_SITTER_LANGUAGE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"./subtree.h\"\n#include \"./parser.h\"\n\n#define ts_builtin_sym_error_repeat (ts_builtin_sym_error - 1)\n\n#define LANGUAGE_VERSION_WITH_RESERVED_WORDS 15\n#define LANGUAGE_VERSION_WITH_PRIMARY_STATES 14\n\ntypedef struct {\n const TSParseAction *actions;\n uint32_t action_count;\n bool is_reusable;\n} TableEntry;\n\ntypedef struct {\n const TSLanguage *language;\n const uint16_t *data;\n const uint16_t *group_end;\n TSStateId state;\n uint16_t table_value;\n uint16_t section_index;\n uint16_t group_count;\n bool is_small_state;\n\n const TSParseAction *actions;\n TSSymbol symbol;\n TSStateId next_state;\n uint16_t action_count;\n} LookaheadIterator;\n\nvoid ts_language_table_entry(const TSLanguage *self, TSStateId state, TSSymbol symbol, TableEntry *result);\nTSLexerMode ts_language_lex_mode_for_state(const TSLanguage *self, TSStateId state);\nbool ts_language_is_reserved_word(const TSLanguage *self, TSStateId state, TSSymbol symbol);\nTSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *self, TSSymbol symbol);\nTSSymbol ts_language_public_symbol(const TSLanguage *self, TSSymbol symbol);\n\nstatic inline const TSParseAction *ts_language_actions(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol,\n uint32_t *count\n) {\n TableEntry entry;\n ts_language_table_entry(self, state, symbol, &entry);\n *count = entry.action_count;\n return entry.actions;\n}\n\nstatic inline bool ts_language_has_reduce_action(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol\n) {\n TableEntry entry;\n ts_language_table_entry(self, state, symbol, &entry);\n return entry.action_count > 0 && entry.actions[0].type == TSParseActionTypeReduce;\n}\n\n// Lookup the table value for a given symbol and state.\n//\n// For non-terminal symbols, the table value represents a successor state.\n// For terminal symbols, it represents an index in the actions table.\n// For 'large' parse states, this is a direct lookup. For 'small' parse\n// states, this requires searching through the symbol groups to find\n// the given symbol.\nstatic inline uint16_t ts_language_lookup(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol\n) {\n if (state >= self->large_state_count) {\n uint32_t index = self->small_parse_table_map[state - self->large_state_count];\n const uint16_t *data = &self->small_parse_table[index];\n uint16_t group_count = *(data++);\n for (unsigned i = 0; i < group_count; i++) {\n uint16_t section_value = *(data++);\n uint16_t symbol_count = *(data++);\n for (unsigned j = 0; j < symbol_count; j++) {\n if (*(data++) == symbol) return section_value;\n }\n }\n return 0;\n } else {\n return self->parse_table[state * self->symbol_count + symbol];\n }\n}\n\nstatic inline bool ts_language_has_actions(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol\n) {\n return ts_language_lookup(self, state, symbol) != 0;\n}\n\n// Iterate over all of the symbols that are valid in the given state.\n//\n// For 'large' parse states, this just requires iterating through\n// all possible symbols and checking the parse table for each one.\n// For 'small' parse states, this exploits the structure of the\n// table to only visit the valid symbols.\nstatic inline LookaheadIterator ts_language_lookaheads(\n const TSLanguage *self,\n TSStateId state\n) {\n bool is_small_state = state >= self->large_state_count;\n const uint16_t *data;\n const uint16_t *group_end = NULL;\n uint16_t group_count = 0;\n if (is_small_state) {\n uint32_t index = self->small_parse_table_map[state - self->large_state_count];\n data = &self->small_parse_table[index];\n group_end = data + 1;\n group_count = *data;\n } else {\n data = &self->parse_table[state * self->symbol_count] - 1;\n }\n return (LookaheadIterator) {\n .language = self,\n .data = data,\n .group_end = group_end,\n .group_count = group_count,\n .is_small_state = is_small_state,\n .symbol = UINT16_MAX,\n .next_state = 0,\n };\n}\n\nstatic inline bool ts_lookahead_iterator__next(LookaheadIterator *self) {\n // For small parse states, valid symbols are listed explicitly,\n // grouped by their value. There's no need to look up the actions\n // again until moving to the next group.\n if (self->is_small_state) {\n self->data++;\n if (self->data == self->group_end) {\n if (self->group_count == 0) return false;\n self->group_count--;\n self->table_value = *(self->data++);\n unsigned symbol_count = *(self->data++);\n self->group_end = self->data + symbol_count;\n self->symbol = *self->data;\n } else {\n self->symbol = *self->data;\n return true;\n }\n }\n\n // For large parse states, iterate through every symbol until one\n // is found that has valid actions.\n else {\n do {\n self->data++;\n self->symbol++;\n if (self->symbol >= self->language->symbol_count) return false;\n self->table_value = *self->data;\n } while (!self->table_value);\n }\n\n // Depending on if the symbols is terminal or non-terminal, the table value either\n // represents a list of actions or a successor state.\n if (self->symbol < self->language->token_count) {\n const TSParseActionEntry *entry = &self->language->parse_actions[self->table_value];\n self->action_count = entry->entry.count;\n self->actions = (const TSParseAction *)(entry + 1);\n self->next_state = 0;\n } else {\n self->action_count = 0;\n self->next_state = self->table_value;\n }\n return true;\n}\n\n// Whether the state is a \"primary state\". If this returns false, it indicates that there exists\n// another state that behaves identically to this one with respect to query analysis.\nstatic inline bool ts_language_state_is_primary(\n const TSLanguage *self,\n TSStateId state\n) {\n if (self->abi_version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) {\n return state == self->primary_state_ids[state];\n } else {\n return true;\n }\n}\n\nstatic inline const bool *ts_language_enabled_external_tokens(\n const TSLanguage *self,\n unsigned external_scanner_state\n) {\n if (external_scanner_state == 0) {\n return NULL;\n } else {\n return self->external_scanner.states + self->external_token_count * external_scanner_state;\n }\n}\n\nstatic inline const TSSymbol *ts_language_alias_sequence(\n const TSLanguage *self,\n uint32_t production_id\n) {\n return production_id ?\n &self->alias_sequences[production_id * self->max_alias_sequence_length] :\n NULL;\n}\n\nstatic inline TSSymbol ts_language_alias_at(\n const TSLanguage *self,\n uint32_t production_id,\n uint32_t child_index\n) {\n return production_id ?\n self->alias_sequences[production_id * self->max_alias_sequence_length + child_index] :\n 0;\n}\n\nstatic inline void ts_language_field_map(\n const TSLanguage *self,\n uint32_t production_id,\n const TSFieldMapEntry **start,\n const TSFieldMapEntry **end\n) {\n if (self->field_count == 0) {\n *start = NULL;\n *end = NULL;\n return;\n }\n\n TSMapSlice slice = self->field_map_slices[production_id];\n *start = &self->field_map_entries[slice.index];\n *end = &self->field_map_entries[slice.index] + slice.length;\n}\n\nstatic inline void ts_language_aliases_for_symbol(\n const TSLanguage *self,\n TSSymbol original_symbol,\n const TSSymbol **start,\n const TSSymbol **end\n) {\n *start = &self->public_symbol_map[original_symbol];\n *end = *start + 1;\n\n unsigned idx = 0;\n for (;;) {\n TSSymbol symbol = self->alias_map[idx++];\n if (symbol == 0 || symbol > original_symbol) break;\n uint16_t count = self->alias_map[idx++];\n if (symbol == original_symbol) {\n *start = &self->alias_map[idx];\n *end = &self->alias_map[idx + count];\n break;\n }\n idx += count;\n }\n}\n\nstatic inline void ts_language_write_symbol_as_dot_string(\n const TSLanguage *self,\n FILE *f,\n TSSymbol symbol\n) {\n const char *name = ts_language_symbol_name(self, symbol);\n for (const char *chr = name; *chr; chr++) {\n switch (*chr) {\n case '\"':\n case '\\\\':\n fputc('\\\\', f);\n fputc(*chr, f);\n break;\n case '\\n':\n fputs(\"\\\\n\", f);\n break;\n case '\\t':\n fputs(\"\\\\t\", f);\n break;\n default:\n fputc(*chr, f);\n break;\n }\n }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_LANGUAGE_H_\n",
36
- "#include <ctype.h>\n#include <stdint.h>\n#include <stdbool.h>\n#include <string.h>\n#include <stdio.h>\n#include \"./alloc.h\"\n#include \"./array.h\"\n#include \"./atomic.h\"\n#include \"./subtree.h\"\n#include \"./length.h\"\n#include \"./language.h\"\n#include \"./error_costs.h\"\n#include \"./ts_assert.h\"\n#include <stddef.h>\n\ntypedef struct {\n Length start;\n Length old_end;\n Length new_end;\n} Edit;\n\n#define TS_MAX_INLINE_TREE_LENGTH UINT8_MAX\n#define TS_MAX_TREE_POOL_SIZE 32\n\n// ExternalScannerState\n\nvoid ts_external_scanner_state_init(ExternalScannerState *self, const char *data, unsigned length) {\n self->length = length;\n if (length > sizeof(self->short_data)) {\n self->long_data = ts_malloc(length);\n memcpy(self->long_data, data, length);\n } else {\n memcpy(self->short_data, data, length);\n }\n}\n\nExternalScannerState ts_external_scanner_state_copy(const ExternalScannerState *self) {\n ExternalScannerState result = *self;\n if (self->length > sizeof(self->short_data)) {\n result.long_data = ts_malloc(self->length);\n memcpy(result.long_data, self->long_data, self->length);\n }\n return result;\n}\n\nvoid ts_external_scanner_state_delete(ExternalScannerState *self) {\n if (self->length > sizeof(self->short_data)) {\n ts_free(self->long_data);\n }\n}\n\nconst char *ts_external_scanner_state_data(const ExternalScannerState *self) {\n if (self->length > sizeof(self->short_data)) {\n return self->long_data;\n } else {\n return self->short_data;\n }\n}\n\nbool ts_external_scanner_state_eq(const ExternalScannerState *self, const char *buffer, unsigned length) {\n return\n self->length == length &&\n memcmp(ts_external_scanner_state_data(self), buffer, length) == 0;\n}\n\n// SubtreeArray\n\nvoid ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest) {\n dest->size = self.size;\n dest->capacity = self.capacity;\n dest->contents = self.contents;\n if (self.capacity > 0) {\n dest->contents = ts_calloc(self.capacity, sizeof(Subtree));\n memcpy(dest->contents, self.contents, self.size * sizeof(Subtree));\n for (uint32_t i = 0; i < self.size; i++) {\n ts_subtree_retain(*array_get(dest, i));\n }\n }\n}\n\nvoid ts_subtree_array_clear(SubtreePool *pool, SubtreeArray *self) {\n for (uint32_t i = 0; i < self->size; i++) {\n ts_subtree_release(pool, *array_get(self, i));\n }\n array_clear(self);\n}\n\nvoid ts_subtree_array_delete(SubtreePool *pool, SubtreeArray *self) {\n ts_subtree_array_clear(pool, self);\n array_delete(self);\n}\n\nvoid ts_subtree_array_remove_trailing_extras(\n SubtreeArray *self,\n SubtreeArray *destination\n) {\n array_clear(destination);\n while (self->size > 0) {\n Subtree last = *array_get(self, self->size - 1);\n if (ts_subtree_extra(last)) {\n self->size--;\n array_push(destination, last);\n } else {\n break;\n }\n }\n ts_subtree_array_reverse(destination);\n}\n\nvoid ts_subtree_array_reverse(SubtreeArray *self) {\n for (uint32_t i = 0, limit = self->size / 2; i < limit; i++) {\n size_t reverse_index = self->size - 1 - i;\n Subtree swap = *array_get(self, i);\n *array_get(self, i) = *array_get(self, reverse_index);\n *array_get(self, reverse_index) = swap;\n }\n}\n\n// SubtreePool\n\nSubtreePool ts_subtree_pool_new(uint32_t capacity) {\n SubtreePool self = {array_new(), array_new()};\n array_reserve(&self.free_trees, capacity);\n return self;\n}\n\nvoid ts_subtree_pool_delete(SubtreePool *self) {\n if (self->free_trees.contents) {\n for (unsigned i = 0; i < self->free_trees.size; i++) {\n ts_free(array_get(&self->free_trees, i)->ptr);\n }\n array_delete(&self->free_trees);\n }\n if (self->tree_stack.contents) array_delete(&self->tree_stack);\n}\n\nstatic SubtreeHeapData *ts_subtree_pool_allocate(SubtreePool *self) {\n if (self->free_trees.size > 0) {\n return array_pop(&self->free_trees).ptr;\n } else {\n return ts_malloc(sizeof(SubtreeHeapData));\n }\n}\n\nstatic void ts_subtree_pool_free(SubtreePool *self, SubtreeHeapData *tree) {\n if (self->free_trees.capacity > 0 && self->free_trees.size + 1 <= TS_MAX_TREE_POOL_SIZE) {\n array_push(&self->free_trees, (MutableSubtree) {.ptr = tree});\n } else {\n ts_free(tree);\n }\n}\n\n// Subtree\n\nstatic inline bool ts_subtree_can_inline(Length padding, Length size, uint32_t lookahead_bytes) {\n return\n padding.bytes < TS_MAX_INLINE_TREE_LENGTH &&\n padding.extent.row < 16 &&\n padding.extent.column < TS_MAX_INLINE_TREE_LENGTH &&\n size.bytes < TS_MAX_INLINE_TREE_LENGTH &&\n size.extent.row == 0 &&\n size.extent.column < TS_MAX_INLINE_TREE_LENGTH &&\n lookahead_bytes < 16;\n}\n\nSubtree ts_subtree_new_leaf(\n SubtreePool *pool, TSSymbol symbol, Length padding, Length size,\n uint32_t lookahead_bytes, TSStateId parse_state,\n bool has_external_tokens, bool depends_on_column,\n bool is_keyword, const TSLanguage *language\n) {\n TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);\n bool extra = symbol == ts_builtin_sym_end;\n\n bool is_inline = (\n symbol <= UINT8_MAX &&\n !has_external_tokens &&\n ts_subtree_can_inline(padding, size, lookahead_bytes)\n );\n\n if (is_inline) {\n return (Subtree) {{\n .parse_state = parse_state,\n .symbol = symbol,\n .padding_bytes = padding.bytes,\n .padding_rows = padding.extent.row,\n .padding_columns = padding.extent.column,\n .size_bytes = size.bytes,\n .lookahead_bytes = lookahead_bytes,\n .visible = metadata.visible,\n .named = metadata.named,\n .extra = extra,\n .has_changes = false,\n .is_missing = false,\n .is_keyword = is_keyword,\n .is_inline = true,\n }};\n } else {\n SubtreeHeapData *data = ts_subtree_pool_allocate(pool);\n *data = (SubtreeHeapData) {\n .ref_count = 1,\n .padding = padding,\n .size = size,\n .lookahead_bytes = lookahead_bytes,\n .error_cost = 0,\n .child_count = 0,\n .symbol = symbol,\n .parse_state = parse_state,\n .visible = metadata.visible,\n .named = metadata.named,\n .extra = extra,\n .fragile_left = false,\n .fragile_right = false,\n .has_changes = false,\n .has_external_tokens = has_external_tokens,\n .has_external_scanner_state_change = false,\n .depends_on_column = depends_on_column,\n .is_missing = false,\n .is_keyword = is_keyword,\n {{.first_leaf = {.symbol = 0, .parse_state = 0}}}\n };\n return (Subtree) {.ptr = data};\n }\n}\n\nvoid ts_subtree_set_symbol(\n MutableSubtree *self,\n TSSymbol symbol,\n const TSLanguage *language\n) {\n TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);\n if (self->data.is_inline) {\n ts_assert(symbol < UINT8_MAX);\n self->data.symbol = symbol;\n self->data.named = metadata.named;\n self->data.visible = metadata.visible;\n } else {\n self->ptr->symbol = symbol;\n self->ptr->named = metadata.named;\n self->ptr->visible = metadata.visible;\n }\n}\n\nSubtree ts_subtree_new_error(\n SubtreePool *pool, int32_t lookahead_char, Length padding, Length size,\n uint32_t bytes_scanned, TSStateId parse_state, const TSLanguage *language\n) {\n Subtree result = ts_subtree_new_leaf(\n pool, ts_builtin_sym_error, padding, size, bytes_scanned,\n parse_state, false, false, false, language\n );\n SubtreeHeapData *data = (SubtreeHeapData *)result.ptr;\n data->fragile_left = true;\n data->fragile_right = true;\n data->lookahead_char = lookahead_char;\n return result;\n}\n\n// Clone a subtree.\nMutableSubtree ts_subtree_clone(Subtree self) {\n size_t alloc_size = ts_subtree_alloc_size(self.ptr->child_count);\n Subtree *new_children = ts_malloc(alloc_size);\n Subtree *old_children = ts_subtree_children(self);\n memcpy(new_children, old_children, alloc_size);\n SubtreeHeapData *result = (SubtreeHeapData *)&new_children[self.ptr->child_count];\n if (self.ptr->child_count > 0) {\n for (uint32_t i = 0; i < self.ptr->child_count; i++) {\n ts_subtree_retain(new_children[i]);\n }\n } else if (self.ptr->has_external_tokens) {\n result->external_scanner_state = ts_external_scanner_state_copy(\n &self.ptr->external_scanner_state\n );\n }\n result->ref_count = 1;\n return (MutableSubtree) {.ptr = result};\n}\n\n// Get mutable version of a subtree.\n//\n// This takes ownership of the subtree. If the subtree has only one owner,\n// this will directly convert it into a mutable version. Otherwise, it will\n// perform a copy.\nMutableSubtree ts_subtree_make_mut(SubtreePool *pool, Subtree self) {\n if (self.data.is_inline) return (MutableSubtree) {self.data};\n if (self.ptr->ref_count == 1) return ts_subtree_to_mut_unsafe(self);\n MutableSubtree result = ts_subtree_clone(self);\n ts_subtree_release(pool, self);\n return result;\n}\n\nvoid ts_subtree_compress(\n MutableSubtree self,\n unsigned count,\n const TSLanguage *language,\n MutableSubtreeArray *stack\n) {\n unsigned initial_stack_size = stack->size;\n\n MutableSubtree tree = self;\n TSSymbol symbol = tree.ptr->symbol;\n for (unsigned i = 0; i < count; i++) {\n if (tree.ptr->ref_count > 1 || tree.ptr->child_count < 2) break;\n\n MutableSubtree child = ts_subtree_to_mut_unsafe(ts_subtree_children(tree)[0]);\n if (\n child.data.is_inline ||\n child.ptr->child_count < 2 ||\n child.ptr->ref_count > 1 ||\n child.ptr->symbol != symbol\n ) break;\n\n MutableSubtree grandchild = ts_subtree_to_mut_unsafe(ts_subtree_children(child)[0]);\n if (\n grandchild.data.is_inline ||\n grandchild.ptr->child_count < 2 ||\n grandchild.ptr->ref_count > 1 ||\n grandchild.ptr->symbol != symbol\n ) break;\n\n ts_subtree_children(tree)[0] = ts_subtree_from_mut(grandchild);\n ts_subtree_children(child)[0] = ts_subtree_children(grandchild)[grandchild.ptr->child_count - 1];\n ts_subtree_children(grandchild)[grandchild.ptr->child_count - 1] = ts_subtree_from_mut(child);\n array_push(stack, tree);\n tree = grandchild;\n }\n\n while (stack->size > initial_stack_size) {\n tree = array_pop(stack);\n MutableSubtree child = ts_subtree_to_mut_unsafe(ts_subtree_children(tree)[0]);\n MutableSubtree grandchild = ts_subtree_to_mut_unsafe(ts_subtree_children(child)[child.ptr->child_count - 1]);\n ts_subtree_summarize_children(grandchild, language);\n ts_subtree_summarize_children(child, language);\n ts_subtree_summarize_children(tree, language);\n }\n}\n\n// Assign all of the node's properties that depend on its children.\nvoid ts_subtree_summarize_children(\n MutableSubtree self,\n const TSLanguage *language\n) {\n ts_assert(!self.data.is_inline);\n\n self.ptr->named_child_count = 0;\n self.ptr->visible_child_count = 0;\n self.ptr->error_cost = 0;\n self.ptr->repeat_depth = 0;\n self.ptr->visible_descendant_count = 0;\n self.ptr->has_external_tokens = false;\n self.ptr->depends_on_column = false;\n self.ptr->has_external_scanner_state_change = false;\n self.ptr->dynamic_precedence = 0;\n\n uint32_t structural_index = 0;\n const TSSymbol *alias_sequence = ts_language_alias_sequence(language, self.ptr->production_id);\n uint32_t lookahead_end_byte = 0;\n\n const Subtree *children = ts_subtree_children(self);\n for (uint32_t i = 0; i < self.ptr->child_count; i++) {\n Subtree child = children[i];\n\n if (\n self.ptr->size.extent.row == 0 &&\n ts_subtree_depends_on_column(child)\n ) {\n self.ptr->depends_on_column = true;\n }\n\n if (ts_subtree_has_external_scanner_state_change(child)) {\n self.ptr->has_external_scanner_state_change = true;\n }\n\n if (i == 0) {\n self.ptr->padding = ts_subtree_padding(child);\n self.ptr->size = ts_subtree_size(child);\n } else {\n self.ptr->size = length_add(self.ptr->size, ts_subtree_total_size(child));\n }\n\n uint32_t child_lookahead_end_byte =\n self.ptr->padding.bytes +\n self.ptr->size.bytes +\n ts_subtree_lookahead_bytes(child);\n if (child_lookahead_end_byte > lookahead_end_byte) {\n lookahead_end_byte = child_lookahead_end_byte;\n }\n\n if (ts_subtree_symbol(child) != ts_builtin_sym_error_repeat) {\n self.ptr->error_cost += ts_subtree_error_cost(child);\n }\n\n uint32_t grandchild_count = ts_subtree_child_count(child);\n if (\n self.ptr->symbol == ts_builtin_sym_error ||\n self.ptr->symbol == ts_builtin_sym_error_repeat\n ) {\n if (!ts_subtree_extra(child) && !(ts_subtree_is_error(child) && grandchild_count == 0)) {\n if (ts_subtree_visible(child)) {\n self.ptr->error_cost += ERROR_COST_PER_SKIPPED_TREE;\n } else if (grandchild_count > 0) {\n self.ptr->error_cost += ERROR_COST_PER_SKIPPED_TREE * child.ptr->visible_child_count;\n }\n }\n }\n\n self.ptr->dynamic_precedence += ts_subtree_dynamic_precedence(child);\n self.ptr->visible_descendant_count += ts_subtree_visible_descendant_count(child);\n\n if (\n !ts_subtree_extra(child) &&\n ts_subtree_symbol(child) != 0 &&\n alias_sequence &&\n alias_sequence[structural_index] != 0\n ) {\n self.ptr->visible_descendant_count++;\n self.ptr->visible_child_count++;\n if (ts_language_symbol_metadata(language, alias_sequence[structural_index]).named) {\n self.ptr->named_child_count++;\n }\n } else if (ts_subtree_visible(child)) {\n self.ptr->visible_descendant_count++;\n self.ptr->visible_child_count++;\n if (ts_subtree_named(child)) self.ptr->named_child_count++;\n } else if (grandchild_count > 0) {\n self.ptr->visible_child_count += child.ptr->visible_child_count;\n self.ptr->named_child_count += child.ptr->named_child_count;\n }\n\n if (ts_subtree_has_external_tokens(child)) self.ptr->has_external_tokens = true;\n\n if (ts_subtree_is_error(child)) {\n self.ptr->fragile_left = self.ptr->fragile_right = true;\n self.ptr->parse_state = TS_TREE_STATE_NONE;\n }\n\n if (!ts_subtree_extra(child)) structural_index++;\n }\n\n self.ptr->lookahead_bytes = lookahead_end_byte - self.ptr->size.bytes - self.ptr->padding.bytes;\n\n if (\n self.ptr->symbol == ts_builtin_sym_error ||\n self.ptr->symbol == ts_builtin_sym_error_repeat\n ) {\n self.ptr->error_cost +=\n ERROR_COST_PER_RECOVERY +\n ERROR_COST_PER_SKIPPED_CHAR * self.ptr->size.bytes +\n ERROR_COST_PER_SKIPPED_LINE * self.ptr->size.extent.row;\n }\n\n if (self.ptr->child_count > 0) {\n Subtree first_child = children[0];\n Subtree last_child = children[self.ptr->child_count - 1];\n\n self.ptr->first_leaf.symbol = ts_subtree_leaf_symbol(first_child);\n self.ptr->first_leaf.parse_state = ts_subtree_leaf_parse_state(first_child);\n\n if (ts_subtree_fragile_left(first_child)) self.ptr->fragile_left = true;\n if (ts_subtree_fragile_right(last_child)) self.ptr->fragile_right = true;\n\n if (\n self.ptr->child_count >= 2 &&\n !self.ptr->visible &&\n !self.ptr->named &&\n ts_subtree_symbol(first_child) == self.ptr->symbol\n ) {\n if (ts_subtree_repeat_depth(first_child) > ts_subtree_repeat_depth(last_child)) {\n self.ptr->repeat_depth = ts_subtree_repeat_depth(first_child) + 1;\n } else {\n self.ptr->repeat_depth = ts_subtree_repeat_depth(last_child) + 1;\n }\n }\n }\n}\n\n// Create a new parent node with the given children.\n//\n// This takes ownership of the children array.\nMutableSubtree ts_subtree_new_node(\n TSSymbol symbol,\n SubtreeArray *children,\n unsigned production_id,\n const TSLanguage *language\n) {\n TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);\n bool fragile = symbol == ts_builtin_sym_error || symbol == ts_builtin_sym_error_repeat;\n\n // Allocate the node's data at the end of the array of children.\n size_t new_byte_size = ts_subtree_alloc_size(children->size);\n if (children->capacity * sizeof(Subtree) < new_byte_size) {\n children->contents = ts_realloc(children->contents, new_byte_size);\n children->capacity = (uint32_t)(new_byte_size / sizeof(Subtree));\n }\n SubtreeHeapData *data = (SubtreeHeapData *)&children->contents[children->size];\n\n *data = (SubtreeHeapData) {\n .ref_count = 1,\n .symbol = symbol,\n .child_count = children->size,\n .visible = metadata.visible,\n .named = metadata.named,\n .has_changes = false,\n .has_external_scanner_state_change = false,\n .fragile_left = fragile,\n .fragile_right = fragile,\n .is_keyword = false,\n {{\n .visible_descendant_count = 0,\n .production_id = production_id,\n .first_leaf = {.symbol = 0, .parse_state = 0},\n }}\n };\n MutableSubtree result = {.ptr = data};\n ts_subtree_summarize_children(result, language);\n return result;\n}\n\n// Create a new error node containing the given children.\n//\n// This node is treated as 'extra'. Its children are prevented from having\n// having any effect on the parse state.\nSubtree ts_subtree_new_error_node(\n SubtreeArray *children,\n bool extra,\n const TSLanguage *language\n) {\n MutableSubtree result = ts_subtree_new_node(\n ts_builtin_sym_error, children, 0, language\n );\n result.ptr->extra = extra;\n return ts_subtree_from_mut(result);\n}\n\n// Create a new 'missing leaf' node.\n//\n// This node is treated as 'extra'. Its children are prevented from having\n// having any effect on the parse state.\nSubtree ts_subtree_new_missing_leaf(\n SubtreePool *pool,\n TSSymbol symbol,\n Length padding,\n uint32_t lookahead_bytes,\n const TSLanguage *language\n) {\n Subtree result = ts_subtree_new_leaf(\n pool, symbol, padding, length_zero(), lookahead_bytes,\n 0, false, false, false, language\n );\n if (result.data.is_inline) {\n result.data.is_missing = true;\n } else {\n ((SubtreeHeapData *)result.ptr)->is_missing = true;\n }\n return result;\n}\n\nvoid ts_subtree_retain(Subtree self) {\n if (self.data.is_inline) return;\n ts_assert(self.ptr->ref_count > 0);\n atomic_inc((volatile uint32_t *)&self.ptr->ref_count);\n ts_assert(self.ptr->ref_count != 0);\n}\n\nvoid ts_subtree_release(SubtreePool *pool, Subtree self) {\n if (self.data.is_inline) return;\n array_clear(&pool->tree_stack);\n\n ts_assert(self.ptr->ref_count > 0);\n if (atomic_dec((volatile uint32_t *)&self.ptr->ref_count) == 0) {\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(self));\n }\n\n while (pool->tree_stack.size > 0) {\n MutableSubtree tree = array_pop(&pool->tree_stack);\n if (tree.ptr->child_count > 0) {\n Subtree *children = ts_subtree_children(tree);\n for (uint32_t i = 0; i < tree.ptr->child_count; i++) {\n Subtree child = children[i];\n if (child.data.is_inline) continue;\n ts_assert(child.ptr->ref_count > 0);\n if (atomic_dec((volatile uint32_t *)&child.ptr->ref_count) == 0) {\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(child));\n }\n }\n ts_free(children);\n } else {\n if (tree.ptr->has_external_tokens) {\n ts_external_scanner_state_delete(&tree.ptr->external_scanner_state);\n }\n ts_subtree_pool_free(pool, tree.ptr);\n }\n }\n}\n\nint ts_subtree_compare(Subtree left, Subtree right, SubtreePool *pool) {\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(left));\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(right));\n\n while (pool->tree_stack.size > 0) {\n right = ts_subtree_from_mut(array_pop(&pool->tree_stack));\n left = ts_subtree_from_mut(array_pop(&pool->tree_stack));\n\n int result = 0;\n if (ts_subtree_symbol(left) < ts_subtree_symbol(right)) result = -1;\n else if (ts_subtree_symbol(right) < ts_subtree_symbol(left)) result = 1;\n else if (ts_subtree_child_count(left) < ts_subtree_child_count(right)) result = -1;\n else if (ts_subtree_child_count(right) < ts_subtree_child_count(left)) result = 1;\n if (result != 0) {\n array_clear(&pool->tree_stack);\n return result;\n }\n\n for (uint32_t i = ts_subtree_child_count(left); i > 0; i--) {\n Subtree left_child = ts_subtree_children(left)[i - 1];\n Subtree right_child = ts_subtree_children(right)[i - 1];\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(left_child));\n array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(right_child));\n }\n }\n\n return 0;\n}\n\nstatic inline void ts_subtree_set_has_changes(MutableSubtree *self) {\n if (self->data.is_inline) {\n self->data.has_changes = true;\n } else {\n self->ptr->has_changes = true;\n }\n}\n\nSubtree ts_subtree_edit(Subtree self, const TSInputEdit *input_edit, SubtreePool *pool) {\n typedef struct {\n Subtree *tree;\n Edit edit;\n } EditEntry;\n\n Array(EditEntry) stack = array_new();\n array_push(&stack, ((EditEntry) {\n .tree = &self,\n .edit = (Edit) {\n .start = {input_edit->start_byte, input_edit->start_point},\n .old_end = {input_edit->old_end_byte, input_edit->old_end_point},\n .new_end = {input_edit->new_end_byte, input_edit->new_end_point},\n },\n }));\n\n while (stack.size) {\n EditEntry entry = array_pop(&stack);\n Edit edit = entry.edit;\n bool is_noop = edit.old_end.bytes == edit.start.bytes && edit.new_end.bytes == edit.start.bytes;\n bool is_pure_insertion = edit.old_end.bytes == edit.start.bytes;\n bool parent_depends_on_column = ts_subtree_depends_on_column(*entry.tree);\n bool column_shifted = edit.new_end.extent.column != edit.old_end.extent.column;\n\n Length size = ts_subtree_size(*entry.tree);\n Length padding = ts_subtree_padding(*entry.tree);\n Length total_size = length_add(padding, size);\n uint32_t lookahead_bytes = ts_subtree_lookahead_bytes(*entry.tree);\n uint32_t end_byte = total_size.bytes + lookahead_bytes;\n if (edit.start.bytes > end_byte || (is_noop && edit.start.bytes == end_byte)) continue;\n\n // If the edit is entirely within the space before this subtree, then shift this\n // subtree over according to the edit without changing its size.\n if (edit.old_end.bytes <= padding.bytes) {\n padding = length_add(edit.new_end, length_sub(padding, edit.old_end));\n }\n\n // If the edit starts in the space before this subtree and extends into this subtree,\n // shrink the subtree's content to compensate for the change in the space before it.\n else if (edit.start.bytes < padding.bytes) {\n size = length_saturating_sub(size, length_sub(edit.old_end, padding));\n padding = edit.new_end;\n }\n\n // If the edit is within this subtree, resize the subtree to reflect the edit.\n else if (\n edit.start.bytes < total_size.bytes ||\n (edit.start.bytes == total_size.bytes && is_pure_insertion)\n ) {\n size = length_add(\n length_sub(edit.new_end, padding),\n length_saturating_sub(total_size, edit.old_end)\n );\n }\n\n MutableSubtree result = ts_subtree_make_mut(pool, *entry.tree);\n\n if (result.data.is_inline) {\n if (ts_subtree_can_inline(padding, size, lookahead_bytes)) {\n result.data.padding_bytes = padding.bytes;\n result.data.padding_rows = padding.extent.row;\n result.data.padding_columns = padding.extent.column;\n result.data.size_bytes = size.bytes;\n } else {\n SubtreeHeapData *data = ts_subtree_pool_allocate(pool);\n data->ref_count = 1;\n data->padding = padding;\n data->size = size;\n data->lookahead_bytes = lookahead_bytes;\n data->error_cost = 0;\n data->child_count = 0;\n data->symbol = result.data.symbol;\n data->parse_state = result.data.parse_state;\n data->visible = result.data.visible;\n data->named = result.data.named;\n data->extra = result.data.extra;\n data->fragile_left = false;\n data->fragile_right = false;\n data->has_changes = false;\n data->has_external_tokens = false;\n data->depends_on_column = false;\n data->is_missing = result.data.is_missing;\n data->is_keyword = result.data.is_keyword;\n result.ptr = data;\n }\n } else {\n result.ptr->padding = padding;\n result.ptr->size = size;\n }\n\n ts_subtree_set_has_changes(&result);\n *entry.tree = ts_subtree_from_mut(result);\n\n Length child_left, child_right = length_zero();\n for (uint32_t i = 0, n = ts_subtree_child_count(*entry.tree); i < n; i++) {\n Subtree *child = &ts_subtree_children(*entry.tree)[i];\n Length child_size = ts_subtree_total_size(*child);\n child_left = child_right;\n child_right = length_add(child_left, child_size);\n\n // If this child ends before the edit, it is not affected.\n if (child_right.bytes + ts_subtree_lookahead_bytes(*child) < edit.start.bytes) continue;\n\n // Keep editing child nodes until a node is reached that starts after the edit.\n // Also, if this node's validity depends on its column position, then continue\n // invalidating child nodes until reaching a line break.\n if ((\n (child_left.bytes > edit.old_end.bytes) ||\n (child_left.bytes == edit.old_end.bytes && child_size.bytes > 0 && i > 0)\n ) && (\n !parent_depends_on_column ||\n child_left.extent.row > padding.extent.row\n ) && (\n !ts_subtree_depends_on_column(*child) ||\n !column_shifted ||\n child_left.extent.row > edit.old_end.extent.row\n )) {\n break;\n }\n\n // Transform edit into the child's coordinate space.\n Edit child_edit = {\n .start = length_saturating_sub(edit.start, child_left),\n .old_end = length_saturating_sub(edit.old_end, child_left),\n .new_end = length_saturating_sub(edit.new_end, child_left),\n };\n\n // Interpret all inserted text as applying to the *first* child that touches the edit.\n // Subsequent children are only never have any text inserted into them; they are only\n // shrunk to compensate for the edit.\n if (\n child_right.bytes > edit.start.bytes ||\n (child_right.bytes == edit.start.bytes && is_pure_insertion)\n ) {\n edit.new_end = edit.start;\n }\n\n // Children that occur before the edit are not reshaped by the edit.\n else {\n child_edit.old_end = child_edit.start;\n child_edit.new_end = child_edit.start;\n }\n\n // Queue processing of this child's subtree.\n array_push(&stack, ((EditEntry) {\n .tree = child,\n .edit = child_edit,\n }));\n }\n }\n\n array_delete(&stack);\n return self;\n}\n\nSubtree ts_subtree_last_external_token(Subtree tree) {\n if (!ts_subtree_has_external_tokens(tree)) return NULL_SUBTREE;\n while (tree.ptr->child_count > 0) {\n for (uint32_t i = tree.ptr->child_count - 1; i + 1 > 0; i--) {\n Subtree child = ts_subtree_children(tree)[i];\n if (ts_subtree_has_external_tokens(child)) {\n tree = child;\n break;\n }\n }\n }\n return tree;\n}\n\nstatic size_t ts_subtree__write_char_to_string(char *str, size_t n, int32_t chr) {\n if (chr == -1)\n return snprintf(str, n, \"INVALID\");\n else if (chr == '\\0')\n return snprintf(str, n, \"'\\\\0'\");\n else if (chr == '\\n')\n return snprintf(str, n, \"'\\\\n'\");\n else if (chr == '\\t')\n return snprintf(str, n, \"'\\\\t'\");\n else if (chr == '\\r')\n return snprintf(str, n, \"'\\\\r'\");\n else if (0 < chr && chr < 128 && isprint(chr))\n return snprintf(str, n, \"'%c'\", chr);\n else\n return snprintf(str, n, \"%d\", chr);\n}\n\nstatic const char *const ROOT_FIELD = \"__ROOT__\";\n\nstatic size_t ts_subtree__write_to_string(\n Subtree self, char *string, size_t limit,\n const TSLanguage *language, bool include_all,\n TSSymbol alias_symbol, bool alias_is_named, const char *field_name\n) {\n if (!self.ptr) return snprintf(string, limit, \"(NULL)\");\n\n char *cursor = string;\n char **writer = (limit > 1) ? &cursor : &string;\n bool is_root = field_name == ROOT_FIELD;\n bool is_visible =\n include_all ||\n ts_subtree_missing(self) ||\n (\n alias_symbol\n ? alias_is_named\n : ts_subtree_visible(self) && ts_subtree_named(self)\n );\n\n if (is_visible) {\n if (!is_root) {\n cursor += snprintf(*writer, limit, \" \");\n if (field_name) {\n cursor += snprintf(*writer, limit, \"%s: \", field_name);\n }\n }\n\n if (ts_subtree_is_error(self) && ts_subtree_child_count(self) == 0 && self.ptr->size.bytes > 0) {\n cursor += snprintf(*writer, limit, \"(UNEXPECTED \");\n cursor += ts_subtree__write_char_to_string(*writer, limit, self.ptr->lookahead_char);\n } else {\n TSSymbol symbol = alias_symbol ? alias_symbol : ts_subtree_symbol(self);\n const char *symbol_name = ts_language_symbol_name(language, symbol);\n if (ts_subtree_missing(self)) {\n cursor += snprintf(*writer, limit, \"(MISSING \");\n if (alias_is_named || ts_subtree_named(self)) {\n cursor += snprintf(*writer, limit, \"%s\", symbol_name);\n } else {\n cursor += snprintf(*writer, limit, \"\\\"%s\\\"\", symbol_name);\n }\n } else {\n cursor += snprintf(*writer, limit, \"(%s\", symbol_name);\n }\n }\n } else if (is_root) {\n TSSymbol symbol = alias_symbol ? alias_symbol : ts_subtree_symbol(self);\n const char *symbol_name = ts_language_symbol_name(language, symbol);\n if (ts_subtree_child_count(self) > 0) {\n cursor += snprintf(*writer, limit, \"(%s\", symbol_name);\n } else if (ts_subtree_named(self)) {\n cursor += snprintf(*writer, limit, \"(%s)\", symbol_name);\n } else {\n cursor += snprintf(*writer, limit, \"(\\\"%s\\\")\", symbol_name);\n }\n }\n\n if (ts_subtree_child_count(self)) {\n const TSSymbol *alias_sequence = ts_language_alias_sequence(language, self.ptr->production_id);\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(\n language,\n self.ptr->production_id,\n &field_map,\n &field_map_end\n );\n\n uint32_t structural_child_index = 0;\n for (uint32_t i = 0; i < self.ptr->child_count; i++) {\n Subtree child = ts_subtree_children(self)[i];\n if (ts_subtree_extra(child)) {\n cursor += ts_subtree__write_to_string(\n child, *writer, limit,\n language, include_all,\n 0, false, NULL\n );\n } else {\n TSSymbol subtree_alias_symbol = alias_sequence\n ? alias_sequence[structural_child_index]\n : 0;\n bool subtree_alias_is_named = subtree_alias_symbol\n ? ts_language_symbol_metadata(language, subtree_alias_symbol).named\n : false;\n\n const char *child_field_name = is_visible ? NULL : field_name;\n for (const TSFieldMapEntry *map = field_map; map < field_map_end; map++) {\n if (!map->inherited && map->child_index == structural_child_index) {\n child_field_name = language->field_names[map->field_id];\n break;\n }\n }\n\n cursor += ts_subtree__write_to_string(\n child, *writer, limit,\n language, include_all,\n subtree_alias_symbol, subtree_alias_is_named, child_field_name\n );\n structural_child_index++;\n }\n }\n }\n\n if (is_visible) cursor += snprintf(*writer, limit, \")\");\n\n return cursor - string;\n}\n\nchar *ts_subtree_string(\n Subtree self,\n TSSymbol alias_symbol,\n bool alias_is_named,\n const TSLanguage *language,\n bool include_all\n) {\n char scratch_string[1];\n size_t size = ts_subtree__write_to_string(\n self, scratch_string, 1,\n language, include_all,\n alias_symbol, alias_is_named, ROOT_FIELD\n ) + 1;\n char *result = ts_malloc(size * sizeof(char));\n ts_subtree__write_to_string(\n self, result, size,\n language, include_all,\n alias_symbol, alias_is_named, ROOT_FIELD\n );\n return result;\n}\n\nvoid ts_subtree__print_dot_graph(const Subtree *self, uint32_t start_offset,\n const TSLanguage *language, TSSymbol alias_symbol,\n FILE *f) {\n TSSymbol subtree_symbol = ts_subtree_symbol(*self);\n TSSymbol symbol = alias_symbol ? alias_symbol : subtree_symbol;\n uint32_t end_offset = start_offset + ts_subtree_total_bytes(*self);\n fprintf(f, \"tree_%p [label=\\\"\", (void *)self);\n ts_language_write_symbol_as_dot_string(language, f, symbol);\n fprintf(f, \"\\\"\");\n\n if (ts_subtree_child_count(*self) == 0) fprintf(f, \", shape=plaintext\");\n if (ts_subtree_extra(*self)) fprintf(f, \", fontcolor=gray\");\n if (ts_subtree_has_changes(*self)) fprintf(f, \", color=green, penwidth=2\");\n\n fprintf(f, \", tooltip=\\\"\"\n \"range: %u - %u\\n\"\n \"state: %d\\n\"\n \"error-cost: %u\\n\"\n \"has-changes: %u\\n\"\n \"depends-on-column: %u\\n\"\n \"descendant-count: %u\\n\"\n \"repeat-depth: %u\\n\"\n \"lookahead-bytes: %u\",\n start_offset, end_offset,\n ts_subtree_parse_state(*self),\n ts_subtree_error_cost(*self),\n ts_subtree_has_changes(*self),\n ts_subtree_depends_on_column(*self),\n ts_subtree_visible_descendant_count(*self),\n ts_subtree_repeat_depth(*self),\n ts_subtree_lookahead_bytes(*self)\n );\n\n if (ts_subtree_is_error(*self) && ts_subtree_child_count(*self) == 0 && self->ptr->lookahead_char != 0) {\n fprintf(f, \"\\ncharacter: '%c'\", self->ptr->lookahead_char);\n }\n\n fprintf(f, \"\\\"]\\n\");\n\n uint32_t child_start_offset = start_offset;\n uint32_t child_info_offset =\n language->max_alias_sequence_length *\n ts_subtree_production_id(*self);\n for (uint32_t i = 0, n = ts_subtree_child_count(*self); i < n; i++) {\n const Subtree *child = &ts_subtree_children(*self)[i];\n TSSymbol subtree_alias_symbol = 0;\n if (!ts_subtree_extra(*child) && child_info_offset) {\n subtree_alias_symbol = language->alias_sequences[child_info_offset];\n child_info_offset++;\n }\n ts_subtree__print_dot_graph(child, child_start_offset, language, subtree_alias_symbol, f);\n fprintf(f, \"tree_%p -> tree_%p [tooltip=%u]\\n\", (void *)self, (void *)child, i);\n child_start_offset += ts_subtree_total_bytes(*child);\n }\n}\n\nvoid ts_subtree_print_dot_graph(Subtree self, const TSLanguage *language, FILE *f) {\n fprintf(f, \"digraph tree {\\n\");\n fprintf(f, \"edge [arrowhead=none]\\n\");\n ts_subtree__print_dot_graph(&self, 0, language, 0, f);\n fprintf(f, \"}\\n\");\n}\n\nconst ExternalScannerState *ts_subtree_external_scanner_state(Subtree self) {\n static const ExternalScannerState empty_state = {{.short_data = {0}}, .length = 0};\n if (\n self.ptr &&\n !self.data.is_inline &&\n self.ptr->has_external_tokens &&\n self.ptr->child_count == 0\n ) {\n return &self.ptr->external_scanner_state;\n } else {\n return &empty_state;\n }\n}\n\nbool ts_subtree_external_scanner_state_eq(Subtree self, Subtree other) {\n const ExternalScannerState *state_self = ts_subtree_external_scanner_state(self);\n const ExternalScannerState *state_other = ts_subtree_external_scanner_state(other);\n return ts_external_scanner_state_eq(\n state_self,\n ts_external_scanner_state_data(state_other),\n state_other->length\n );\n}\n",
37
- "#include \"./language.h\"\n#include \"./wasm_store.h\"\n#include \"tree_sitter/api.h\"\n#include <string.h>\n\nconst TSLanguage *ts_language_copy(const TSLanguage *self) {\n if (self && ts_language_is_wasm(self)) {\n ts_wasm_language_retain(self);\n }\n return self;\n}\n\nvoid ts_language_delete(const TSLanguage *self) {\n if (self && ts_language_is_wasm(self)) {\n ts_wasm_language_release(self);\n }\n}\n\nuint32_t ts_language_symbol_count(const TSLanguage *self) {\n return self->symbol_count + self->alias_count;\n}\n\nuint32_t ts_language_state_count(const TSLanguage *self) {\n return self->state_count;\n}\n\nconst TSSymbol *ts_language_supertypes(const TSLanguage *self, uint32_t *length) {\n if (self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {\n *length = self->supertype_count;\n return self->supertype_symbols;\n } else {\n *length = 0;\n return NULL;\n }\n}\n\nconst TSSymbol *ts_language_subtypes(\n const TSLanguage *self,\n TSSymbol supertype,\n uint32_t *length\n) {\n if (self->abi_version < LANGUAGE_VERSION_WITH_RESERVED_WORDS || !ts_language_symbol_metadata(self, supertype).supertype) {\n *length = 0;\n return NULL;\n }\n\n TSMapSlice slice = self->supertype_map_slices[supertype];\n *length = slice.length;\n return &self->supertype_map_entries[slice.index];\n}\n\nuint32_t ts_language_abi_version(const TSLanguage *self) {\n return self->abi_version;\n}\n\nconst TSLanguageMetadata *ts_language_metadata(const TSLanguage *self) {\n return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? &self->metadata : NULL;\n}\n\nconst char *ts_language_name(const TSLanguage *self) {\n return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? self->name : NULL;\n}\n\nuint32_t ts_language_field_count(const TSLanguage *self) {\n return self->field_count;\n}\n\nvoid ts_language_table_entry(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol,\n TableEntry *result\n) {\n if (symbol == ts_builtin_sym_error || symbol == ts_builtin_sym_error_repeat) {\n result->action_count = 0;\n result->is_reusable = false;\n result->actions = NULL;\n } else {\n ts_assert(symbol < self->token_count);\n uint32_t action_index = ts_language_lookup(self, state, symbol);\n const TSParseActionEntry *entry = &self->parse_actions[action_index];\n result->action_count = entry->entry.count;\n result->is_reusable = entry->entry.reusable;\n result->actions = (const TSParseAction *)(entry + 1);\n }\n}\n\nTSLexerMode ts_language_lex_mode_for_state(\n const TSLanguage *self,\n TSStateId state\n) {\n if (self->abi_version < 15) {\n TSLexMode mode = ((const TSLexMode *)self->lex_modes)[state];\n return (TSLexerMode) {\n .lex_state = mode.lex_state,\n .external_lex_state = mode.external_lex_state,\n .reserved_word_set_id = 0,\n };\n } else {\n return self->lex_modes[state];\n }\n}\n\nbool ts_language_is_reserved_word(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol\n) {\n TSLexerMode lex_mode = ts_language_lex_mode_for_state(self, state);\n if (lex_mode.reserved_word_set_id > 0) {\n unsigned start = lex_mode.reserved_word_set_id * self->max_reserved_word_set_size;\n unsigned end = start + self->max_reserved_word_set_size;\n for (unsigned i = start; i < end; i++) {\n if (self->reserved_words[i] == symbol) return true;\n if (self->reserved_words[i] == 0) break;\n }\n }\n return false;\n}\n\nTSSymbolMetadata ts_language_symbol_metadata(\n const TSLanguage *self,\n TSSymbol symbol\n) {\n if (symbol == ts_builtin_sym_error) {\n return (TSSymbolMetadata) {.visible = true, .named = true};\n } else if (symbol == ts_builtin_sym_error_repeat) {\n return (TSSymbolMetadata) {.visible = false, .named = false};\n } else {\n return self->symbol_metadata[symbol];\n }\n}\n\nTSSymbol ts_language_public_symbol(\n const TSLanguage *self,\n TSSymbol symbol\n) {\n if (symbol == ts_builtin_sym_error) return symbol;\n return self->public_symbol_map[symbol];\n}\n\nTSStateId ts_language_next_state(\n const TSLanguage *self,\n TSStateId state,\n TSSymbol symbol\n) {\n if (symbol == ts_builtin_sym_error || symbol == ts_builtin_sym_error_repeat) {\n return 0;\n } else if (symbol < self->token_count) {\n uint32_t count;\n const TSParseAction *actions = ts_language_actions(self, state, symbol, &count);\n if (count > 0) {\n TSParseAction action = actions[count - 1];\n if (action.type == TSParseActionTypeShift) {\n return action.shift.extra ? state : action.shift.state;\n }\n }\n return 0;\n } else {\n return ts_language_lookup(self, state, symbol);\n }\n}\n\nconst char *ts_language_symbol_name(\n const TSLanguage *self,\n TSSymbol symbol\n) {\n if (symbol == ts_builtin_sym_error) {\n return \"ERROR\";\n } else if (symbol == ts_builtin_sym_error_repeat) {\n return \"_ERROR\";\n } else if (symbol < ts_language_symbol_count(self)) {\n return self->symbol_names[symbol];\n } else {\n return NULL;\n }\n}\n\nTSSymbol ts_language_symbol_for_name(\n const TSLanguage *self,\n const char *string,\n uint32_t length,\n bool is_named\n) {\n if (is_named && !strncmp(string, \"ERROR\", length)) return ts_builtin_sym_error;\n uint16_t count = (uint16_t)ts_language_symbol_count(self);\n for (TSSymbol i = 0; i < count; i++) {\n TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i);\n if ((!metadata.visible && !metadata.supertype) || metadata.named != is_named) continue;\n const char *symbol_name = self->symbol_names[i];\n if (!strncmp(symbol_name, string, length) && !symbol_name[length]) {\n return self->public_symbol_map[i];\n }\n }\n return 0;\n}\n\nTSSymbolType ts_language_symbol_type(\n const TSLanguage *self,\n TSSymbol symbol\n) {\n TSSymbolMetadata metadata = ts_language_symbol_metadata(self, symbol);\n if (metadata.named && metadata.visible) {\n return TSSymbolTypeRegular;\n } else if (metadata.visible) {\n return TSSymbolTypeAnonymous;\n } else if (metadata.supertype) {\n return TSSymbolTypeSupertype;\n } else {\n return TSSymbolTypeAuxiliary;\n }\n}\n\nconst char *ts_language_field_name_for_id(\n const TSLanguage *self,\n TSFieldId id\n) {\n uint32_t count = ts_language_field_count(self);\n if (count && id <= count) {\n return self->field_names[id];\n } else {\n return NULL;\n }\n}\n\nTSFieldId ts_language_field_id_for_name(\n const TSLanguage *self,\n const char *name,\n uint32_t name_length\n) {\n uint16_t count = (uint16_t)ts_language_field_count(self);\n for (TSSymbol i = 1; i < count + 1; i++) {\n switch (strncmp(name, self->field_names[i], name_length)) {\n case 0:\n if (self->field_names[i][name_length] == 0) return i;\n break;\n case -1:\n return 0;\n default:\n break;\n }\n }\n return 0;\n}\n\nTSLookaheadIterator *ts_lookahead_iterator_new(const TSLanguage *self, TSStateId state) {\n if (state >= self->state_count) return NULL;\n LookaheadIterator *iterator = ts_malloc(sizeof(LookaheadIterator));\n *iterator = ts_language_lookaheads(self, state);\n return (TSLookaheadIterator *)iterator;\n}\n\nvoid ts_lookahead_iterator_delete(TSLookaheadIterator *self) {\n ts_free(self);\n}\n\nbool ts_lookahead_iterator_reset_state(TSLookaheadIterator * self, TSStateId state) {\n LookaheadIterator *iterator = (LookaheadIterator *)self;\n if (state >= iterator->language->state_count) return false;\n *iterator = ts_language_lookaheads(iterator->language, state);\n return true;\n}\n\nconst TSLanguage *ts_lookahead_iterator_language(const TSLookaheadIterator *self) {\n const LookaheadIterator *iterator = (const LookaheadIterator *)self;\n return iterator->language;\n}\n\nbool ts_lookahead_iterator_reset(TSLookaheadIterator *self, const TSLanguage *language, TSStateId state) {\n if (state >= language->state_count) return false;\n LookaheadIterator *iterator = (LookaheadIterator *)self;\n *iterator = ts_language_lookaheads(language, state);\n return true;\n}\n\nbool ts_lookahead_iterator_next(TSLookaheadIterator *self) {\n LookaheadIterator *iterator = (LookaheadIterator *)self;\n return ts_lookahead_iterator__next(iterator);\n}\n\nTSSymbol ts_lookahead_iterator_current_symbol(const TSLookaheadIterator *self) {\n const LookaheadIterator *iterator = (const LookaheadIterator *)self;\n return iterator->symbol;\n}\n\nconst char *ts_lookahead_iterator_current_symbol_name(const TSLookaheadIterator *self) {\n const LookaheadIterator *iterator = (const LookaheadIterator *)self;\n return ts_language_symbol_name(iterator->language, iterator->symbol);\n}\n",
38
- "#include \"./length.h\"\n#include \"./lexer.h\"\n#include \"./unicode.h\"\n\n#include \"tree_sitter/api.h\"\n\n#include <stdarg.h>\n#include <stdio.h>\n\n#define LOG(message, character) \\\n if (self->logger.log) { \\\n snprintf( \\\n self->debug_buffer, \\\n TREE_SITTER_SERIALIZATION_BUFFER_SIZE, \\\n 32 <= character && character < 127 ? \\\n message \" character:'%c'\" : \\\n message \" character:%d\", \\\n character \\\n ); \\\n self->logger.log( \\\n self->logger.payload, \\\n TSLogTypeLex, \\\n self->debug_buffer \\\n ); \\\n }\n\nstatic const int32_t BYTE_ORDER_MARK = 0xFEFF;\n\nstatic const TSRange DEFAULT_RANGE = {\n .start_point = {\n .row = 0,\n .column = 0,\n },\n .end_point = {\n .row = UINT32_MAX,\n .column = UINT32_MAX,\n },\n .start_byte = 0,\n .end_byte = UINT32_MAX\n};\n\n/**\n * Sets the column data to the given value and marks it valid.\n * @param self The lexer state.\n * @param val The new value of the column data.\n */\nstatic void ts_lexer__set_column_data(Lexer *self, uint32_t val) {\n self->column_data.valid = true;\n self->column_data.value = val;\n}\n\n/**\n * Increments the value of the column data; no-op if invalid.\n * @param self The lexer state.\n */\nstatic void ts_lexer__increment_column_data(Lexer *self) {\n if (self->column_data.valid) {\n self->column_data.value++;\n }\n}\n\n/**\n * Marks the column data as invalid.\n * @param self The lexer state.\n */\nstatic void ts_lexer__invalidate_column_data(Lexer *self) {\n self->column_data.valid = false;\n self->column_data.value = 0;\n}\n\n// Check if the lexer has reached EOF. This state is stored\n// by setting the lexer's `current_included_range_index` such that\n// it has consumed all of its available ranges.\nstatic bool ts_lexer__eof(const TSLexer *_self) {\n Lexer *self = (Lexer *)_self;\n return self->current_included_range_index == self->included_range_count;\n}\n\n// Clear the currently stored chunk of source code, because the lexer's\n// position has changed.\nstatic void ts_lexer__clear_chunk(Lexer *self) {\n self->chunk = NULL;\n self->chunk_size = 0;\n self->chunk_start = 0;\n}\n\n// Call the lexer's input callback to obtain a new chunk of source code\n// for the current position.\nstatic void ts_lexer__get_chunk(Lexer *self) {\n self->chunk_start = self->current_position.bytes;\n self->chunk = self->input.read(\n self->input.payload,\n self->current_position.bytes,\n self->current_position.extent,\n &self->chunk_size\n );\n if (!self->chunk_size) {\n self->current_included_range_index = self->included_range_count;\n self->chunk = NULL;\n }\n}\n\n// Decode the next unicode character in the current chunk of source code.\n// This assumes that the lexer has already retrieved a chunk of source\n// code that spans the current position.\nstatic void ts_lexer__get_lookahead(Lexer *self) {\n uint32_t position_in_chunk = self->current_position.bytes - self->chunk_start;\n uint32_t size = self->chunk_size - position_in_chunk;\n\n if (size == 0) {\n self->lookahead_size = 1;\n self->data.lookahead = '\\0';\n return;\n }\n\n const uint8_t *chunk = (const uint8_t *)self->chunk + position_in_chunk;\n TSDecodeFunction decode =\n self->input.encoding == TSInputEncodingUTF8 ? ts_decode_utf8 :\n self->input.encoding == TSInputEncodingUTF16LE ? ts_decode_utf16_le :\n self->input.encoding == TSInputEncodingUTF16BE ? ts_decode_utf16_be : self->input.decode;\n\n self->lookahead_size = decode(chunk, size, &self->data.lookahead);\n\n // If this chunk ended in the middle of a multi-byte character,\n // try again with a fresh chunk.\n if (self->data.lookahead == TS_DECODE_ERROR && size < 4) {\n ts_lexer__get_chunk(self);\n chunk = (const uint8_t *)self->chunk;\n size = self->chunk_size;\n self->lookahead_size = decode(chunk, size, &self->data.lookahead);\n }\n\n if (self->data.lookahead == TS_DECODE_ERROR) {\n self->lookahead_size = 1;\n }\n}\n\nstatic void ts_lexer_goto(Lexer *self, Length position) {\n if (position.bytes != self->current_position.bytes) {\n ts_lexer__invalidate_column_data(self);\n }\n\n self->current_position = position;\n\n // Move to the first valid position at or after the given position.\n bool found_included_range = false;\n for (unsigned i = 0; i < self->included_range_count; i++) {\n TSRange *included_range = &self->included_ranges[i];\n if (\n included_range->end_byte > self->current_position.bytes &&\n included_range->end_byte > included_range->start_byte\n ) {\n if (included_range->start_byte >= self->current_position.bytes) {\n self->current_position = (Length) {\n .bytes = included_range->start_byte,\n .extent = included_range->start_point,\n };\n }\n\n self->current_included_range_index = i;\n found_included_range = true;\n break;\n }\n }\n\n if (found_included_range) {\n // If the current position is outside of the current chunk of text,\n // then clear out the current chunk of text.\n if (self->chunk && (\n self->current_position.bytes < self->chunk_start ||\n self->current_position.bytes >= self->chunk_start + self->chunk_size\n )) {\n ts_lexer__clear_chunk(self);\n }\n\n self->lookahead_size = 0;\n self->data.lookahead = '\\0';\n }\n\n // If the given position is beyond any of included ranges, move to the EOF\n // state - past the end of the included ranges.\n else {\n self->current_included_range_index = self->included_range_count;\n TSRange *last_included_range = &self->included_ranges[self->included_range_count - 1];\n self->current_position = (Length) {\n .bytes = last_included_range->end_byte,\n .extent = last_included_range->end_point,\n };\n ts_lexer__clear_chunk(self);\n self->lookahead_size = 1;\n self->data.lookahead = '\\0';\n }\n}\n\n/**\n * Actually advances the lexer. Does not log anything.\n * @param self The lexer state.\n * @param skip Whether to mark the consumed codepoint as whitespace.\n */\nstatic void ts_lexer__do_advance(Lexer *self, bool skip) {\n if (self->lookahead_size) {\n if (self->data.lookahead == '\\n') {\n self->current_position.extent.row++;\n self->current_position.extent.column = 0;\n ts_lexer__set_column_data(self, 0);\n } else {\n bool is_bom = self->current_position.bytes == 0 && \n self->data.lookahead == BYTE_ORDER_MARK;\n if (!is_bom) ts_lexer__increment_column_data(self);\n self->current_position.extent.column += self->lookahead_size;\n }\n self->current_position.bytes += self->lookahead_size;\n }\n\n const TSRange *current_range = &self->included_ranges[self->current_included_range_index];\n while (\n self->current_position.bytes >= current_range->end_byte ||\n current_range->end_byte == current_range->start_byte\n ) {\n if (self->current_included_range_index < self->included_range_count) {\n self->current_included_range_index++;\n }\n if (self->current_included_range_index < self->included_range_count) {\n current_range++;\n self->current_position = (Length) {\n current_range->start_byte,\n current_range->start_point,\n };\n } else {\n current_range = NULL;\n break;\n }\n }\n\n if (skip) self->token_start_position = self->current_position;\n\n if (current_range) {\n if (\n self->current_position.bytes < self->chunk_start ||\n self->current_position.bytes >= self->chunk_start + self->chunk_size\n ) {\n ts_lexer__get_chunk(self);\n }\n ts_lexer__get_lookahead(self);\n } else {\n ts_lexer__clear_chunk(self);\n self->data.lookahead = '\\0';\n self->lookahead_size = 1;\n }\n}\n\n// Advance to the next character in the source code, retrieving a new\n// chunk of source code if needed.\nstatic void ts_lexer__advance(TSLexer *_self, bool skip) {\n Lexer *self = (Lexer *)_self;\n if (!self->chunk) return;\n\n if (skip) {\n LOG(\"skip\", self->data.lookahead)\n } else {\n LOG(\"consume\", self->data.lookahead)\n }\n\n ts_lexer__do_advance(self, skip);\n}\n\n// Mark that a token match has completed. This can be called multiple\n// times if a longer match is found later.\nstatic void ts_lexer__mark_end(TSLexer *_self) {\n Lexer *self = (Lexer *)_self;\n if (!ts_lexer__eof(&self->data)) {\n // If the lexer is right at the beginning of included range,\n // then the token should be considered to end at the *end* of the\n // previous included range, rather than here.\n TSRange *current_included_range = &self->included_ranges[\n self->current_included_range_index\n ];\n if (\n self->current_included_range_index > 0 &&\n self->current_position.bytes == current_included_range->start_byte\n ) {\n TSRange *previous_included_range = current_included_range - 1;\n self->token_end_position = (Length) {\n previous_included_range->end_byte,\n previous_included_range->end_point,\n };\n return;\n }\n }\n self->token_end_position = self->current_position;\n}\n\nstatic uint32_t ts_lexer__get_column(TSLexer *_self) {\n Lexer *self = (Lexer *)_self;\n\n self->did_get_column = true;\n\n if (!self->column_data.valid) {\n // Record current position\n uint32_t goal_byte = self->current_position.bytes;\n\n // Back up to the beginning of the line\n Length start_of_col = {\n self->current_position.bytes - self->current_position.extent.column,\n {self->current_position.extent.row, 0},\n };\n ts_lexer_goto(self, start_of_col);\n ts_lexer__set_column_data(self, 0);\n ts_lexer__get_chunk(self);\n\n if (!ts_lexer__eof(_self)) {\n ts_lexer__get_lookahead(self);\n\n // Advance to the recorded position\n while (self->current_position.bytes < goal_byte && !ts_lexer__eof(_self) && self->chunk) {\n ts_lexer__do_advance(self, false);\n if (ts_lexer__eof(_self)) break;\n }\n }\n }\n\n return self->column_data.value;\n}\n\n// Is the lexer at a boundary between two disjoint included ranges of\n// source code? This is exposed as an API because some languages' external\n// scanners need to perform custom actions at these boundaries.\nstatic bool ts_lexer__is_at_included_range_start(const TSLexer *_self) {\n const Lexer *self = (const Lexer *)_self;\n if (self->current_included_range_index < self->included_range_count) {\n TSRange *current_range = &self->included_ranges[self->current_included_range_index];\n return self->current_position.bytes == current_range->start_byte;\n } else {\n return false;\n }\n}\n\nstatic void ts_lexer__log(const TSLexer *_self, const char *fmt, ...) {\n Lexer *self = (Lexer *)_self;\n va_list args;\n va_start(args, fmt);\n if (self->logger.log) {\n vsnprintf(self->debug_buffer, TREE_SITTER_SERIALIZATION_BUFFER_SIZE, fmt, args);\n self->logger.log(self->logger.payload, TSLogTypeLex, self->debug_buffer);\n }\n va_end(args);\n}\n\nvoid ts_lexer_init(Lexer *self) {\n *self = (Lexer) {\n .data = {\n // The lexer's methods are stored as struct fields so that generated\n // parsers can call them without needing to be linked against this\n // library.\n .advance = ts_lexer__advance,\n .mark_end = ts_lexer__mark_end,\n .get_column = ts_lexer__get_column,\n .is_at_included_range_start = ts_lexer__is_at_included_range_start,\n .eof = ts_lexer__eof,\n .log = ts_lexer__log,\n .lookahead = 0,\n .result_symbol = 0,\n },\n .chunk = NULL,\n .chunk_size = 0,\n .chunk_start = 0,\n .current_position = {0, {0, 0}},\n .logger = {\n .payload = NULL,\n .log = NULL\n },\n .included_ranges = NULL,\n .included_range_count = 0,\n .current_included_range_index = 0,\n .did_get_column = false,\n .column_data = {\n .valid = false,\n .value = 0\n }\n };\n ts_lexer_set_included_ranges(self, NULL, 0);\n}\n\nvoid ts_lexer_delete(Lexer *self) {\n ts_free(self->included_ranges);\n}\n\nvoid ts_lexer_set_input(Lexer *self, TSInput input) {\n self->input = input;\n ts_lexer__clear_chunk(self);\n ts_lexer_goto(self, self->current_position);\n}\n\n// Move the lexer to the given position. This doesn't do any work\n// if the parser is already at the given position.\nvoid ts_lexer_reset(Lexer *self, Length position) {\n if (position.bytes != self->current_position.bytes) {\n ts_lexer_goto(self, position);\n }\n}\n\nvoid ts_lexer_start(Lexer *self) {\n self->token_start_position = self->current_position;\n self->token_end_position = LENGTH_UNDEFINED;\n self->data.result_symbol = 0;\n self->did_get_column = false;\n if (!ts_lexer__eof(&self->data)) {\n if (!self->chunk_size) ts_lexer__get_chunk(self);\n if (!self->lookahead_size) ts_lexer__get_lookahead(self);\n if (self->current_position.bytes == 0) {\n if (self->data.lookahead == BYTE_ORDER_MARK) {\n ts_lexer__advance(&self->data, true);\n }\n ts_lexer__set_column_data(self, 0);\n }\n }\n}\n\nvoid ts_lexer_finish(Lexer *self, uint32_t *lookahead_end_byte) {\n if (length_is_undefined(self->token_end_position)) {\n ts_lexer__mark_end(&self->data);\n }\n\n // If the token ended at an included range boundary, then its end position\n // will have been reset to the end of the preceding range. Reset the start\n // position to match.\n if (self->token_end_position.bytes < self->token_start_position.bytes) {\n self->token_start_position = self->token_end_position;\n }\n\n uint32_t current_lookahead_end_byte = self->current_position.bytes + 1;\n\n // In order to determine that a byte sequence is invalid UTF8 or UTF16,\n // the character decoding algorithm may have looked at the following byte.\n // Therefore, the next byte *after* the current (invalid) character\n // affects the interpretation of the current character.\n if (self->data.lookahead == TS_DECODE_ERROR) {\n current_lookahead_end_byte += 4; // the maximum number of bytes read to identify an invalid code point\n }\n\n if (current_lookahead_end_byte > *lookahead_end_byte) {\n *lookahead_end_byte = current_lookahead_end_byte;\n }\n}\n\nvoid ts_lexer_mark_end(Lexer *self) {\n ts_lexer__mark_end(&self->data);\n}\n\nbool ts_lexer_set_included_ranges(\n Lexer *self,\n const TSRange *ranges,\n uint32_t count\n) {\n if (count == 0 || !ranges) {\n ranges = &DEFAULT_RANGE;\n count = 1;\n } else {\n uint32_t previous_byte = 0;\n for (unsigned i = 0; i < count; i++) {\n const TSRange *range = &ranges[i];\n if (\n range->start_byte < previous_byte ||\n range->end_byte < range->start_byte\n ) return false;\n previous_byte = range->end_byte;\n }\n }\n\n size_t size = count * sizeof(TSRange);\n self->included_ranges = ts_realloc(self->included_ranges, size);\n memcpy(self->included_ranges, ranges, size);\n self->included_range_count = count;\n ts_lexer_goto(self, self->current_position);\n return true;\n}\n\nTSRange *ts_lexer_included_ranges(const Lexer *self, uint32_t *count) {\n *count = self->included_range_count;\n return self->included_ranges;\n}\n\n#undef LOG\n",
39
- "#include <stdbool.h>\n#include \"./point.h\"\n#include \"./subtree.h\"\n#include \"./tree.h\"\n#include \"./language.h\"\n\ntypedef struct {\n Subtree parent;\n const TSTree *tree;\n Length position;\n uint32_t child_index;\n uint32_t structural_child_index;\n const TSSymbol *alias_sequence;\n} NodeChildIterator;\n\nstatic inline bool ts_node__is_relevant(TSNode self, bool include_anonymous);\n\n// TSNode - constructors\n\nTSNode ts_node_new(\n const TSTree *tree,\n const Subtree *subtree,\n Length position,\n TSSymbol alias\n) {\n return (TSNode) {\n {position.bytes, position.extent.row, position.extent.column, alias},\n subtree,\n tree,\n };\n}\n\nstatic inline TSNode ts_node__null(void) {\n return ts_node_new(NULL, NULL, length_zero(), 0);\n}\n\n// TSNode - accessors\n\nuint32_t ts_node_start_byte(TSNode self) {\n return self.context[0];\n}\n\nTSPoint ts_node_start_point(TSNode self) {\n return (TSPoint) {self.context[1], self.context[2]};\n}\n\nstatic inline uint32_t ts_node__alias(const TSNode *self) {\n return self->context[3];\n}\n\nstatic inline Subtree ts_node__subtree(TSNode self) {\n return *(const Subtree *)self.id;\n}\n\n// NodeChildIterator\n\nstatic inline NodeChildIterator ts_node_iterate_children(const TSNode *node) {\n Subtree subtree = ts_node__subtree(*node);\n if (ts_subtree_child_count(subtree) == 0) {\n return (NodeChildIterator) {NULL_SUBTREE, node->tree, length_zero(), 0, 0, NULL};\n }\n const TSSymbol *alias_sequence = ts_language_alias_sequence(\n node->tree->language,\n subtree.ptr->production_id\n );\n return (NodeChildIterator) {\n .tree = node->tree,\n .parent = subtree,\n .position = {ts_node_start_byte(*node), ts_node_start_point(*node)},\n .child_index = 0,\n .structural_child_index = 0,\n .alias_sequence = alias_sequence,\n };\n}\n\nstatic inline bool ts_node_child_iterator_done(NodeChildIterator *self) {\n return self->child_index == self->parent.ptr->child_count;\n}\n\nstatic inline bool ts_node_child_iterator_next(\n NodeChildIterator *self,\n TSNode *result\n) {\n if (!self->parent.ptr || ts_node_child_iterator_done(self)) return false;\n const Subtree *child = &ts_subtree_children(self->parent)[self->child_index];\n TSSymbol alias_symbol = 0;\n if (!ts_subtree_extra(*child)) {\n if (self->alias_sequence) {\n alias_symbol = self->alias_sequence[self->structural_child_index];\n }\n self->structural_child_index++;\n }\n if (self->child_index > 0) {\n self->position = length_add(self->position, ts_subtree_padding(*child));\n }\n *result = ts_node_new(\n self->tree,\n child,\n self->position,\n alias_symbol\n );\n self->position = length_add(self->position, ts_subtree_size(*child));\n self->child_index++;\n return true;\n}\n\n// TSNode - private\n\nstatic inline bool ts_node__is_relevant(TSNode self, bool include_anonymous) {\n Subtree tree = ts_node__subtree(self);\n if (include_anonymous) {\n return ts_subtree_visible(tree) || ts_node__alias(&self);\n } else {\n TSSymbol alias = ts_node__alias(&self);\n if (alias) {\n return ts_language_symbol_metadata(self.tree->language, alias).named;\n } else {\n return ts_subtree_visible(tree) && ts_subtree_named(tree);\n }\n }\n}\n\nstatic inline uint32_t ts_node__relevant_child_count(\n TSNode self,\n bool include_anonymous\n) {\n Subtree tree = ts_node__subtree(self);\n if (ts_subtree_child_count(tree) > 0) {\n if (include_anonymous) {\n return tree.ptr->visible_child_count;\n } else {\n return tree.ptr->named_child_count;\n }\n } else {\n return 0;\n }\n}\n\nstatic inline TSNode ts_node__child(\n TSNode self,\n uint32_t child_index,\n bool include_anonymous\n) {\n TSNode result = self;\n bool did_descend = true;\n\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n uint32_t index = 0;\n NodeChildIterator iterator = ts_node_iterate_children(&result);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (ts_node__is_relevant(child, include_anonymous)) {\n if (index == child_index) {\n return child;\n }\n index++;\n } else {\n uint32_t grandchild_index = child_index - index;\n uint32_t grandchild_count = ts_node__relevant_child_count(child, include_anonymous);\n if (grandchild_index < grandchild_count) {\n did_descend = true;\n result = child;\n child_index = grandchild_index;\n break;\n }\n index += grandchild_count;\n }\n }\n }\n\n return ts_node__null();\n}\n\nstatic bool ts_subtree_has_trailing_empty_descendant(\n Subtree self,\n Subtree other\n) {\n for (unsigned i = ts_subtree_child_count(self) - 1; i + 1 > 0; i--) {\n Subtree child = ts_subtree_children(self)[i];\n if (ts_subtree_total_bytes(child) > 0) break;\n if (child.ptr == other.ptr || ts_subtree_has_trailing_empty_descendant(child, other)) {\n return true;\n }\n }\n return false;\n}\n\nstatic inline TSNode ts_node__prev_sibling(TSNode self, bool include_anonymous) {\n Subtree self_subtree = ts_node__subtree(self);\n bool self_is_empty = ts_subtree_total_bytes(self_subtree) == 0;\n uint32_t target_end_byte = ts_node_end_byte(self);\n\n TSNode node = ts_node_parent(self);\n TSNode earlier_node = ts_node__null();\n bool earlier_node_is_relevant = false;\n\n while (!ts_node_is_null(node)) {\n TSNode earlier_child = ts_node__null();\n bool earlier_child_is_relevant = false;\n bool found_child_containing_target = false;\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&node);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (child.id == self.id) break;\n if (iterator.position.bytes > target_end_byte) {\n found_child_containing_target = true;\n break;\n }\n\n if (iterator.position.bytes == target_end_byte &&\n (!self_is_empty ||\n ts_subtree_has_trailing_empty_descendant(ts_node__subtree(child), self_subtree))) {\n found_child_containing_target = true;\n break;\n }\n\n if (ts_node__is_relevant(child, include_anonymous)) {\n earlier_child = child;\n earlier_child_is_relevant = true;\n } else if (ts_node__relevant_child_count(child, include_anonymous) > 0) {\n earlier_child = child;\n earlier_child_is_relevant = false;\n }\n }\n\n if (found_child_containing_target) {\n if (!ts_node_is_null(earlier_child)) {\n earlier_node = earlier_child;\n earlier_node_is_relevant = earlier_child_is_relevant;\n }\n node = child;\n } else if (earlier_child_is_relevant) {\n return earlier_child;\n } else if (!ts_node_is_null(earlier_child)) {\n node = earlier_child;\n } else if (earlier_node_is_relevant) {\n return earlier_node;\n } else {\n node = earlier_node;\n earlier_node = ts_node__null();\n earlier_node_is_relevant = false;\n }\n }\n\n return ts_node__null();\n}\n\nstatic inline TSNode ts_node__next_sibling(TSNode self, bool include_anonymous) {\n uint32_t target_end_byte = ts_node_end_byte(self);\n\n TSNode node = ts_node_parent(self);\n TSNode later_node = ts_node__null();\n bool later_node_is_relevant = false;\n\n while (!ts_node_is_null(node)) {\n TSNode later_child = ts_node__null();\n bool later_child_is_relevant = false;\n TSNode child_containing_target = ts_node__null();\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&node);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (iterator.position.bytes <= target_end_byte) continue;\n uint32_t start_byte = ts_node_start_byte(self);\n uint32_t child_start_byte = ts_node_start_byte(child);\n\n bool is_empty = start_byte == target_end_byte;\n bool contains_target = is_empty ?\n child_start_byte < start_byte :\n child_start_byte <= start_byte;\n\n if (contains_target) {\n if (ts_node__subtree(child).ptr != ts_node__subtree(self).ptr) {\n child_containing_target = child;\n }\n } else if (ts_node__is_relevant(child, include_anonymous)) {\n later_child = child;\n later_child_is_relevant = true;\n break;\n } else if (ts_node__relevant_child_count(child, include_anonymous) > 0) {\n later_child = child;\n later_child_is_relevant = false;\n break;\n }\n }\n\n if (!ts_node_is_null(child_containing_target)) {\n if (!ts_node_is_null(later_child)) {\n later_node = later_child;\n later_node_is_relevant = later_child_is_relevant;\n }\n node = child_containing_target;\n } else if (later_child_is_relevant) {\n return later_child;\n } else if (!ts_node_is_null(later_child)) {\n node = later_child;\n } else if (later_node_is_relevant) {\n return later_node;\n } else {\n node = later_node;\n }\n }\n\n return ts_node__null();\n}\n\nstatic inline TSNode ts_node__first_child_for_byte(\n TSNode self,\n uint32_t goal,\n bool include_anonymous\n) {\n TSNode node = self;\n bool did_descend = true;\n\n NodeChildIterator last_iterator;\n bool has_last_iterator = false;\n\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&node);\n loop:\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (ts_node_end_byte(child) > goal) {\n if (ts_node__is_relevant(child, include_anonymous)) {\n return child;\n } else if (ts_node_child_count(child) > 0) {\n if (iterator.child_index < ts_subtree_child_count(ts_node__subtree(child))) {\n last_iterator = iterator;\n has_last_iterator = true;\n }\n did_descend = true;\n node = child;\n break;\n }\n }\n }\n\n if (!did_descend && has_last_iterator) {\n iterator = last_iterator;\n has_last_iterator = false;\n goto loop;\n }\n }\n\n return ts_node__null();\n}\n\nstatic inline TSNode ts_node__descendant_for_byte_range(\n TSNode self,\n uint32_t range_start,\n uint32_t range_end,\n bool include_anonymous\n) {\n if (range_start > range_end) {\n return ts_node__null();\n }\n TSNode node = self;\n TSNode last_visible_node = self;\n\n bool did_descend = true;\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&node);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n uint32_t node_end = iterator.position.bytes;\n\n // The end of this node must extend far enough forward to touch\n // the end of the range\n if (node_end < range_end) continue;\n\n // ...and exceed the start of the range, unless the node itself is\n // empty, in which case it must at least be equal to the start of the range.\n bool is_empty = ts_node_start_byte(child) == node_end;\n if (is_empty ? node_end < range_start : node_end <= range_start) continue;\n\n // The start of this node must extend far enough backward to\n // touch the start of the range.\n if (range_start < ts_node_start_byte(child)) break;\n\n node = child;\n if (ts_node__is_relevant(node, include_anonymous)) {\n last_visible_node = node;\n }\n did_descend = true;\n break;\n }\n }\n\n return last_visible_node;\n}\n\nstatic inline TSNode ts_node__descendant_for_point_range(\n TSNode self,\n TSPoint range_start,\n TSPoint range_end,\n bool include_anonymous\n) {\n if (point_gt(range_start, range_end)) {\n return ts_node__null();\n }\n TSNode node = self;\n TSNode last_visible_node = self;\n\n bool did_descend = true;\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&node);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n TSPoint node_end = iterator.position.extent;\n\n // The end of this node must extend far enough forward to touch\n // the end of the range\n if (point_lt(node_end, range_end)) continue;\n\n // ...and exceed the start of the range, unless the node itself is\n // empty, in which case it must at least be equal to the start of the range.\n bool is_empty = point_eq(ts_node_start_point(child), node_end);\n if (is_empty ? point_lt(node_end, range_start) : point_lte(node_end, range_start)) {\n continue;\n }\n\n // The start of this node must extend far enough backward to\n // touch the start of the range.\n if (point_lt(range_start, ts_node_start_point(child))) break;\n\n node = child;\n if (ts_node__is_relevant(node, include_anonymous)) {\n last_visible_node = node;\n }\n did_descend = true;\n break;\n }\n }\n\n return last_visible_node;\n}\n\n// TSNode - public\n\nuint32_t ts_node_end_byte(TSNode self) {\n return ts_node_start_byte(self) + ts_subtree_size(ts_node__subtree(self)).bytes;\n}\n\nTSPoint ts_node_end_point(TSNode self) {\n return point_add(ts_node_start_point(self), ts_subtree_size(ts_node__subtree(self)).extent);\n}\n\nTSSymbol ts_node_symbol(TSNode self) {\n TSSymbol symbol = ts_node__alias(&self);\n if (!symbol) symbol = ts_subtree_symbol(ts_node__subtree(self));\n return ts_language_public_symbol(self.tree->language, symbol);\n}\n\nconst char *ts_node_type(TSNode self) {\n TSSymbol symbol = ts_node__alias(&self);\n if (!symbol) symbol = ts_subtree_symbol(ts_node__subtree(self));\n return ts_language_symbol_name(self.tree->language, symbol);\n}\n\nconst TSLanguage *ts_node_language(TSNode self) {\n return self.tree->language;\n}\n\nTSSymbol ts_node_grammar_symbol(TSNode self) {\n return ts_subtree_symbol(ts_node__subtree(self));\n}\n\nconst char *ts_node_grammar_type(TSNode self) {\n TSSymbol symbol = ts_subtree_symbol(ts_node__subtree(self));\n return ts_language_symbol_name(self.tree->language, symbol);\n}\n\nchar *ts_node_string(TSNode self) {\n TSSymbol alias_symbol = ts_node__alias(&self);\n return ts_subtree_string(\n ts_node__subtree(self),\n alias_symbol,\n ts_language_symbol_metadata(self.tree->language, alias_symbol).visible,\n self.tree->language,\n false\n );\n}\n\nbool ts_node_eq(TSNode self, TSNode other) {\n return self.tree == other.tree && self.id == other.id;\n}\n\nbool ts_node_is_null(TSNode self) {\n return self.id == 0;\n}\n\nbool ts_node_is_extra(TSNode self) {\n return ts_subtree_extra(ts_node__subtree(self));\n}\n\nbool ts_node_is_named(TSNode self) {\n TSSymbol alias = ts_node__alias(&self);\n return alias\n ? ts_language_symbol_metadata(self.tree->language, alias).named\n : ts_subtree_named(ts_node__subtree(self));\n}\n\nbool ts_node_is_missing(TSNode self) {\n return ts_subtree_missing(ts_node__subtree(self));\n}\n\nbool ts_node_has_changes(TSNode self) {\n return ts_subtree_has_changes(ts_node__subtree(self));\n}\n\nbool ts_node_has_error(TSNode self) {\n return ts_subtree_error_cost(ts_node__subtree(self)) > 0;\n}\n\nbool ts_node_is_error(TSNode self) {\n TSSymbol symbol = ts_node_symbol(self);\n return symbol == ts_builtin_sym_error;\n}\n\nuint32_t ts_node_descendant_count(TSNode self) {\n return ts_subtree_visible_descendant_count(ts_node__subtree(self)) + 1;\n}\n\nTSStateId ts_node_parse_state(TSNode self) {\n return ts_subtree_parse_state(ts_node__subtree(self));\n}\n\nTSStateId ts_node_next_parse_state(TSNode self) {\n const TSLanguage *language = self.tree->language;\n uint16_t state = ts_node_parse_state(self);\n if (state == TS_TREE_STATE_NONE) {\n return TS_TREE_STATE_NONE;\n }\n uint16_t symbol = ts_node_grammar_symbol(self);\n return ts_language_next_state(language, state, symbol);\n}\n\nTSNode ts_node_parent(TSNode self) {\n TSNode node = ts_tree_root_node(self.tree);\n if (node.id == self.id) return ts_node__null();\n\n while (true) {\n TSNode next_node = ts_node_child_with_descendant(node, self);\n if (next_node.id == self.id || ts_node_is_null(next_node)) break;\n node = next_node;\n }\n\n return node;\n}\n\nTSNode ts_node_child_with_descendant(TSNode self, TSNode descendant) {\n uint32_t start_byte = ts_node_start_byte(descendant);\n uint32_t end_byte = ts_node_end_byte(descendant);\n bool is_empty = start_byte == end_byte;\n\n do {\n NodeChildIterator iter = ts_node_iterate_children(&self);\n do {\n if (\n !ts_node_child_iterator_next(&iter, &self)\n || ts_node_start_byte(self) > start_byte\n ) {\n return ts_node__null();\n }\n if (self.id == descendant.id) {\n return self;\n }\n\n // If the descendant is empty, and the end byte is within `self`,\n // we check whether `self` contains it or not.\n if (is_empty && iter.position.bytes >= end_byte && ts_node_child_count(self) > 0) {\n TSNode child = ts_node_child_with_descendant(self, descendant);\n // If the child is not null, return self if it's relevant, else return the child\n if (!ts_node_is_null(child)) {\n return ts_node__is_relevant(self, true) ? self : child;\n }\n }\n } while ((is_empty ? iter.position.bytes <= end_byte : iter.position.bytes < end_byte) || ts_node_child_count(self) == 0);\n } while (!ts_node__is_relevant(self, true));\n\n return self;\n}\n\nTSNode ts_node_child(TSNode self, uint32_t child_index) {\n return ts_node__child(self, child_index, true);\n}\n\nTSNode ts_node_named_child(TSNode self, uint32_t child_index) {\n return ts_node__child(self, child_index, false);\n}\n\nTSNode ts_node_child_by_field_id(TSNode self, TSFieldId field_id) {\nrecur:\n if (!field_id || ts_node_child_count(self) == 0) return ts_node__null();\n\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(\n self.tree->language,\n ts_node__subtree(self).ptr->production_id,\n &field_map,\n &field_map_end\n );\n if (field_map == field_map_end) return ts_node__null();\n\n // The field mappings are sorted by their field id. Scan all\n // the mappings to find the ones for the given field id.\n while (field_map->field_id < field_id) {\n field_map++;\n if (field_map == field_map_end) return ts_node__null();\n }\n while (field_map_end[-1].field_id > field_id) {\n field_map_end--;\n if (field_map == field_map_end) return ts_node__null();\n }\n\n TSNode child;\n NodeChildIterator iterator = ts_node_iterate_children(&self);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (!ts_subtree_extra(ts_node__subtree(child))) {\n uint32_t index = iterator.structural_child_index - 1;\n if (index < field_map->child_index) continue;\n\n // Hidden nodes' fields are \"inherited\" by their visible parent.\n if (field_map->inherited) {\n\n // If this is the *last* possible child node for this field,\n // then perform a tail call to avoid recursion.\n if (field_map + 1 == field_map_end) {\n self = child;\n goto recur;\n }\n\n // Otherwise, descend into this child, but if it doesn't contain\n // the field, continue searching subsequent children.\n else {\n TSNode result = ts_node_child_by_field_id(child, field_id);\n if (result.id) return result;\n field_map++;\n if (field_map == field_map_end) return ts_node__null();\n }\n }\n\n else if (ts_node__is_relevant(child, true)) {\n return child;\n }\n\n // If the field refers to a hidden node with visible children,\n // return the first visible child.\n else if (ts_node_child_count(child) > 0 ) {\n return ts_node_child(child, 0);\n }\n\n // Otherwise, continue searching subsequent children.\n else {\n field_map++;\n if (field_map == field_map_end) return ts_node__null();\n }\n }\n }\n\n return ts_node__null();\n}\n\nstatic inline const char *ts_node__field_name_from_language(TSNode self, uint32_t structural_child_index) {\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(\n self.tree->language,\n ts_node__subtree(self).ptr->production_id,\n &field_map,\n &field_map_end\n );\n for (; field_map != field_map_end; field_map++) {\n if (!field_map->inherited && field_map->child_index == structural_child_index) {\n return self.tree->language->field_names[field_map->field_id];\n }\n }\n return NULL;\n}\n\nconst char *ts_node_field_name_for_child(TSNode self, uint32_t child_index) {\n TSNode result = self;\n bool did_descend = true;\n const char *inherited_field_name = NULL;\n\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n uint32_t index = 0;\n NodeChildIterator iterator = ts_node_iterate_children(&result);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (ts_node__is_relevant(child, true)) {\n if (index == child_index) {\n if (ts_node_is_extra(child)) {\n return NULL;\n }\n const char *field_name = ts_node__field_name_from_language(result, iterator.structural_child_index - 1);\n if (field_name) return field_name;\n return inherited_field_name;\n }\n index++;\n } else {\n uint32_t grandchild_index = child_index - index;\n uint32_t grandchild_count = ts_node__relevant_child_count(child, true);\n if (grandchild_index < grandchild_count) {\n const char *field_name = ts_node__field_name_from_language(result, iterator.structural_child_index - 1);\n if (field_name) inherited_field_name = field_name;\n\n did_descend = true;\n result = child;\n child_index = grandchild_index;\n break;\n }\n index += grandchild_count;\n }\n }\n }\n\n return NULL;\n}\n\nconst char *ts_node_field_name_for_named_child(TSNode self, uint32_t named_child_index) {\n TSNode result = self;\n bool did_descend = true;\n const char *inherited_field_name = NULL;\n\n while (did_descend) {\n did_descend = false;\n\n TSNode child;\n uint32_t index = 0;\n NodeChildIterator iterator = ts_node_iterate_children(&result);\n while (ts_node_child_iterator_next(&iterator, &child)) {\n if (ts_node__is_relevant(child, false)) {\n if (index == named_child_index) {\n if (ts_node_is_extra(child)) {\n return NULL;\n }\n const char *field_name = ts_node__field_name_from_language(result, iterator.structural_child_index - 1);\n if (field_name) return field_name;\n return inherited_field_name;\n }\n index++;\n } else {\n uint32_t named_grandchild_index = named_child_index - index;\n uint32_t grandchild_count = ts_node__relevant_child_count(child, false);\n if (named_grandchild_index < grandchild_count) {\n const char *field_name = ts_node__field_name_from_language(result, iterator.structural_child_index - 1);\n if (field_name) inherited_field_name = field_name;\n\n did_descend = true;\n result = child;\n named_child_index = named_grandchild_index;\n break;\n }\n index += grandchild_count;\n }\n }\n }\n\n return NULL;\n}\n\nTSNode ts_node_child_by_field_name(\n TSNode self,\n const char *name,\n uint32_t name_length\n) {\n TSFieldId field_id = ts_language_field_id_for_name(\n self.tree->language,\n name,\n name_length\n );\n return ts_node_child_by_field_id(self, field_id);\n}\n\nuint32_t ts_node_child_count(TSNode self) {\n Subtree tree = ts_node__subtree(self);\n if (ts_subtree_child_count(tree) > 0) {\n return tree.ptr->visible_child_count;\n } else {\n return 0;\n }\n}\n\nuint32_t ts_node_named_child_count(TSNode self) {\n Subtree tree = ts_node__subtree(self);\n if (ts_subtree_child_count(tree) > 0) {\n return tree.ptr->named_child_count;\n } else {\n return 0;\n }\n}\n\nTSNode ts_node_next_sibling(TSNode self) {\n return ts_node__next_sibling(self, true);\n}\n\nTSNode ts_node_next_named_sibling(TSNode self) {\n return ts_node__next_sibling(self, false);\n}\n\nTSNode ts_node_prev_sibling(TSNode self) {\n return ts_node__prev_sibling(self, true);\n}\n\nTSNode ts_node_prev_named_sibling(TSNode self) {\n return ts_node__prev_sibling(self, false);\n}\n\nTSNode ts_node_first_child_for_byte(TSNode self, uint32_t byte) {\n return ts_node__first_child_for_byte(self, byte, true);\n}\n\nTSNode ts_node_first_named_child_for_byte(TSNode self, uint32_t byte) {\n return ts_node__first_child_for_byte(self, byte, false);\n}\n\nTSNode ts_node_descendant_for_byte_range(\n TSNode self,\n uint32_t start,\n uint32_t end\n) {\n return ts_node__descendant_for_byte_range(self, start, end, true);\n}\n\nTSNode ts_node_named_descendant_for_byte_range(\n TSNode self,\n uint32_t start,\n uint32_t end\n) {\n return ts_node__descendant_for_byte_range(self, start, end, false);\n}\n\nTSNode ts_node_descendant_for_point_range(\n TSNode self,\n TSPoint start,\n TSPoint end\n) {\n return ts_node__descendant_for_point_range(self, start, end, true);\n}\n\nTSNode ts_node_named_descendant_for_point_range(\n TSNode self,\n TSPoint start,\n TSPoint end\n) {\n return ts_node__descendant_for_point_range(self, start, end, false);\n}\n\nvoid ts_node_edit(TSNode *self, const TSInputEdit *edit) {\n uint32_t start_byte = ts_node_start_byte(*self);\n TSPoint start_point = ts_node_start_point(*self);\n\n ts_point_edit(&start_point, &start_byte, edit);\n\n self->context[0] = start_byte;\n self->context[1] = start_point.row;\n self->context[2] = start_point.column;\n}\n",
40
- "#include \"tree_sitter/api.h\"\n#include \"./array.h\"\n#include \"./get_changed_ranges.h\"\n#include \"./length.h\"\n#include \"./subtree.h\"\n#include \"./tree_cursor.h\"\n#include \"./tree.h\"\n\nTSTree *ts_tree_new(\n Subtree root, const TSLanguage *language,\n const TSRange *included_ranges, unsigned included_range_count\n) {\n TSTree *result = ts_malloc(sizeof(TSTree));\n result->root = root;\n result->language = ts_language_copy(language);\n result->included_ranges = ts_calloc(included_range_count, sizeof(TSRange));\n memcpy(result->included_ranges, included_ranges, included_range_count * sizeof(TSRange));\n result->included_range_count = included_range_count;\n return result;\n}\n\nTSTree *ts_tree_copy(const TSTree *self) {\n ts_subtree_retain(self->root);\n return ts_tree_new(self->root, self->language, self->included_ranges, self->included_range_count);\n}\n\nvoid ts_tree_delete(TSTree *self) {\n if (!self) return;\n\n SubtreePool pool = ts_subtree_pool_new(0);\n ts_subtree_release(&pool, self->root);\n ts_subtree_pool_delete(&pool);\n ts_language_delete(self->language);\n ts_free(self->included_ranges);\n ts_free(self);\n}\n\nTSNode ts_tree_root_node(const TSTree *self) {\n return ts_node_new(self, &self->root, ts_subtree_padding(self->root), 0);\n}\n\nTSNode ts_tree_root_node_with_offset(\n const TSTree *self,\n uint32_t offset_bytes,\n TSPoint offset_extent\n) {\n Length offset = {offset_bytes, offset_extent};\n return ts_node_new(self, &self->root, length_add(offset, ts_subtree_padding(self->root)), 0);\n}\n\nconst TSLanguage *ts_tree_language(const TSTree *self) {\n return self->language;\n}\n\nvoid ts_tree_edit(TSTree *self, const TSInputEdit *edit) {\n for (unsigned i = 0; i < self->included_range_count; i++) {\n ts_range_edit(&self->included_ranges[i], edit);\n }\n\n SubtreePool pool = ts_subtree_pool_new(0);\n self->root = ts_subtree_edit(self->root, edit, &pool);\n ts_subtree_pool_delete(&pool);\n}\n\nTSRange *ts_tree_included_ranges(const TSTree *self, uint32_t *length) {\n *length = self->included_range_count;\n TSRange *ranges = ts_calloc(self->included_range_count, sizeof(TSRange));\n memcpy(ranges, self->included_ranges, self->included_range_count * sizeof(TSRange));\n return ranges;\n}\n\nTSRange *ts_tree_get_changed_ranges(const TSTree *old_tree, const TSTree *new_tree, uint32_t *length) {\n TreeCursor cursor1 = {NULL, array_new(), 0};\n TreeCursor cursor2 = {NULL, array_new(), 0};\n ts_tree_cursor_init(&cursor1, ts_tree_root_node(old_tree));\n ts_tree_cursor_init(&cursor2, ts_tree_root_node(new_tree));\n\n TSRangeArray included_range_differences = array_new();\n ts_range_array_get_changed_ranges(\n old_tree->included_ranges, old_tree->included_range_count,\n new_tree->included_ranges, new_tree->included_range_count,\n &included_range_differences\n );\n\n TSRange *result;\n *length = ts_subtree_get_changed_ranges(\n &old_tree->root, &new_tree->root, &cursor1, &cursor2,\n old_tree->language, &included_range_differences, &result\n );\n\n array_delete(&included_range_differences);\n array_delete(&cursor1.stack);\n array_delete(&cursor2.stack);\n return result;\n}\n\n#ifdef _WIN32\n\n#include <io.h>\n#include <windows.h>\n\nint _ts_dup(HANDLE handle) {\n HANDLE dup_handle;\n if (!DuplicateHandle(\n GetCurrentProcess(), handle,\n GetCurrentProcess(), &dup_handle,\n 0, FALSE, DUPLICATE_SAME_ACCESS\n )) return -1;\n\n return _open_osfhandle((intptr_t)dup_handle, 0);\n}\n\nvoid ts_tree_print_dot_graph(const TSTree *self, int fd) {\n FILE *file = _fdopen(_ts_dup((HANDLE)_get_osfhandle(fd)), \"a\");\n ts_subtree_print_dot_graph(self->root, self->language, file);\n fclose(file);\n}\n\n#elif !defined(__wasm__) // Wasm doesn't support dup\n\n#include <unistd.h>\n\nint _ts_dup(int file_descriptor) {\n return dup(file_descriptor);\n}\n\nvoid ts_tree_print_dot_graph(const TSTree *self, int file_descriptor) {\n FILE *file = fdopen(_ts_dup(file_descriptor), \"a\");\n ts_subtree_print_dot_graph(self->root, self->language, file);\n fclose(file);\n}\n\n#else\n\nvoid ts_tree_print_dot_graph(const TSTree *self, int file_descriptor) {\n (void)self;\n (void)file_descriptor;\n}\n\n#endif\n",
41
- "#include \"point.h\"\n\nvoid ts_point_edit(TSPoint *point, uint32_t *byte, const TSInputEdit *edit) {\n uint32_t start_byte = *byte;\n TSPoint start_point = *point;\n\n if (start_byte >= edit->old_end_byte) {\n start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte);\n start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point));\n } else if (start_byte > edit->start_byte) {\n start_byte = edit->new_end_byte;\n start_point = edit->new_end_point;\n }\n\n *point = start_point;\n *byte = start_byte;\n}\n",
42
- "#include <stdio.h>\n#include <limits.h>\n#include <stdbool.h>\n#include <inttypes.h>\n#include \"tree_sitter/api.h\"\n#include \"./alloc.h\"\n#include \"./array.h\"\n#include \"./error_costs.h\"\n#include \"./get_changed_ranges.h\"\n#include \"./language.h\"\n#include \"./length.h\"\n#include \"./lexer.h\"\n#include \"./reduce_action.h\"\n#include \"./reusable_node.h\"\n#include \"./stack.h\"\n#include \"./subtree.h\"\n#include \"./tree.h\"\n#include \"./ts_assert.h\"\n#include \"./wasm_store.h\"\n\n#define LOG(...) \\\n if (self->lexer.logger.log || self->dot_graph_file) { \\\n snprintf(self->lexer.debug_buffer, TREE_SITTER_SERIALIZATION_BUFFER_SIZE, __VA_ARGS__); \\\n ts_parser__log(self); \\\n }\n\n#define LOG_LOOKAHEAD(symbol_name, size) \\\n if (self->lexer.logger.log || self->dot_graph_file) { \\\n char *buf = self->lexer.debug_buffer; \\\n const char *symbol = symbol_name; \\\n int off = snprintf( \\\n buf, \\\n TREE_SITTER_SERIALIZATION_BUFFER_SIZE, \\\n \"lexed_lookahead sym:\" \\\n ); \\\n for ( \\\n int i = 0; \\\n symbol[i] != '\\0' \\\n && off < TREE_SITTER_SERIALIZATION_BUFFER_SIZE; \\\n i++ \\\n ) { \\\n switch (symbol[i]) { \\\n case '\\t': buf[off++] = '\\\\'; buf[off++] = 't'; break; \\\n case '\\n': buf[off++] = '\\\\'; buf[off++] = 'n'; break; \\\n case '\\v': buf[off++] = '\\\\'; buf[off++] = 'v'; break; \\\n case '\\f': buf[off++] = '\\\\'; buf[off++] = 'f'; break; \\\n case '\\r': buf[off++] = '\\\\'; buf[off++] = 'r'; break; \\\n case '\\\\': buf[off++] = '\\\\'; buf[off++] = '\\\\'; break; \\\n default: buf[off++] = symbol[i]; break; \\\n } \\\n } \\\n snprintf( \\\n buf + off, \\\n TREE_SITTER_SERIALIZATION_BUFFER_SIZE - off, \\\n \", size:%u\", \\\n size \\\n ); \\\n ts_parser__log(self); \\\n }\n\n#define LOG_STACK() \\\n if (self->dot_graph_file) { \\\n ts_stack_print_dot_graph(self->stack, self->language, self->dot_graph_file); \\\n fputs(\"\\n\\n\", self->dot_graph_file); \\\n }\n\n#define LOG_TREE(tree) \\\n if (self->dot_graph_file) { \\\n ts_subtree_print_dot_graph(tree, self->language, self->dot_graph_file); \\\n fputs(\"\\n\", self->dot_graph_file); \\\n }\n\n#define SYM_NAME(symbol) ts_language_symbol_name(self->language, symbol)\n\n#define TREE_NAME(tree) SYM_NAME(ts_subtree_symbol(tree))\n\nstatic const unsigned MAX_VERSION_COUNT = 6;\nstatic const unsigned MAX_VERSION_COUNT_OVERFLOW = 4;\nstatic const unsigned MAX_SUMMARY_DEPTH = 16;\nstatic const unsigned MAX_COST_DIFFERENCE = 18 * ERROR_COST_PER_SKIPPED_TREE;\nstatic const unsigned OP_COUNT_PER_PARSER_CALLBACK_CHECK = 100;\n\ntypedef struct {\n Subtree token;\n Subtree last_external_token;\n uint32_t byte_index;\n} TokenCache;\n\nstruct TSParser {\n Lexer lexer;\n Stack *stack;\n SubtreePool tree_pool;\n const TSLanguage *language;\n TSWasmStore *wasm_store;\n ReduceActionSet reduce_actions;\n Subtree finished_tree;\n SubtreeArray trailing_extras;\n SubtreeArray trailing_extras2;\n SubtreeArray scratch_trees;\n TokenCache token_cache;\n ReusableNode reusable_node;\n void *external_scanner_payload;\n FILE *dot_graph_file;\n unsigned accept_count;\n unsigned operation_count;\n Subtree old_tree;\n TSRangeArray included_range_differences;\n TSParseOptions parse_options;\n TSParseState parse_state;\n unsigned included_range_difference_index;\n bool has_scanner_error;\n bool canceled_balancing;\n bool has_error;\n};\n\ntypedef struct {\n unsigned cost;\n unsigned node_count;\n int dynamic_precedence;\n bool is_in_error;\n} ErrorStatus;\n\ntypedef enum {\n ErrorComparisonTakeLeft,\n ErrorComparisonPreferLeft,\n ErrorComparisonNone,\n ErrorComparisonPreferRight,\n ErrorComparisonTakeRight,\n} ErrorComparison;\n\ntypedef struct {\n const char *string;\n uint32_t length;\n} TSStringInput;\n\n// StringInput\n\nstatic const char *ts_string_input_read(\n void *_self,\n uint32_t byte,\n TSPoint point,\n uint32_t *length\n) {\n (void)point;\n TSStringInput *self = (TSStringInput *)_self;\n if (byte >= self->length) {\n *length = 0;\n return \"\";\n } else {\n *length = self->length - byte;\n return self->string + byte;\n }\n}\n\n// Parser - Private\n\nstatic void ts_parser__log(TSParser *self) {\n if (self->lexer.logger.log) {\n self->lexer.logger.log(\n self->lexer.logger.payload,\n TSLogTypeParse,\n self->lexer.debug_buffer\n );\n }\n\n if (self->dot_graph_file) {\n fprintf(self->dot_graph_file, \"graph {\\nlabel=\\\"\");\n for (char *chr = &self->lexer.debug_buffer[0]; *chr != 0; chr++) {\n if (*chr == '\"' || *chr == '\\\\') fputc('\\\\', self->dot_graph_file);\n fputc(*chr, self->dot_graph_file);\n }\n fprintf(self->dot_graph_file, \"\\\"\\n}\\n\\n\");\n }\n}\n\nstatic bool ts_parser__breakdown_top_of_stack(\n TSParser *self,\n StackVersion version\n) {\n bool did_break_down = false;\n bool pending = false;\n\n do {\n StackSliceArray pop = ts_stack_pop_pending(self->stack, version);\n if (!pop.size) break;\n\n did_break_down = true;\n pending = false;\n for (uint32_t i = 0; i < pop.size; i++) {\n StackSlice slice = *array_get(&pop, i);\n TSStateId state = ts_stack_state(self->stack, slice.version);\n Subtree parent = *array_front(&slice.subtrees);\n\n for (uint32_t j = 0, n = ts_subtree_child_count(parent); j < n; j++) {\n Subtree child = ts_subtree_children(parent)[j];\n pending = ts_subtree_child_count(child) > 0;\n\n if (ts_subtree_is_error(child)) {\n state = ERROR_STATE;\n } else if (!ts_subtree_extra(child)) {\n state = ts_language_next_state(self->language, state, ts_subtree_symbol(child));\n }\n\n ts_subtree_retain(child);\n ts_stack_push(self->stack, slice.version, child, pending, state);\n }\n\n for (uint32_t j = 1; j < slice.subtrees.size; j++) {\n Subtree tree = *array_get(&slice.subtrees, j);\n ts_stack_push(self->stack, slice.version, tree, false, state);\n }\n\n ts_subtree_release(&self->tree_pool, parent);\n array_delete(&slice.subtrees);\n\n LOG(\"breakdown_top_of_stack tree:%s\", TREE_NAME(parent));\n LOG_STACK();\n }\n } while (pending);\n\n return did_break_down;\n}\n\nstatic void ts_parser__breakdown_lookahead(\n TSParser *self,\n Subtree *lookahead,\n TSStateId state,\n ReusableNode *reusable_node\n) {\n bool did_descend = false;\n Subtree tree = reusable_node_tree(reusable_node);\n while (ts_subtree_child_count(tree) > 0 && ts_subtree_parse_state(tree) != state) {\n LOG(\"state_mismatch sym:%s\", TREE_NAME(tree));\n reusable_node_descend(reusable_node);\n tree = reusable_node_tree(reusable_node);\n did_descend = true;\n }\n\n if (did_descend) {\n ts_subtree_release(&self->tree_pool, *lookahead);\n *lookahead = tree;\n ts_subtree_retain(*lookahead);\n }\n}\n\nstatic ErrorComparison ts_parser__compare_versions(\n TSParser *self,\n ErrorStatus a,\n ErrorStatus b\n) {\n (void)self;\n if (!a.is_in_error && b.is_in_error) {\n if (a.cost < b.cost) {\n return ErrorComparisonTakeLeft;\n } else {\n return ErrorComparisonPreferLeft;\n }\n }\n\n if (a.is_in_error && !b.is_in_error) {\n if (b.cost < a.cost) {\n return ErrorComparisonTakeRight;\n } else {\n return ErrorComparisonPreferRight;\n }\n }\n\n if (a.cost < b.cost) {\n if ((b.cost - a.cost) * (1 + a.node_count) > MAX_COST_DIFFERENCE) {\n return ErrorComparisonTakeLeft;\n } else {\n return ErrorComparisonPreferLeft;\n }\n }\n\n if (b.cost < a.cost) {\n if ((a.cost - b.cost) * (1 + b.node_count) > MAX_COST_DIFFERENCE) {\n return ErrorComparisonTakeRight;\n } else {\n return ErrorComparisonPreferRight;\n }\n }\n\n if (a.dynamic_precedence > b.dynamic_precedence) return ErrorComparisonPreferLeft;\n if (b.dynamic_precedence > a.dynamic_precedence) return ErrorComparisonPreferRight;\n return ErrorComparisonNone;\n}\n\nstatic ErrorStatus ts_parser__version_status(\n TSParser *self,\n StackVersion version\n) {\n unsigned cost = ts_stack_error_cost(self->stack, version);\n bool is_paused = ts_stack_is_paused(self->stack, version);\n if (is_paused) cost += ERROR_COST_PER_SKIPPED_TREE;\n return (ErrorStatus) {\n .cost = cost,\n .node_count = ts_stack_node_count_since_error(self->stack, version),\n .dynamic_precedence = ts_stack_dynamic_precedence(self->stack, version),\n .is_in_error = is_paused || ts_stack_state(self->stack, version) == ERROR_STATE\n };\n}\n\nstatic bool ts_parser__better_version_exists(\n TSParser *self,\n StackVersion version,\n bool is_in_error,\n unsigned cost\n) {\n if (self->finished_tree.ptr && ts_subtree_error_cost(self->finished_tree) <= cost) {\n return true;\n }\n\n Length position = ts_stack_position(self->stack, version);\n ErrorStatus status = {\n .cost = cost,\n .is_in_error = is_in_error,\n .dynamic_precedence = ts_stack_dynamic_precedence(self->stack, version),\n .node_count = ts_stack_node_count_since_error(self->stack, version),\n };\n\n for (StackVersion i = 0, n = ts_stack_version_count(self->stack); i < n; i++) {\n if (i == version ||\n !ts_stack_is_active(self->stack, i) ||\n ts_stack_position(self->stack, i).bytes < position.bytes) continue;\n ErrorStatus status_i = ts_parser__version_status(self, i);\n switch (ts_parser__compare_versions(self, status, status_i)) {\n case ErrorComparisonTakeRight:\n return true;\n case ErrorComparisonPreferRight:\n if (ts_stack_can_merge(self->stack, i, version)) return true;\n break;\n default:\n break;\n }\n }\n\n return false;\n}\n\nstatic bool ts_parser__call_main_lex_fn(TSParser *self, TSLexerMode lex_mode) {\n if (ts_language_is_wasm(self->language)) {\n return ts_wasm_store_call_lex_main(self->wasm_store, lex_mode.lex_state);\n } else {\n return self->language->lex_fn(&self->lexer.data, lex_mode.lex_state);\n }\n}\n\nstatic bool ts_parser__call_keyword_lex_fn(TSParser *self) {\n if (ts_language_is_wasm(self->language)) {\n return ts_wasm_store_call_lex_keyword(self->wasm_store, 0);\n } else {\n return self->language->keyword_lex_fn(&self->lexer.data, 0);\n }\n}\n\nstatic void ts_parser__external_scanner_create(\n TSParser *self\n) {\n if (self->language && self->language->external_scanner.states) {\n if (ts_language_is_wasm(self->language)) {\n self->external_scanner_payload = (void *)(uintptr_t)ts_wasm_store_call_scanner_create(\n self->wasm_store\n );\n if (ts_wasm_store_has_error(self->wasm_store)) {\n self->has_scanner_error = true;\n }\n } else if (self->language->external_scanner.create) {\n self->external_scanner_payload = self->language->external_scanner.create();\n }\n }\n}\n\nstatic void ts_parser__external_scanner_destroy(\n TSParser *self\n) {\n if (\n self->language &&\n self->external_scanner_payload &&\n self->language->external_scanner.destroy &&\n !ts_language_is_wasm(self->language)\n ) {\n self->language->external_scanner.destroy(\n self->external_scanner_payload\n );\n }\n self->external_scanner_payload = NULL;\n}\n\nstatic unsigned ts_parser__external_scanner_serialize(\n TSParser *self\n) {\n uint32_t length;\n if (ts_language_is_wasm(self->language)) {\n length = ts_wasm_store_call_scanner_serialize(\n self->wasm_store,\n (uintptr_t)self->external_scanner_payload,\n self->lexer.debug_buffer\n );\n if (ts_wasm_store_has_error(self->wasm_store)) {\n self->has_scanner_error = true;\n }\n } else {\n length = self->language->external_scanner.serialize(\n self->external_scanner_payload,\n self->lexer.debug_buffer\n );\n }\n ts_assert(length <= TREE_SITTER_SERIALIZATION_BUFFER_SIZE);\n return length;\n}\n\nstatic void ts_parser__external_scanner_deserialize(\n TSParser *self,\n Subtree external_token\n) {\n const char *data = NULL;\n uint32_t length = 0;\n if (external_token.ptr) {\n data = ts_external_scanner_state_data(&external_token.ptr->external_scanner_state);\n length = external_token.ptr->external_scanner_state.length;\n }\n\n if (ts_language_is_wasm(self->language)) {\n ts_wasm_store_call_scanner_deserialize(\n self->wasm_store,\n (uintptr_t)self->external_scanner_payload,\n data,\n length\n );\n if (ts_wasm_store_has_error(self->wasm_store)) {\n self->has_scanner_error = true;\n }\n } else {\n self->language->external_scanner.deserialize(\n self->external_scanner_payload,\n data,\n length\n );\n }\n}\n\nstatic bool ts_parser__external_scanner_scan(\n TSParser *self,\n TSStateId external_lex_state\n) {\n if (ts_language_is_wasm(self->language)) {\n bool result = ts_wasm_store_call_scanner_scan(\n self->wasm_store,\n (uintptr_t)self->external_scanner_payload,\n external_lex_state * self->language->external_token_count\n );\n if (ts_wasm_store_has_error(self->wasm_store)) {\n self->has_scanner_error = true;\n }\n return result;\n } else {\n const bool *valid_external_tokens = ts_language_enabled_external_tokens(\n self->language,\n external_lex_state\n );\n return self->language->external_scanner.scan(\n self->external_scanner_payload,\n &self->lexer.data,\n valid_external_tokens\n );\n }\n}\n\nstatic bool ts_parser__can_reuse_first_leaf(\n TSParser *self,\n TSStateId state,\n Subtree tree,\n TableEntry *table_entry\n) {\n TSSymbol leaf_symbol = ts_subtree_leaf_symbol(tree);\n TSStateId leaf_state = ts_subtree_leaf_parse_state(tree);\n TSLexerMode current_lex_mode = ts_language_lex_mode_for_state(self->language, state);\n TSLexerMode leaf_lex_mode = ts_language_lex_mode_for_state(self->language, leaf_state);\n\n // At the end of a non-terminal extra node, the lexer normally returns\n // NULL, which indicates that the parser should look for a reduce action\n // at symbol `0`. Avoid reusing tokens in this situation to ensure that\n // the same thing happens when incrementally reparsing.\n if (current_lex_mode.lex_state == (uint16_t)(-1)) return false;\n\n // If the token was created in a state with the same set of lookaheads, it is reusable.\n if (\n table_entry->action_count > 0 &&\n memcmp(&leaf_lex_mode, &current_lex_mode, sizeof(TSLexerMode)) == 0 &&\n (\n leaf_symbol != self->language->keyword_capture_token ||\n (!ts_subtree_is_keyword(tree) && ts_subtree_parse_state(tree) == state)\n )\n ) return true;\n\n // Empty tokens are not reusable in states with different lookaheads.\n if (ts_subtree_size(tree).bytes == 0 && leaf_symbol != ts_builtin_sym_end) return false;\n\n // If the current state allows external tokens or other tokens that conflict with this\n // token, this token is not reusable.\n return current_lex_mode.external_lex_state == 0 && table_entry->is_reusable;\n}\n\nstatic Subtree ts_parser__lex(\n TSParser *self,\n StackVersion version,\n TSStateId parse_state\n) {\n TSLexerMode lex_mode = ts_language_lex_mode_for_state(self->language, parse_state);\n if (lex_mode.lex_state == (uint16_t)-1) {\n LOG(\"no_lookahead_after_non_terminal_extra\");\n return NULL_SUBTREE;\n }\n\n const Length start_position = ts_stack_position(self->stack, version);\n const Subtree external_token = ts_stack_last_external_token(self->stack, version);\n\n bool found_external_token = false;\n bool error_mode = parse_state == ERROR_STATE;\n bool skipped_error = false;\n bool called_get_column = false;\n int32_t first_error_character = 0;\n Length error_start_position = length_zero();\n Length error_end_position = length_zero();\n uint32_t lookahead_end_byte = 0;\n uint32_t external_scanner_state_len = 0;\n bool external_scanner_state_changed = false;\n ts_lexer_reset(&self->lexer, start_position);\n\n for (;;) {\n bool found_token = false;\n Length current_position = self->lexer.current_position;\n ColumnData column_data = self->lexer.column_data;\n\n if (lex_mode.external_lex_state != 0) {\n LOG(\n \"lex_external state:%d, row:%u, column:%u\",\n lex_mode.external_lex_state,\n current_position.extent.row,\n current_position.extent.column\n );\n ts_lexer_start(&self->lexer);\n ts_parser__external_scanner_deserialize(self, external_token);\n found_token = ts_parser__external_scanner_scan(self, lex_mode.external_lex_state);\n if (self->has_scanner_error) return NULL_SUBTREE;\n ts_lexer_finish(&self->lexer, &lookahead_end_byte);\n\n if (found_token) {\n external_scanner_state_len = ts_parser__external_scanner_serialize(self);\n external_scanner_state_changed = !ts_external_scanner_state_eq(\n ts_subtree_external_scanner_state(external_token),\n self->lexer.debug_buffer,\n external_scanner_state_len\n );\n\n // Avoid infinite loops caused by the external scanner returning empty tokens.\n // Empty tokens are needed in some circumstances, e.g. indent/dedent tokens\n // in Python. Ignore the following classes of empty tokens:\n //\n // * Tokens produced during error recovery. When recovering from an error,\n // all tokens are allowed, so it's easy to accidentally return unwanted\n // empty tokens.\n // * Tokens that are marked as 'extra' in the grammar. These don't change\n // the parse state, so they would definitely cause an infinite loop.\n if (\n self->lexer.token_end_position.bytes <= current_position.bytes &&\n !external_scanner_state_changed\n ) {\n TSSymbol symbol = self->language->external_scanner.symbol_map[self->lexer.data.result_symbol];\n TSStateId next_parse_state = ts_language_next_state(self->language, parse_state, symbol);\n bool token_is_extra = (next_parse_state == parse_state);\n if (error_mode || !ts_stack_has_advanced_since_error(self->stack, version) || token_is_extra) {\n LOG(\n \"ignore_empty_external_token symbol:%s\",\n SYM_NAME(self->language->external_scanner.symbol_map[self->lexer.data.result_symbol])\n );\n found_token = false;\n }\n }\n }\n\n if (found_token) {\n found_external_token = true;\n called_get_column = self->lexer.did_get_column;\n break;\n }\n\n ts_lexer_reset(&self->lexer, current_position);\n self->lexer.column_data = column_data;\n }\n\n LOG(\n \"lex_internal state:%d, row:%u, column:%u\",\n lex_mode.lex_state,\n current_position.extent.row,\n current_position.extent.column\n );\n ts_lexer_start(&self->lexer);\n found_token = ts_parser__call_main_lex_fn(self, lex_mode);\n ts_lexer_finish(&self->lexer, &lookahead_end_byte);\n if (found_token) break;\n\n if (!error_mode) {\n error_mode = true;\n lex_mode = ts_language_lex_mode_for_state(self->language, ERROR_STATE);\n ts_lexer_reset(&self->lexer, start_position);\n continue;\n }\n\n if (!skipped_error) {\n LOG(\"skip_unrecognized_character\");\n skipped_error = true;\n error_start_position = self->lexer.token_start_position;\n error_end_position = self->lexer.token_start_position;\n first_error_character = self->lexer.data.lookahead;\n }\n\n if (self->lexer.current_position.bytes == error_end_position.bytes) {\n if (self->lexer.data.eof(&self->lexer.data)) {\n self->lexer.data.result_symbol = ts_builtin_sym_error;\n break;\n }\n self->lexer.data.advance(&self->lexer.data, false);\n }\n\n error_end_position = self->lexer.current_position;\n }\n\n Subtree result;\n if (skipped_error) {\n Length padding = length_sub(error_start_position, start_position);\n Length size = length_sub(error_end_position, error_start_position);\n uint32_t lookahead_bytes = lookahead_end_byte - error_end_position.bytes;\n result = ts_subtree_new_error(\n &self->tree_pool,\n first_error_character,\n padding,\n size,\n lookahead_bytes,\n parse_state,\n self->language\n );\n } else {\n bool is_keyword = false;\n TSSymbol symbol = self->lexer.data.result_symbol;\n Length padding = length_sub(self->lexer.token_start_position, start_position);\n Length size = length_sub(self->lexer.token_end_position, self->lexer.token_start_position);\n uint32_t lookahead_bytes = lookahead_end_byte - self->lexer.token_end_position.bytes;\n\n if (found_external_token) {\n symbol = self->language->external_scanner.symbol_map[symbol];\n } else if (symbol == self->language->keyword_capture_token && symbol != 0) {\n uint32_t end_byte = self->lexer.token_end_position.bytes;\n ts_lexer_reset(&self->lexer, self->lexer.token_start_position);\n ts_lexer_start(&self->lexer);\n\n is_keyword = ts_parser__call_keyword_lex_fn(self);\n\n if (\n is_keyword &&\n self->lexer.token_end_position.bytes == end_byte &&\n (\n ts_language_has_actions(self->language, parse_state, self->lexer.data.result_symbol) ||\n ts_language_is_reserved_word(self->language, parse_state, self->lexer.data.result_symbol)\n )\n ) {\n symbol = self->lexer.data.result_symbol;\n }\n }\n\n result = ts_subtree_new_leaf(\n &self->tree_pool,\n symbol,\n padding,\n size,\n lookahead_bytes,\n parse_state,\n found_external_token,\n called_get_column,\n is_keyword,\n self->language\n );\n\n if (found_external_token) {\n MutableSubtree mut_result = ts_subtree_to_mut_unsafe(result);\n ts_external_scanner_state_init(\n &mut_result.ptr->external_scanner_state,\n self->lexer.debug_buffer,\n external_scanner_state_len\n );\n mut_result.ptr->has_external_scanner_state_change = external_scanner_state_changed;\n }\n }\n\n LOG_LOOKAHEAD(\n SYM_NAME(ts_subtree_symbol(result)),\n ts_subtree_total_size(result).bytes\n );\n return result;\n}\n\nstatic Subtree ts_parser__get_cached_token(\n TSParser *self,\n TSStateId state,\n size_t position,\n Subtree last_external_token,\n TableEntry *table_entry\n) {\n TokenCache *cache = &self->token_cache;\n if (\n cache->token.ptr && cache->byte_index == position &&\n ts_subtree_external_scanner_state_eq(cache->last_external_token, last_external_token)\n ) {\n ts_language_table_entry(self->language, state, ts_subtree_symbol(cache->token), table_entry);\n if (ts_parser__can_reuse_first_leaf(self, state, cache->token, table_entry)) {\n ts_subtree_retain(cache->token);\n return cache->token;\n }\n }\n return NULL_SUBTREE;\n}\n\nstatic void ts_parser__set_cached_token(\n TSParser *self,\n uint32_t byte_index,\n Subtree last_external_token,\n Subtree token\n) {\n TokenCache *cache = &self->token_cache;\n if (token.ptr) ts_subtree_retain(token);\n if (last_external_token.ptr) ts_subtree_retain(last_external_token);\n if (cache->token.ptr) ts_subtree_release(&self->tree_pool, cache->token);\n if (cache->last_external_token.ptr) ts_subtree_release(&self->tree_pool, cache->last_external_token);\n cache->token = token;\n cache->byte_index = byte_index;\n cache->last_external_token = last_external_token;\n}\n\nstatic bool ts_parser__has_included_range_difference(\n const TSParser *self,\n uint32_t start_position,\n uint32_t end_position\n) {\n return ts_range_array_intersects(\n &self->included_range_differences,\n self->included_range_difference_index,\n start_position,\n end_position\n );\n}\n\nstatic Subtree ts_parser__reuse_node(\n TSParser *self,\n StackVersion version,\n TSStateId *state,\n uint32_t position,\n Subtree last_external_token,\n TableEntry *table_entry\n) {\n Subtree result;\n while ((result = reusable_node_tree(&self->reusable_node)).ptr) {\n uint32_t byte_offset = reusable_node_byte_offset(&self->reusable_node);\n uint32_t end_byte_offset = byte_offset + ts_subtree_total_bytes(result);\n\n // Do not reuse an EOF node if the included ranges array has changes\n // later on in the file.\n if (ts_subtree_is_eof(result)) end_byte_offset = UINT32_MAX;\n\n if (byte_offset > position) {\n LOG(\"before_reusable_node symbol:%s\", TREE_NAME(result));\n break;\n }\n\n if (byte_offset < position) {\n LOG(\"past_reusable_node symbol:%s\", TREE_NAME(result));\n if (end_byte_offset <= position || !reusable_node_descend(&self->reusable_node)) {\n reusable_node_advance(&self->reusable_node);\n }\n continue;\n }\n\n if (!ts_subtree_external_scanner_state_eq(self->reusable_node.last_external_token, last_external_token)) {\n LOG(\"reusable_node_has_different_external_scanner_state symbol:%s\", TREE_NAME(result));\n reusable_node_advance(&self->reusable_node);\n continue;\n }\n\n const char *reason = NULL;\n if (ts_subtree_has_changes(result)) {\n reason = \"has_changes\";\n } else if (ts_subtree_is_error(result)) {\n reason = \"is_error\";\n } else if (ts_subtree_missing(result)) {\n reason = \"is_missing\";\n } else if (ts_subtree_is_fragile(result)) {\n reason = \"is_fragile\";\n } else if (ts_parser__has_included_range_difference(self, byte_offset, end_byte_offset)) {\n reason = \"contains_different_included_range\";\n }\n\n if (reason) {\n LOG(\"cant_reuse_node_%s tree:%s\", reason, TREE_NAME(result));\n if (!reusable_node_descend(&self->reusable_node)) {\n reusable_node_advance(&self->reusable_node);\n ts_parser__breakdown_top_of_stack(self, version);\n *state = ts_stack_state(self->stack, version);\n }\n continue;\n }\n\n TSSymbol leaf_symbol = ts_subtree_leaf_symbol(result);\n ts_language_table_entry(self->language, *state, leaf_symbol, table_entry);\n if (!ts_parser__can_reuse_first_leaf(self, *state, result, table_entry)) {\n LOG(\n \"cant_reuse_node symbol:%s, first_leaf_symbol:%s\",\n TREE_NAME(result),\n SYM_NAME(leaf_symbol)\n );\n reusable_node_advance_past_leaf(&self->reusable_node);\n break;\n }\n\n LOG(\"reuse_node symbol:%s\", TREE_NAME(result));\n ts_subtree_retain(result);\n return result;\n }\n\n return NULL_SUBTREE;\n}\n\n// Determine if a given tree should be replaced by an alternative tree.\n//\n// The decision is based on the trees' error costs (if any), their dynamic precedence,\n// and finally, as a default, by a recursive comparison of the trees' symbols.\nstatic bool ts_parser__select_tree(TSParser *self, Subtree left, Subtree right) {\n if (!left.ptr) return true;\n if (!right.ptr) return false;\n\n if (ts_subtree_error_cost(right) < ts_subtree_error_cost(left)) {\n LOG(\"select_smaller_error symbol:%s, over_symbol:%s\", TREE_NAME(right), TREE_NAME(left));\n return true;\n }\n\n if (ts_subtree_error_cost(left) < ts_subtree_error_cost(right)) {\n LOG(\"select_smaller_error symbol:%s, over_symbol:%s\", TREE_NAME(left), TREE_NAME(right));\n return false;\n }\n\n if (ts_subtree_dynamic_precedence(right) > ts_subtree_dynamic_precedence(left)) {\n LOG(\"select_higher_precedence symbol:%s, prec:%\" PRId32 \", over_symbol:%s, other_prec:%\" PRId32,\n TREE_NAME(right), ts_subtree_dynamic_precedence(right), TREE_NAME(left),\n ts_subtree_dynamic_precedence(left));\n return true;\n }\n\n if (ts_subtree_dynamic_precedence(left) > ts_subtree_dynamic_precedence(right)) {\n LOG(\"select_higher_precedence symbol:%s, prec:%\" PRId32 \", over_symbol:%s, other_prec:%\" PRId32,\n TREE_NAME(left), ts_subtree_dynamic_precedence(left), TREE_NAME(right),\n ts_subtree_dynamic_precedence(right));\n return false;\n }\n\n if (ts_subtree_error_cost(left) > 0) return true;\n\n int comparison = ts_subtree_compare(left, right, &self->tree_pool);\n switch (comparison) {\n case -1:\n LOG(\"select_earlier symbol:%s, over_symbol:%s\", TREE_NAME(left), TREE_NAME(right));\n return false;\n break;\n case 1:\n LOG(\"select_earlier symbol:%s, over_symbol:%s\", TREE_NAME(right), TREE_NAME(left));\n return true;\n default:\n LOG(\"select_existing symbol:%s, over_symbol:%s\", TREE_NAME(left), TREE_NAME(right));\n return false;\n }\n}\n\n// Determine if a given tree's children should be replaced by an alternative\n// array of children.\nstatic bool ts_parser__select_children(\n TSParser *self,\n Subtree left,\n const SubtreeArray *children\n) {\n array_assign(&self->scratch_trees, children);\n\n // Create a temporary subtree using the scratch trees array. This node does\n // not perform any allocation except for possibly growing the array to make\n // room for its own heap data. The scratch tree is never explicitly released,\n // so the same 'scratch trees' array can be reused again later.\n MutableSubtree scratch_tree = ts_subtree_new_node(\n ts_subtree_symbol(left),\n &self->scratch_trees,\n 0,\n self->language\n );\n\n return ts_parser__select_tree(\n self,\n left,\n ts_subtree_from_mut(scratch_tree)\n );\n}\n\nstatic void ts_parser__shift(\n TSParser *self,\n StackVersion version,\n TSStateId state,\n Subtree lookahead,\n bool extra\n) {\n bool is_leaf = ts_subtree_child_count(lookahead) == 0;\n Subtree subtree_to_push = lookahead;\n if (extra != ts_subtree_extra(lookahead) && is_leaf) {\n MutableSubtree result = ts_subtree_make_mut(&self->tree_pool, lookahead);\n ts_subtree_set_extra(&result, extra);\n subtree_to_push = ts_subtree_from_mut(result);\n }\n\n ts_stack_push(self->stack, version, subtree_to_push, !is_leaf, state);\n if (ts_subtree_has_external_tokens(subtree_to_push)) {\n ts_stack_set_last_external_token(\n self->stack, version, ts_subtree_last_external_token(subtree_to_push)\n );\n }\n}\n\nstatic StackVersion ts_parser__reduce(\n TSParser *self,\n StackVersion version,\n TSSymbol symbol,\n uint32_t count,\n int dynamic_precedence,\n uint16_t production_id,\n bool is_fragile,\n bool end_of_non_terminal_extra\n) {\n uint32_t initial_version_count = ts_stack_version_count(self->stack);\n\n // Pop the given number of nodes from the given version of the parse stack.\n // If stack versions have previously merged, then there may be more than one\n // path back through the stack. For each path, create a new parent node to\n // contain the popped children, and push it onto the stack in place of the\n // children.\n StackSliceArray pop = ts_stack_pop_count(self->stack, version, count);\n uint32_t removed_version_count = 0;\n uint32_t halted_version_count = ts_stack_halted_version_count(self->stack);\n for (uint32_t i = 0; i < pop.size; i++) {\n StackSlice slice = *array_get(&pop, i);\n StackVersion slice_version = slice.version - removed_version_count;\n\n // This is where new versions are added to the parse stack. The versions\n // will all be sorted and truncated at the end of the outer parsing loop.\n // Allow the maximum version count to be temporarily exceeded, but only\n // by a limited threshold.\n if (slice_version > MAX_VERSION_COUNT + MAX_VERSION_COUNT_OVERFLOW + halted_version_count) {\n ts_stack_remove_version(self->stack, slice_version);\n ts_subtree_array_delete(&self->tree_pool, &slice.subtrees);\n removed_version_count++;\n while (i + 1 < pop.size) {\n LOG(\"aborting reduce with too many versions\")\n StackSlice next_slice = *array_get(&pop, i + 1);\n if (next_slice.version != slice.version) break;\n ts_subtree_array_delete(&self->tree_pool, &next_slice.subtrees);\n i++;\n }\n continue;\n }\n\n // Extra tokens on top of the stack should not be included in this new parent\n // node. They will be re-pushed onto the stack after the parent node is\n // created and pushed.\n SubtreeArray children = slice.subtrees;\n ts_subtree_array_remove_trailing_extras(&children, &self->trailing_extras);\n\n MutableSubtree parent = ts_subtree_new_node(\n symbol, &children, production_id, self->language\n );\n\n // This pop operation may have caused multiple stack versions to collapse\n // into one, because they all diverged from a common state. In that case,\n // choose one of the arrays of trees to be the parent node's children, and\n // delete the rest of the tree arrays.\n while (i + 1 < pop.size) {\n StackSlice next_slice = *array_get(&pop, i + 1);\n if (next_slice.version != slice.version) break;\n i++;\n\n SubtreeArray next_slice_children = next_slice.subtrees;\n ts_subtree_array_remove_trailing_extras(&next_slice_children, &self->trailing_extras2);\n\n if (ts_parser__select_children(\n self,\n ts_subtree_from_mut(parent),\n &next_slice_children\n )) {\n ts_subtree_array_clear(&self->tree_pool, &self->trailing_extras);\n ts_subtree_release(&self->tree_pool, ts_subtree_from_mut(parent));\n array_swap(&self->trailing_extras, &self->trailing_extras2);\n parent = ts_subtree_new_node(\n symbol, &next_slice_children, production_id, self->language\n );\n } else {\n array_clear(&self->trailing_extras2);\n ts_subtree_array_delete(&self->tree_pool, &next_slice.subtrees);\n }\n }\n\n TSStateId state = ts_stack_state(self->stack, slice_version);\n TSStateId next_state = ts_language_next_state(self->language, state, symbol);\n if (end_of_non_terminal_extra && next_state == state) {\n parent.ptr->extra = true;\n }\n if (is_fragile || pop.size > 1 || initial_version_count > 1) {\n parent.ptr->fragile_left = true;\n parent.ptr->fragile_right = true;\n parent.ptr->parse_state = TS_TREE_STATE_NONE;\n } else {\n parent.ptr->parse_state = state;\n }\n parent.ptr->dynamic_precedence += dynamic_precedence;\n\n // Push the parent node onto the stack, along with any extra tokens that\n // were previously on top of the stack.\n ts_stack_push(self->stack, slice_version, ts_subtree_from_mut(parent), false, next_state);\n for (uint32_t j = 0; j < self->trailing_extras.size; j++) {\n ts_stack_push(self->stack, slice_version, *array_get(&self->trailing_extras, j), false, next_state);\n }\n\n for (StackVersion j = 0; j < slice_version; j++) {\n if (j == version) continue;\n if (ts_stack_merge(self->stack, j, slice_version)) {\n removed_version_count++;\n break;\n }\n }\n }\n\n // Return the first new stack version that was created.\n return ts_stack_version_count(self->stack) > initial_version_count\n ? initial_version_count\n : STACK_VERSION_NONE;\n}\n\nstatic void ts_parser__accept(\n TSParser *self,\n StackVersion version,\n Subtree lookahead\n) {\n ts_assert(ts_subtree_is_eof(lookahead));\n ts_stack_push(self->stack, version, lookahead, false, 1);\n\n StackSliceArray pop = ts_stack_pop_all(self->stack, version);\n for (uint32_t i = 0; i < pop.size; i++) {\n SubtreeArray trees = array_get(&pop, i)->subtrees;\n\n Subtree root = NULL_SUBTREE;\n for (uint32_t j = trees.size - 1; j + 1 > 0; j--) {\n Subtree tree = *array_get(&trees, j);\n if (!ts_subtree_extra(tree)) {\n ts_assert(!tree.data.is_inline);\n uint32_t child_count = ts_subtree_child_count(tree);\n const Subtree *children = ts_subtree_children(tree);\n for (uint32_t k = 0; k < child_count; k++) {\n ts_subtree_retain(children[k]);\n }\n array_splice(&trees, j, 1, child_count, children);\n root = ts_subtree_from_mut(ts_subtree_new_node(\n ts_subtree_symbol(tree),\n &trees,\n tree.ptr->production_id,\n self->language\n ));\n ts_subtree_release(&self->tree_pool, tree);\n break;\n }\n }\n\n ts_assert(root.ptr);\n self->accept_count++;\n\n if (self->finished_tree.ptr) {\n if (ts_parser__select_tree(self, self->finished_tree, root)) {\n ts_subtree_release(&self->tree_pool, self->finished_tree);\n self->finished_tree = root;\n } else {\n ts_subtree_release(&self->tree_pool, root);\n }\n } else {\n self->finished_tree = root;\n }\n }\n\n ts_stack_remove_version(self->stack, array_get(&pop, 0)->version);\n ts_stack_halt(self->stack, version);\n}\n\nstatic bool ts_parser__do_all_potential_reductions(\n TSParser *self,\n StackVersion starting_version,\n TSSymbol lookahead_symbol\n) {\n uint32_t initial_version_count = ts_stack_version_count(self->stack);\n\n bool can_shift_lookahead_symbol = false;\n StackVersion version = starting_version;\n for (unsigned i = 0; true; i++) {\n uint32_t version_count = ts_stack_version_count(self->stack);\n if (version >= version_count) break;\n\n bool merged = false;\n for (StackVersion j = initial_version_count; j < version; j++) {\n if (ts_stack_merge(self->stack, j, version)) {\n merged = true;\n break;\n }\n }\n if (merged) continue;\n\n TSStateId state = ts_stack_state(self->stack, version);\n bool has_shift_action = false;\n array_clear(&self->reduce_actions);\n\n TSSymbol first_symbol, end_symbol;\n if (lookahead_symbol != 0) {\n first_symbol = lookahead_symbol;\n end_symbol = lookahead_symbol + 1;\n } else {\n first_symbol = 1;\n end_symbol = self->language->token_count;\n }\n\n for (TSSymbol symbol = first_symbol; symbol < end_symbol; symbol++) {\n TableEntry entry;\n ts_language_table_entry(self->language, state, symbol, &entry);\n for (uint32_t j = 0; j < entry.action_count; j++) {\n TSParseAction action = entry.actions[j];\n switch (action.type) {\n case TSParseActionTypeShift:\n case TSParseActionTypeRecover:\n if (!action.shift.extra && !action.shift.repetition) has_shift_action = true;\n break;\n case TSParseActionTypeReduce:\n if (action.reduce.child_count > 0)\n ts_reduce_action_set_add(&self->reduce_actions, (ReduceAction) {\n .symbol = action.reduce.symbol,\n .count = action.reduce.child_count,\n .dynamic_precedence = action.reduce.dynamic_precedence,\n .production_id = action.reduce.production_id,\n });\n break;\n default:\n break;\n }\n }\n }\n\n StackVersion reduction_version = STACK_VERSION_NONE;\n for (uint32_t j = 0; j < self->reduce_actions.size; j++) {\n ReduceAction action = *array_get(&self->reduce_actions, j);\n\n reduction_version = ts_parser__reduce(\n self, version, action.symbol, action.count,\n action.dynamic_precedence, action.production_id,\n true, false\n );\n }\n\n if (has_shift_action) {\n can_shift_lookahead_symbol = true;\n } else if (reduction_version != STACK_VERSION_NONE && i < MAX_VERSION_COUNT) {\n ts_stack_renumber_version(self->stack, reduction_version, version);\n continue;\n } else if (lookahead_symbol != 0) {\n ts_stack_remove_version(self->stack, version);\n }\n\n if (version == starting_version) {\n version = version_count;\n } else {\n version++;\n }\n }\n\n return can_shift_lookahead_symbol;\n}\n\nstatic bool ts_parser__recover_to_state(\n TSParser *self,\n StackVersion version,\n unsigned depth,\n TSStateId goal_state\n) {\n StackSliceArray pop = ts_stack_pop_count(self->stack, version, depth);\n StackVersion previous_version = STACK_VERSION_NONE;\n\n for (unsigned i = 0; i < pop.size; i++) {\n StackSlice slice = *array_get(&pop, i);\n\n if (slice.version == previous_version) {\n ts_subtree_array_delete(&self->tree_pool, &slice.subtrees);\n array_erase(&pop, i--);\n continue;\n }\n\n if (ts_stack_state(self->stack, slice.version) != goal_state) {\n ts_stack_halt(self->stack, slice.version);\n ts_subtree_array_delete(&self->tree_pool, &slice.subtrees);\n array_erase(&pop, i--);\n continue;\n }\n\n SubtreeArray error_trees = ts_stack_pop_error(self->stack, slice.version);\n if (error_trees.size > 0) {\n ts_assert(error_trees.size == 1);\n Subtree error_tree = *array_get(&error_trees, 0);\n uint32_t error_child_count = ts_subtree_child_count(error_tree);\n if (error_child_count > 0) {\n array_splice(&slice.subtrees, 0, 0, error_child_count, ts_subtree_children(error_tree));\n for (unsigned j = 0; j < error_child_count; j++) {\n ts_subtree_retain(*array_get(&slice.subtrees, j));\n }\n }\n ts_subtree_array_delete(&self->tree_pool, &error_trees);\n }\n\n ts_subtree_array_remove_trailing_extras(&slice.subtrees, &self->trailing_extras);\n\n if (slice.subtrees.size > 0) {\n Subtree error = ts_subtree_new_error_node(&slice.subtrees, true, self->language);\n ts_stack_push(self->stack, slice.version, error, false, goal_state);\n } else {\n array_delete(&slice.subtrees);\n }\n\n for (unsigned j = 0; j < self->trailing_extras.size; j++) {\n Subtree tree = *array_get(&self->trailing_extras, j);\n ts_stack_push(self->stack, slice.version, tree, false, goal_state);\n }\n\n previous_version = slice.version;\n }\n\n return previous_version != STACK_VERSION_NONE;\n}\n\nstatic void ts_parser__recover(\n TSParser *self,\n StackVersion version,\n Subtree lookahead\n) {\n bool did_recover = false;\n unsigned previous_version_count = ts_stack_version_count(self->stack);\n Length position = ts_stack_position(self->stack, version);\n StackSummary *summary = ts_stack_get_summary(self->stack, version);\n unsigned node_count_since_error = ts_stack_node_count_since_error(self->stack, version);\n unsigned current_error_cost = ts_stack_error_cost(self->stack, version);\n\n // When the parser is in the error state, there are two strategies for recovering with a\n // given lookahead token:\n // 1. Find a previous state on the stack in which that lookahead token would be valid. Then,\n // create a new stack version that is in that state again. This entails popping all of the\n // subtrees that have been pushed onto the stack since that previous state, and wrapping\n // them in an ERROR node.\n // 2. Wrap the lookahead token in an ERROR node, push that ERROR node onto the stack, and\n // move on to the next lookahead token, remaining in the error state.\n //\n // First, try the strategy 1. Upon entering the error state, the parser recorded a summary\n // of the previous parse states and their depths. Look at each state in the summary, to see\n // if the current lookahead token would be valid in that state.\n if (summary && !ts_subtree_is_error(lookahead)) {\n for (unsigned i = 0; i < summary->size; i++) {\n StackSummaryEntry entry = *array_get(summary, i);\n\n if (entry.state == ERROR_STATE) continue;\n if (entry.position.bytes == position.bytes) continue;\n unsigned depth = entry.depth;\n if (node_count_since_error > 0) depth++;\n\n // Do not recover in ways that create redundant stack versions.\n bool would_merge = false;\n for (unsigned j = 0; j < previous_version_count; j++) {\n if (\n ts_stack_state(self->stack, j) == entry.state &&\n ts_stack_position(self->stack, j).bytes == position.bytes\n ) {\n would_merge = true;\n break;\n }\n }\n if (would_merge) continue;\n\n // Do not recover if the result would clearly be worse than some existing stack version.\n unsigned new_cost =\n current_error_cost +\n entry.depth * ERROR_COST_PER_SKIPPED_TREE +\n (position.bytes - entry.position.bytes) * ERROR_COST_PER_SKIPPED_CHAR +\n (position.extent.row - entry.position.extent.row) * ERROR_COST_PER_SKIPPED_LINE;\n if (ts_parser__better_version_exists(self, version, false, new_cost)) break;\n\n // If the current lookahead token is valid in some previous state, recover to that state.\n // Then stop looking for further recoveries.\n if (ts_language_has_actions(self->language, entry.state, ts_subtree_symbol(lookahead))) {\n if (ts_parser__recover_to_state(self, version, depth, entry.state)) {\n did_recover = true;\n LOG(\"recover_to_previous state:%u, depth:%u\", entry.state, depth);\n LOG_STACK();\n break;\n }\n }\n }\n }\n\n // In the process of attempting to recover, some stack versions may have been created\n // and subsequently halted. Remove those versions.\n for (unsigned i = previous_version_count; i < ts_stack_version_count(self->stack); i++) {\n if (!ts_stack_is_active(self->stack, i)) {\n LOG(\"removed paused version:%u\", i);\n ts_stack_remove_version(self->stack, i--);\n LOG_STACK();\n }\n }\n\n // If the parser is still in the error state at the end of the file, just wrap everything\n // in an ERROR node and terminate.\n if (ts_subtree_is_eof(lookahead)) {\n LOG(\"recover_eof\");\n SubtreeArray children = array_new();\n Subtree parent = ts_subtree_new_error_node(&children, false, self->language);\n ts_stack_push(self->stack, version, parent, false, 1);\n ts_parser__accept(self, version, lookahead);\n return;\n }\n\n // If strategy 1 succeeded, a new stack version will have been created which is able to handle\n // the current lookahead token. Now, in addition, try strategy 2 described above: skip the\n // current lookahead token by wrapping it in an ERROR node.\n\n // Don't pursue this additional strategy if there are already too many stack versions.\n if (did_recover && ts_stack_version_count(self->stack) > MAX_VERSION_COUNT) {\n ts_stack_halt(self->stack, version);\n ts_subtree_release(&self->tree_pool, lookahead);\n return;\n }\n\n if (\n did_recover &&\n ts_subtree_has_external_scanner_state_change(lookahead)\n ) {\n ts_stack_halt(self->stack, version);\n ts_subtree_release(&self->tree_pool, lookahead);\n return;\n }\n\n // Do not recover if the result would clearly be worse than some existing stack version.\n unsigned new_cost =\n current_error_cost + ERROR_COST_PER_SKIPPED_TREE +\n ts_subtree_total_bytes(lookahead) * ERROR_COST_PER_SKIPPED_CHAR +\n ts_subtree_total_size(lookahead).extent.row * ERROR_COST_PER_SKIPPED_LINE;\n if (ts_parser__better_version_exists(self, version, false, new_cost)) {\n ts_stack_halt(self->stack, version);\n ts_subtree_release(&self->tree_pool, lookahead);\n return;\n }\n\n // If the current lookahead token is an extra token, mark it as extra. This means it won't\n // be counted in error cost calculations.\n unsigned n;\n const TSParseAction *actions = ts_language_actions(self->language, 1, ts_subtree_symbol(lookahead), &n);\n if (n > 0 && actions[n - 1].type == TSParseActionTypeShift && actions[n - 1].shift.extra) {\n MutableSubtree mutable_lookahead = ts_subtree_make_mut(&self->tree_pool, lookahead);\n ts_subtree_set_extra(&mutable_lookahead, true);\n lookahead = ts_subtree_from_mut(mutable_lookahead);\n }\n\n // Wrap the lookahead token in an ERROR.\n LOG(\"skip_token symbol:%s\", TREE_NAME(lookahead));\n SubtreeArray children = array_new();\n array_reserve(&children, 1);\n array_push(&children, lookahead);\n MutableSubtree error_repeat = ts_subtree_new_node(\n ts_builtin_sym_error_repeat,\n &children,\n 0,\n self->language\n );\n\n // If other tokens have already been skipped, so there is already an ERROR at the top of the\n // stack, then pop that ERROR off the stack and wrap the two ERRORs together into one larger\n // ERROR.\n if (node_count_since_error > 0) {\n StackSliceArray pop = ts_stack_pop_count(self->stack, version, 1);\n\n // TODO: Figure out how to make this condition occur.\n // See https://github.com/atom/atom/issues/18450#issuecomment-439579778\n // If multiple stack versions have merged at this point, just pick one of the errors\n // arbitrarily and discard the rest.\n if (pop.size > 1) {\n for (unsigned i = 1; i < pop.size; i++) {\n ts_subtree_array_delete(&self->tree_pool, &array_get(&pop, i)->subtrees);\n }\n while (ts_stack_version_count(self->stack) > array_get(&pop, 0)->version + 1) {\n ts_stack_remove_version(self->stack, array_get(&pop, 0)->version + 1);\n }\n }\n\n ts_stack_renumber_version(self->stack, array_get(&pop, 0)->version, version);\n array_push(&array_get(&pop, 0)->subtrees, ts_subtree_from_mut(error_repeat));\n error_repeat = ts_subtree_new_node(\n ts_builtin_sym_error_repeat,\n &array_get(&pop, 0)->subtrees,\n 0,\n self->language\n );\n }\n\n // Push the new ERROR onto the stack.\n ts_stack_push(self->stack, version, ts_subtree_from_mut(error_repeat), false, ERROR_STATE);\n if (ts_subtree_has_external_tokens(lookahead)) {\n ts_stack_set_last_external_token(\n self->stack, version, ts_subtree_last_external_token(lookahead)\n );\n }\n\n bool has_error = true;\n for (unsigned i = 0; i < ts_stack_version_count(self->stack); i++) {\n ErrorStatus status = ts_parser__version_status(self, i);\n if (!status.is_in_error) {\n has_error = false;\n break;\n }\n }\n self->has_error = has_error;\n}\n\nstatic void ts_parser__handle_error(\n TSParser *self,\n StackVersion version,\n Subtree lookahead\n) {\n uint32_t previous_version_count = ts_stack_version_count(self->stack);\n\n // Perform any reductions that can happen in this state, regardless of the lookahead. After\n // skipping one or more invalid tokens, the parser might find a token that would have allowed\n // a reduction to take place.\n ts_parser__do_all_potential_reductions(self, version, 0);\n uint32_t version_count = ts_stack_version_count(self->stack);\n Length position = ts_stack_position(self->stack, version);\n\n // Push a discontinuity onto the stack. Merge all of the stack versions that\n // were created in the previous step.\n bool did_insert_missing_token = false;\n for (StackVersion v = version; v < version_count;) {\n if (!did_insert_missing_token) {\n TSStateId state = ts_stack_state(self->stack, v);\n for (\n TSSymbol missing_symbol = 1;\n missing_symbol < (uint16_t)self->language->token_count;\n missing_symbol++\n ) {\n TSStateId state_after_missing_symbol = ts_language_next_state(\n self->language, state, missing_symbol\n );\n if (state_after_missing_symbol == 0 || state_after_missing_symbol == state) {\n continue;\n }\n\n if (ts_language_has_reduce_action(\n self->language,\n state_after_missing_symbol,\n ts_subtree_leaf_symbol(lookahead)\n )) {\n // In case the parser is currently outside of any included range, the lexer will\n // snap to the beginning of the next included range. The missing token's padding\n // must be assigned to position it within the next included range.\n ts_lexer_reset(&self->lexer, position);\n ts_lexer_mark_end(&self->lexer);\n Length padding = length_sub(self->lexer.token_end_position, position);\n uint32_t lookahead_bytes = ts_subtree_total_bytes(lookahead) + ts_subtree_lookahead_bytes(lookahead);\n\n StackVersion version_with_missing_tree = ts_stack_copy_version(self->stack, v);\n Subtree missing_tree = ts_subtree_new_missing_leaf(\n &self->tree_pool, missing_symbol,\n padding, lookahead_bytes,\n self->language\n );\n ts_stack_push(\n self->stack, version_with_missing_tree,\n missing_tree, false,\n state_after_missing_symbol\n );\n\n if (ts_parser__do_all_potential_reductions(\n self, version_with_missing_tree,\n ts_subtree_leaf_symbol(lookahead)\n )) {\n LOG(\n \"recover_with_missing symbol:%s, state:%u\",\n SYM_NAME(missing_symbol),\n ts_stack_state(self->stack, version_with_missing_tree)\n );\n did_insert_missing_token = true;\n break;\n }\n }\n }\n }\n\n ts_stack_push(self->stack, v, NULL_SUBTREE, false, ERROR_STATE);\n v = (v == version) ? previous_version_count : v + 1;\n }\n\n for (unsigned i = previous_version_count; i < version_count; i++) {\n bool did_merge = ts_stack_merge(self->stack, version, previous_version_count);\n ts_assert(did_merge);\n }\n\n ts_stack_record_summary(self->stack, version, MAX_SUMMARY_DEPTH);\n\n // Begin recovery with the current lookahead node, rather than waiting for the\n // next turn of the parse loop. This ensures that the tree accounts for the\n // current lookahead token's \"lookahead bytes\" value, which describes how far\n // the lexer needed to look ahead beyond the content of the token in order to\n // recognize it.\n if (ts_subtree_child_count(lookahead) > 0) {\n ts_parser__breakdown_lookahead(self, &lookahead, ERROR_STATE, &self->reusable_node);\n }\n ts_parser__recover(self, version, lookahead);\n\n LOG_STACK();\n}\n\nstatic bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const uint32_t *position, unsigned operations) {\n self->operation_count += operations;\n if (self->operation_count >= OP_COUNT_PER_PARSER_CALLBACK_CHECK) {\n self->operation_count = 0;\n }\n if (position != NULL) {\n self->parse_state.current_byte_offset = *position;\n self->parse_state.has_error = self->has_error;\n }\n if (\n self->operation_count == 0 &&\n (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state))\n ) {\n if (lookahead && lookahead->ptr) {\n ts_subtree_release(&self->tree_pool, *lookahead);\n }\n return false;\n }\n return true;\n}\n\nstatic bool ts_parser__advance(\n TSParser *self,\n StackVersion version,\n bool allow_node_reuse\n) {\n TSStateId state = ts_stack_state(self->stack, version);\n uint32_t position = ts_stack_position(self->stack, version).bytes;\n Subtree last_external_token = ts_stack_last_external_token(self->stack, version);\n\n bool did_reuse = true;\n Subtree lookahead = NULL_SUBTREE;\n TableEntry table_entry = {.action_count = 0};\n\n // If possible, reuse a node from the previous syntax tree.\n if (allow_node_reuse) {\n lookahead = ts_parser__reuse_node(\n self, version, &state, position, last_external_token, &table_entry\n );\n }\n\n // If no node from the previous syntax tree could be reused, then try to\n // reuse the token previously returned by the lexer.\n if (!lookahead.ptr) {\n did_reuse = false;\n lookahead = ts_parser__get_cached_token(\n self, state, position, last_external_token, &table_entry\n );\n }\n\n bool needs_lex = !lookahead.ptr;\n for (;;) {\n // Otherwise, re-run the lexer.\n if (needs_lex) {\n needs_lex = false;\n lookahead = ts_parser__lex(self, version, state);\n if (self->has_scanner_error) return false;\n\n if (lookahead.ptr) {\n ts_parser__set_cached_token(self, position, last_external_token, lookahead);\n ts_language_table_entry(self->language, state, ts_subtree_symbol(lookahead), &table_entry);\n }\n\n // When parsing a non-terminal extra, a null lookahead indicates the\n // end of the rule. The reduction is stored in the EOF table entry.\n // After the reduction, the lexer needs to be run again.\n else {\n ts_language_table_entry(self->language, state, ts_builtin_sym_end, &table_entry);\n }\n }\n\n // If a progress callback was provided, then check every\n // time a fixed number of parse actions has been processed.\n if (!ts_parser__check_progress(self, &lookahead, &position, 1)) {\n return false;\n }\n\n // Process each parse action for the current lookahead token in\n // the current state. If there are multiple actions, then this is\n // an ambiguous state. REDUCE actions always create a new stack\n // version, whereas SHIFT actions update the existing stack version\n // and terminate this loop.\n bool did_reduce = false;\n StackVersion last_reduction_version = STACK_VERSION_NONE;\n for (uint32_t i = 0; i < table_entry.action_count; i++) {\n TSParseAction action = table_entry.actions[i];\n\n switch (action.type) {\n case TSParseActionTypeShift: {\n if (action.shift.repetition) break;\n TSStateId next_state;\n if (action.shift.extra) {\n next_state = state;\n LOG(\"shift_extra\");\n } else {\n next_state = action.shift.state;\n LOG(\"shift state:%u\", next_state);\n }\n\n if (ts_subtree_child_count(lookahead) > 0) {\n ts_parser__breakdown_lookahead(self, &lookahead, state, &self->reusable_node);\n next_state = ts_language_next_state(self->language, state, ts_subtree_symbol(lookahead));\n }\n\n ts_parser__shift(self, version, next_state, lookahead, action.shift.extra);\n if (did_reuse) reusable_node_advance(&self->reusable_node);\n return true;\n }\n\n case TSParseActionTypeReduce: {\n bool is_fragile = table_entry.action_count > 1;\n bool end_of_non_terminal_extra = lookahead.ptr == NULL;\n LOG(\"reduce sym:%s, child_count:%u\", SYM_NAME(action.reduce.symbol), action.reduce.child_count);\n StackVersion reduction_version = ts_parser__reduce(\n self, version, action.reduce.symbol, action.reduce.child_count,\n action.reduce.dynamic_precedence, action.reduce.production_id,\n is_fragile, end_of_non_terminal_extra\n );\n did_reduce = true;\n if (reduction_version != STACK_VERSION_NONE) {\n last_reduction_version = reduction_version;\n }\n break;\n }\n\n case TSParseActionTypeAccept: {\n LOG(\"accept\");\n ts_parser__accept(self, version, lookahead);\n return true;\n }\n\n case TSParseActionTypeRecover: {\n if (ts_subtree_child_count(lookahead) > 0) {\n ts_parser__breakdown_lookahead(self, &lookahead, ERROR_STATE, &self->reusable_node);\n }\n\n ts_parser__recover(self, version, lookahead);\n if (did_reuse) reusable_node_advance(&self->reusable_node);\n return true;\n }\n }\n }\n\n // If a reduction was performed, then replace the current stack version\n // with one of the stack versions created by a reduction, and continue\n // processing this version of the stack with the same lookahead symbol.\n if (last_reduction_version != STACK_VERSION_NONE) {\n ts_stack_renumber_version(self->stack, last_reduction_version, version);\n LOG_STACK();\n state = ts_stack_state(self->stack, version);\n\n // At the end of a non-terminal extra rule, the lexer will return a\n // null subtree, because the parser needs to perform a fixed reduction\n // regardless of the lookahead node. After performing that reduction,\n // (and completing the non-terminal extra rule) run the lexer again based\n // on the current parse state.\n if (!lookahead.ptr) {\n needs_lex = true;\n } else {\n ts_language_table_entry(\n self->language,\n state,\n ts_subtree_leaf_symbol(lookahead),\n &table_entry\n );\n }\n\n continue;\n }\n\n // A reduction was performed, but was merged into an existing stack version.\n // This version can be discarded.\n if (did_reduce) {\n if (lookahead.ptr) {\n ts_subtree_release(&self->tree_pool, lookahead);\n }\n ts_stack_halt(self->stack, version);\n return true;\n }\n\n // If the current lookahead token is a keyword that is not valid, but the\n // default word token *is* valid, then treat the lookahead token as the word\n // token instead.\n if (\n ts_subtree_is_keyword(lookahead) &&\n ts_subtree_symbol(lookahead) != self->language->keyword_capture_token &&\n !ts_language_is_reserved_word(self->language, state, ts_subtree_symbol(lookahead))\n ) {\n ts_language_table_entry(\n self->language,\n state,\n self->language->keyword_capture_token,\n &table_entry\n );\n if (table_entry.action_count > 0) {\n LOG(\n \"switch from_keyword:%s, to_word_token:%s\",\n TREE_NAME(lookahead),\n SYM_NAME(self->language->keyword_capture_token)\n );\n\n MutableSubtree mutable_lookahead = ts_subtree_make_mut(&self->tree_pool, lookahead);\n ts_subtree_set_symbol(&mutable_lookahead, self->language->keyword_capture_token, self->language);\n lookahead = ts_subtree_from_mut(mutable_lookahead);\n continue;\n }\n }\n\n // If the current lookahead token is not valid and the previous subtree on\n // the stack was reused from an old tree, then it wasn't actually valid to\n // reuse that previous subtree. Remove it from the stack, and in its place,\n // push each of its children. Then try again to process the current lookahead.\n if (ts_parser__breakdown_top_of_stack(self, version)) {\n state = ts_stack_state(self->stack, version);\n ts_subtree_release(&self->tree_pool, lookahead);\n needs_lex = true;\n continue;\n }\n\n // Otherwise, there is definitely an error in this version of the parse stack.\n // Mark this version as paused and continue processing any other stack\n // versions that exist. If some other version advances successfully, then\n // this version can simply be removed. But if all versions end up paused,\n // then error recovery is needed.\n LOG(\"detect_error lookahead:%s\", TREE_NAME(lookahead));\n ts_stack_pause(self->stack, version, lookahead);\n return true;\n }\n}\n\nstatic unsigned ts_parser__condense_stack(TSParser *self) {\n bool made_changes = false;\n unsigned min_error_cost = UINT_MAX;\n for (StackVersion i = 0; i < ts_stack_version_count(self->stack); i++) {\n // Prune any versions that have been marked for removal.\n if (ts_stack_is_halted(self->stack, i)) {\n ts_stack_remove_version(self->stack, i);\n i--;\n continue;\n }\n\n // Keep track of the minimum error cost of any stack version so\n // that it can be returned.\n ErrorStatus status_i = ts_parser__version_status(self, i);\n if (!status_i.is_in_error && status_i.cost < min_error_cost) {\n min_error_cost = status_i.cost;\n }\n\n // Examine each pair of stack versions, removing any versions that\n // are clearly worse than another version. Ensure that the versions\n // are ordered from most promising to least promising.\n for (StackVersion j = 0; j < i; j++) {\n ErrorStatus status_j = ts_parser__version_status(self, j);\n\n switch (ts_parser__compare_versions(self, status_j, status_i)) {\n case ErrorComparisonTakeLeft:\n made_changes = true;\n ts_stack_remove_version(self->stack, i);\n i--;\n j = i;\n break;\n\n case ErrorComparisonPreferLeft:\n case ErrorComparisonNone:\n if (ts_stack_merge(self->stack, j, i)) {\n made_changes = true;\n i--;\n j = i;\n }\n break;\n\n case ErrorComparisonPreferRight:\n made_changes = true;\n if (ts_stack_merge(self->stack, j, i)) {\n i--;\n j = i;\n } else {\n ts_stack_swap_versions(self->stack, i, j);\n }\n break;\n\n case ErrorComparisonTakeRight:\n made_changes = true;\n ts_stack_remove_version(self->stack, j);\n i--;\n j--;\n break;\n }\n }\n }\n\n // Enforce a hard upper bound on the number of stack versions by\n // discarding the least promising versions.\n while (ts_stack_version_count(self->stack) > MAX_VERSION_COUNT) {\n ts_stack_remove_version(self->stack, MAX_VERSION_COUNT);\n made_changes = true;\n }\n\n // If the best-performing stack version is currently paused, or all\n // versions are paused, then resume the best paused version and begin\n // the error recovery process. Otherwise, remove the paused versions.\n if (ts_stack_version_count(self->stack) > 0) {\n bool has_unpaused_version = false;\n for (StackVersion i = 0, n = ts_stack_version_count(self->stack); i < n; i++) {\n if (ts_stack_is_paused(self->stack, i)) {\n if (!has_unpaused_version && self->accept_count < MAX_VERSION_COUNT) {\n LOG(\"resume version:%u\", i);\n min_error_cost = ts_stack_error_cost(self->stack, i);\n Subtree lookahead = ts_stack_resume(self->stack, i);\n ts_parser__handle_error(self, i, lookahead);\n has_unpaused_version = true;\n } else {\n ts_stack_remove_version(self->stack, i);\n made_changes = true;\n i--;\n n--;\n }\n } else {\n has_unpaused_version = true;\n }\n }\n }\n\n if (made_changes) {\n LOG(\"condense\");\n LOG_STACK();\n }\n\n return min_error_cost;\n}\n\nstatic bool ts_parser__balance_subtree(TSParser *self) {\n Subtree finished_tree = self->finished_tree;\n\n // If we haven't canceled balancing in progress before, then we want to clear the tree stack and\n // push the initial finished tree onto it. Otherwise, if we're resuming balancing after a\n // cancellation, we don't want to clear the tree stack.\n if (!self->canceled_balancing) {\n array_clear(&self->tree_pool.tree_stack);\n if (ts_subtree_child_count(finished_tree) > 0 && finished_tree.ptr->ref_count == 1) {\n array_push(&self->tree_pool.tree_stack, ts_subtree_to_mut_unsafe(finished_tree));\n }\n }\n\n while (self->tree_pool.tree_stack.size > 0) {\n if (!ts_parser__check_progress(self, NULL, NULL, 1)) {\n return false;\n }\n\n MutableSubtree tree = *array_get(&self->tree_pool.tree_stack, \n self->tree_pool.tree_stack.size - 1\n );\n\n if (tree.ptr->repeat_depth > 0) {\n Subtree child1 = ts_subtree_children(tree)[0];\n Subtree child2 = ts_subtree_children(tree)[tree.ptr->child_count - 1];\n long repeat_delta = (long)ts_subtree_repeat_depth(child1) - (long)ts_subtree_repeat_depth(child2);\n if (repeat_delta > 0) {\n unsigned n = (unsigned)repeat_delta;\n\n for (unsigned i = n / 2; i > 0; i /= 2) {\n ts_subtree_compress(tree, i, self->language, &self->tree_pool.tree_stack);\n n -= i;\n\n // We scale the operation count increment in `ts_parser__check_progress` proportionately to the compression\n // size since larger values of i take longer to process. Shifting by 4 empirically provides good check\n // intervals (e.g. 193 operations when i=3100) to prevent blocking during large compressions.\n uint8_t operations = i >> 4 > 0 ? i >> 4 : 1;\n if (!ts_parser__check_progress(self, NULL, NULL, operations)) {\n return false;\n }\n }\n }\n }\n\n (void)array_pop(&self->tree_pool.tree_stack);\n\n for (uint32_t i = 0; i < tree.ptr->child_count; i++) {\n Subtree child = ts_subtree_children(tree)[i];\n if (ts_subtree_child_count(child) > 0 && child.ptr->ref_count == 1) {\n array_push(&self->tree_pool.tree_stack, ts_subtree_to_mut_unsafe(child));\n }\n }\n }\n\n return true;\n}\n\nstatic bool ts_parser_has_outstanding_parse(TSParser *self) {\n return (\n self->canceled_balancing ||\n self->external_scanner_payload ||\n ts_stack_state(self->stack, 0) != 1 ||\n ts_stack_node_count_since_error(self->stack, 0) != 0\n );\n}\n\n// Parser - Public\n\nTSParser *ts_parser_new(void) {\n TSParser *self = ts_calloc(1, sizeof(TSParser));\n ts_lexer_init(&self->lexer);\n array_init(&self->reduce_actions);\n array_reserve(&self->reduce_actions, 4);\n self->tree_pool = ts_subtree_pool_new(32);\n self->stack = ts_stack_new(&self->tree_pool);\n self->finished_tree = NULL_SUBTREE;\n self->reusable_node = reusable_node_new();\n self->dot_graph_file = NULL;\n self->language = NULL;\n self->has_scanner_error = false;\n self->has_error = false;\n self->canceled_balancing = false;\n self->external_scanner_payload = NULL;\n self->operation_count = 0;\n self->old_tree = NULL_SUBTREE;\n self->included_range_differences = (TSRangeArray) array_new();\n self->included_range_difference_index = 0;\n ts_parser__set_cached_token(self, 0, NULL_SUBTREE, NULL_SUBTREE);\n return self;\n}\n\nvoid ts_parser_delete(TSParser *self) {\n if (!self) return;\n\n ts_parser_set_language(self, NULL);\n ts_stack_delete(self->stack);\n if (self->reduce_actions.contents) {\n array_delete(&self->reduce_actions);\n }\n if (self->included_range_differences.contents) {\n array_delete(&self->included_range_differences);\n }\n if (self->old_tree.ptr) {\n ts_subtree_release(&self->tree_pool, self->old_tree);\n self->old_tree = NULL_SUBTREE;\n }\n ts_wasm_store_delete(self->wasm_store);\n ts_lexer_delete(&self->lexer);\n ts_parser__set_cached_token(self, 0, NULL_SUBTREE, NULL_SUBTREE);\n ts_subtree_pool_delete(&self->tree_pool);\n reusable_node_delete(&self->reusable_node);\n array_delete(&self->trailing_extras);\n array_delete(&self->trailing_extras2);\n array_delete(&self->scratch_trees);\n ts_free(self);\n}\n\nconst TSLanguage *ts_parser_language(const TSParser *self) {\n return self->language;\n}\n\nbool ts_parser_set_language(TSParser *self, const TSLanguage *language) {\n ts_parser_reset(self);\n ts_language_delete(self->language);\n self->language = NULL;\n\n if (language) {\n if (\n language->abi_version > TREE_SITTER_LANGUAGE_VERSION ||\n language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION\n ) return false;\n\n if (ts_language_is_wasm(language)) {\n if (\n !self->wasm_store ||\n !ts_wasm_store_start(self->wasm_store, &self->lexer.data, language)\n ) return false;\n }\n }\n\n self->language = ts_language_copy(language);\n return true;\n}\n\nTSLogger ts_parser_logger(const TSParser *self) {\n return self->lexer.logger;\n}\n\nvoid ts_parser_set_logger(TSParser *self, TSLogger logger) {\n self->lexer.logger = logger;\n}\n\nvoid ts_parser_print_dot_graphs(TSParser *self, int fd) {\n if (self->dot_graph_file) {\n fclose(self->dot_graph_file);\n }\n\n if (fd >= 0) {\n #ifdef _WIN32\n self->dot_graph_file = _fdopen(fd, \"a\");\n #else\n self->dot_graph_file = fdopen(fd, \"a\");\n #endif\n } else {\n self->dot_graph_file = NULL;\n }\n}\n\nbool ts_parser_set_included_ranges(\n TSParser *self,\n const TSRange *ranges,\n uint32_t count\n) {\n return ts_lexer_set_included_ranges(&self->lexer, ranges, count);\n}\n\nconst TSRange *ts_parser_included_ranges(const TSParser *self, uint32_t *count) {\n return ts_lexer_included_ranges(&self->lexer, count);\n}\n\nvoid ts_parser_reset(TSParser *self) {\n ts_parser__external_scanner_destroy(self);\n if (self->wasm_store) {\n ts_wasm_store_reset(self->wasm_store);\n }\n\n if (self->old_tree.ptr) {\n ts_subtree_release(&self->tree_pool, self->old_tree);\n self->old_tree = NULL_SUBTREE;\n }\n\n reusable_node_clear(&self->reusable_node);\n ts_lexer_reset(&self->lexer, length_zero());\n ts_stack_clear(self->stack);\n ts_parser__set_cached_token(self, 0, NULL_SUBTREE, NULL_SUBTREE);\n if (self->finished_tree.ptr) {\n ts_subtree_release(&self->tree_pool, self->finished_tree);\n self->finished_tree = NULL_SUBTREE;\n }\n self->accept_count = 0;\n self->has_scanner_error = false;\n self->has_error = false;\n self->canceled_balancing = false;\n self->parse_options = (TSParseOptions) {0};\n self->parse_state = (TSParseState) {0};\n}\n\nTSTree *ts_parser_parse(\n TSParser *self,\n const TSTree *old_tree,\n TSInput input\n) {\n TSTree *result = NULL;\n if (!self->language || !input.read) return NULL;\n\n if (ts_language_is_wasm(self->language)) {\n if (!self->wasm_store) return NULL;\n ts_wasm_store_start(self->wasm_store, &self->lexer.data, self->language);\n }\n\n ts_lexer_set_input(&self->lexer, input);\n array_clear(&self->included_range_differences);\n self->included_range_difference_index = 0;\n\n self->operation_count = 0;\n\n if (ts_parser_has_outstanding_parse(self)) {\n LOG(\"resume_parsing\");\n if (self->canceled_balancing) goto balance;\n } else {\n ts_parser__external_scanner_create(self);\n if (self->has_scanner_error) goto exit;\n\n if (old_tree) {\n ts_subtree_retain(old_tree->root);\n self->old_tree = old_tree->root;\n ts_range_array_get_changed_ranges(\n old_tree->included_ranges, old_tree->included_range_count,\n self->lexer.included_ranges, self->lexer.included_range_count,\n &self->included_range_differences\n );\n reusable_node_reset(&self->reusable_node, old_tree->root);\n LOG(\"parse_after_edit\");\n LOG_TREE(self->old_tree);\n for (unsigned i = 0; i < self->included_range_differences.size; i++) {\n TSRange *range = array_get(&self->included_range_differences, i);\n LOG(\"different_included_range %u - %u\", range->start_byte, range->end_byte);\n }\n } else {\n reusable_node_clear(&self->reusable_node);\n LOG(\"new_parse\");\n }\n }\n\n uint32_t position = 0, last_position = 0, version_count = 0;\n do {\n for (\n StackVersion version = 0;\n version_count = ts_stack_version_count(self->stack),\n version < version_count;\n version++\n ) {\n bool allow_node_reuse = version_count == 1;\n while (ts_stack_is_active(self->stack, version)) {\n LOG(\n \"process version:%u, version_count:%u, state:%d, row:%u, col:%u\",\n version,\n ts_stack_version_count(self->stack),\n ts_stack_state(self->stack, version),\n ts_stack_position(self->stack, version).extent.row,\n ts_stack_position(self->stack, version).extent.column\n );\n\n if (!ts_parser__advance(self, version, allow_node_reuse)) {\n if (self->has_scanner_error) goto exit;\n return NULL;\n }\n\n LOG_STACK();\n\n position = ts_stack_position(self->stack, version).bytes;\n if (position > last_position || (version > 0 && position == last_position)) {\n last_position = position;\n break;\n }\n }\n }\n\n // After advancing each version of the stack, re-sort the versions by their cost,\n // removing any versions that are no longer worth pursuing.\n unsigned min_error_cost = ts_parser__condense_stack(self);\n\n // If there's already a finished parse tree that's better than any in-progress version,\n // then terminate parsing. Clear the parse stack to remove any extra references to subtrees\n // within the finished tree, ensuring that these subtrees can be safely mutated in-place\n // for rebalancing.\n if (self->finished_tree.ptr && ts_subtree_error_cost(self->finished_tree) < min_error_cost) {\n ts_stack_clear(self->stack);\n break;\n }\n\n while (self->included_range_difference_index < self->included_range_differences.size) {\n TSRange *range = array_get(&self->included_range_differences, self->included_range_difference_index);\n if (range->end_byte <= position) {\n self->included_range_difference_index++;\n } else {\n break;\n }\n }\n } while (version_count != 0);\n\nbalance:\n ts_assert(self->finished_tree.ptr);\n if (!ts_parser__balance_subtree(self)) {\n self->canceled_balancing = true;\n return NULL;\n }\n self->canceled_balancing = false;\n LOG(\"done\");\n LOG_TREE(self->finished_tree);\n\n result = ts_tree_new(\n self->finished_tree,\n self->language,\n self->lexer.included_ranges,\n self->lexer.included_range_count\n );\n self->finished_tree = NULL_SUBTREE;\n\nexit:\n ts_parser_reset(self);\n return result;\n}\n\nTSTree *ts_parser_parse_with_options(\n TSParser *self,\n const TSTree *old_tree,\n TSInput input,\n TSParseOptions parse_options\n) {\n self->parse_options = parse_options;\n self->parse_state.payload = parse_options.payload;\n TSTree *result = ts_parser_parse(self, old_tree, input);\n // Reset parser options before further parse calls.\n self->parse_options = (TSParseOptions) {0};\n return result;\n}\n\nTSTree *ts_parser_parse_string(\n TSParser *self,\n const TSTree *old_tree,\n const char *string,\n uint32_t length\n) {\n return ts_parser_parse_string_encoding(self, old_tree, string, length, TSInputEncodingUTF8);\n}\n\nTSTree *ts_parser_parse_string_encoding(\n TSParser *self,\n const TSTree *old_tree,\n const char *string,\n uint32_t length,\n TSInputEncoding encoding\n) {\n TSStringInput input = {string, length};\n return ts_parser_parse(self, old_tree, (TSInput) {\n &input,\n ts_string_input_read,\n encoding,\n NULL,\n });\n}\n\nvoid ts_parser_set_wasm_store(TSParser *self, TSWasmStore *store) {\n if (self->language && ts_language_is_wasm(self->language)) {\n // Copy the assigned language into the new store.\n const TSLanguage *copy = ts_language_copy(self->language);\n ts_parser_set_language(self, copy);\n ts_language_delete(copy);\n }\n\n ts_wasm_store_delete(self->wasm_store);\n self->wasm_store = store;\n}\n\nTSWasmStore *ts_parser_take_wasm_store(TSParser *self) {\n if (self->language && ts_language_is_wasm(self->language)) {\n ts_parser_set_language(self, NULL);\n }\n\n TSWasmStore *result = self->wasm_store;\n self->wasm_store = NULL;\n return result;\n}\n\n#undef LOG\n",
43
- "#include \"./alloc.h\"\n#include \"./language.h\"\n#include \"./subtree.h\"\n#include \"./array.h\"\n#include \"./stack.h\"\n#include \"./length.h\"\n#include <assert.h>\n#include <inttypes.h>\n#include <stdio.h>\n\n#define MAX_LINK_COUNT 8\n#define MAX_NODE_POOL_SIZE 50\n#define MAX_ITERATOR_COUNT 64\n\n#if defined _WIN32 && !defined __GNUC__\n#define forceinline __forceinline\n#else\n#define forceinline static inline __attribute__((always_inline))\n#endif\n\ntypedef struct StackNode StackNode;\n\ntypedef struct {\n StackNode *node;\n Subtree subtree;\n bool is_pending;\n} StackLink;\n\nstruct StackNode {\n TSStateId state;\n Length position;\n StackLink links[MAX_LINK_COUNT];\n short unsigned int link_count;\n uint32_t ref_count;\n unsigned error_cost;\n unsigned node_count;\n int dynamic_precedence;\n};\n\ntypedef struct {\n StackNode *node;\n SubtreeArray subtrees;\n uint32_t subtree_count;\n bool is_pending;\n} StackIterator;\n\ntypedef Array(StackNode *) StackNodeArray;\n\ntypedef enum {\n StackStatusActive,\n StackStatusPaused,\n StackStatusHalted,\n} StackStatus;\n\ntypedef struct {\n StackNode *node;\n StackSummary *summary;\n unsigned node_count_at_last_error;\n Subtree last_external_token;\n Subtree lookahead_when_paused;\n StackStatus status;\n} StackHead;\n\nstruct Stack {\n Array(StackHead) heads;\n StackSliceArray slices;\n Array(StackIterator) iterators;\n StackNodeArray node_pool;\n StackNode *base_node;\n SubtreePool *subtree_pool;\n};\n\ntypedef unsigned StackAction;\nenum {\n StackActionNone,\n StackActionStop = 1,\n StackActionPop = 2,\n};\n\ntypedef StackAction (*StackCallback)(void *, const StackIterator *);\n\nstatic void stack_node_retain(StackNode *self) {\n if (!self)\n return;\n ts_assert(self->ref_count > 0);\n self->ref_count++;\n ts_assert(self->ref_count != 0);\n}\n\nstatic void stack_node_release(\n StackNode *self,\n StackNodeArray *pool,\n SubtreePool *subtree_pool\n) {\nrecur:\n ts_assert(self->ref_count != 0);\n self->ref_count--;\n if (self->ref_count > 0) return;\n\n StackNode *first_predecessor = NULL;\n if (self->link_count > 0) {\n for (unsigned i = self->link_count - 1; i > 0; i--) {\n StackLink link = self->links[i];\n if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree);\n stack_node_release(link.node, pool, subtree_pool);\n }\n StackLink link = self->links[0];\n if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree);\n first_predecessor = self->links[0].node;\n }\n\n if (pool->size < MAX_NODE_POOL_SIZE) {\n array_push(pool, self);\n } else {\n ts_free(self);\n }\n\n if (first_predecessor) {\n self = first_predecessor;\n goto recur;\n }\n}\n\n/// Get the number of nodes in the subtree, for the purpose of measuring\n/// how much progress has been made by a given version of the stack.\nstatic uint32_t stack__subtree_node_count(Subtree subtree) {\n uint32_t count = ts_subtree_visible_descendant_count(subtree);\n if (ts_subtree_visible(subtree)) count++;\n\n // Count intermediate error nodes even though they are not visible,\n // because a stack version's node count is used to check whether it\n // has made any progress since the last time it encountered an error.\n if (ts_subtree_symbol(subtree) == ts_builtin_sym_error_repeat) count++;\n\n return count;\n}\n\nstatic StackNode *stack_node_new(\n StackNode *previous_node,\n Subtree subtree,\n bool is_pending,\n TSStateId state,\n StackNodeArray *pool\n) {\n StackNode *node = pool->size > 0\n ? array_pop(pool)\n : ts_malloc(sizeof(StackNode));\n *node = (StackNode) {\n .ref_count = 1,\n .link_count = 0,\n .state = state\n };\n\n if (previous_node) {\n node->link_count = 1;\n node->links[0] = (StackLink) {\n .node = previous_node,\n .subtree = subtree,\n .is_pending = is_pending,\n };\n\n node->position = previous_node->position;\n node->error_cost = previous_node->error_cost;\n node->dynamic_precedence = previous_node->dynamic_precedence;\n node->node_count = previous_node->node_count;\n\n if (subtree.ptr) {\n node->error_cost += ts_subtree_error_cost(subtree);\n node->position = length_add(node->position, ts_subtree_total_size(subtree));\n node->node_count += stack__subtree_node_count(subtree);\n node->dynamic_precedence += ts_subtree_dynamic_precedence(subtree);\n }\n } else {\n node->position = length_zero();\n node->error_cost = 0;\n }\n\n return node;\n}\n\nstatic bool stack__subtree_is_equivalent(Subtree left, Subtree right) {\n if (left.ptr == right.ptr) return true;\n if (!left.ptr || !right.ptr) return false;\n\n // Symbols must match\n if (ts_subtree_symbol(left) != ts_subtree_symbol(right)) return false;\n\n // If both have errors, don't bother keeping both.\n if (ts_subtree_error_cost(left) > 0 && ts_subtree_error_cost(right) > 0) return true;\n\n return (\n ts_subtree_padding(left).bytes == ts_subtree_padding(right).bytes &&\n ts_subtree_size(left).bytes == ts_subtree_size(right).bytes &&\n ts_subtree_child_count(left) == ts_subtree_child_count(right) &&\n ts_subtree_extra(left) == ts_subtree_extra(right) &&\n ts_subtree_external_scanner_state_eq(left, right)\n );\n}\n\nstatic void stack_node_add_link(\n StackNode *self,\n StackLink link,\n SubtreePool *subtree_pool\n) {\n if (link.node == self) return;\n\n for (int i = 0; i < self->link_count; i++) {\n StackLink *existing_link = &self->links[i];\n if (stack__subtree_is_equivalent(existing_link->subtree, link.subtree)) {\n // In general, we preserve ambiguities until they are removed from the stack\n // during a pop operation where multiple paths lead to the same node. But in\n // the special case where two links directly connect the same pair of nodes,\n // we can safely remove the ambiguity ahead of time without changing behavior.\n if (existing_link->node == link.node) {\n if (\n ts_subtree_dynamic_precedence(link.subtree) >\n ts_subtree_dynamic_precedence(existing_link->subtree)\n ) {\n ts_subtree_retain(link.subtree);\n ts_subtree_release(subtree_pool, existing_link->subtree);\n existing_link->subtree = link.subtree;\n self->dynamic_precedence =\n link.node->dynamic_precedence + ts_subtree_dynamic_precedence(link.subtree);\n }\n return;\n }\n\n // If the previous nodes are mergeable, merge them recursively.\n if (\n existing_link->node->state == link.node->state &&\n existing_link->node->position.bytes == link.node->position.bytes &&\n existing_link->node->error_cost == link.node->error_cost\n ) {\n for (int j = 0; j < link.node->link_count; j++) {\n stack_node_add_link(existing_link->node, link.node->links[j], subtree_pool);\n }\n int32_t dynamic_precedence = link.node->dynamic_precedence;\n if (link.subtree.ptr) {\n dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree);\n }\n if (dynamic_precedence > self->dynamic_precedence) {\n self->dynamic_precedence = dynamic_precedence;\n }\n return;\n }\n }\n }\n\n if (self->link_count == MAX_LINK_COUNT) return;\n\n stack_node_retain(link.node);\n unsigned node_count = link.node->node_count;\n int dynamic_precedence = link.node->dynamic_precedence;\n self->links[self->link_count++] = link;\n\n if (link.subtree.ptr) {\n ts_subtree_retain(link.subtree);\n node_count += stack__subtree_node_count(link.subtree);\n dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree);\n }\n\n if (node_count > self->node_count) self->node_count = node_count;\n if (dynamic_precedence > self->dynamic_precedence) self->dynamic_precedence = dynamic_precedence;\n}\n\nstatic void stack_head_delete(\n StackHead *self,\n StackNodeArray *pool,\n SubtreePool *subtree_pool\n) {\n if (self->node) {\n if (self->last_external_token.ptr) {\n ts_subtree_release(subtree_pool, self->last_external_token);\n }\n if (self->lookahead_when_paused.ptr) {\n ts_subtree_release(subtree_pool, self->lookahead_when_paused);\n }\n if (self->summary) {\n array_delete(self->summary);\n ts_free(self->summary);\n }\n stack_node_release(self->node, pool, subtree_pool);\n }\n}\n\nstatic StackVersion ts_stack__add_version(\n Stack *self,\n StackVersion original_version,\n StackNode *node\n) {\n StackHead head = {\n .node = node,\n .node_count_at_last_error = array_get(&self->heads, original_version)->node_count_at_last_error,\n .last_external_token = array_get(&self->heads, original_version)->last_external_token,\n .status = StackStatusActive,\n .lookahead_when_paused = NULL_SUBTREE,\n };\n array_push(&self->heads, head);\n stack_node_retain(node);\n if (head.last_external_token.ptr) ts_subtree_retain(head.last_external_token);\n return (StackVersion)(self->heads.size - 1);\n}\n\nstatic void ts_stack__add_slice(\n Stack *self,\n StackVersion original_version,\n StackNode *node,\n SubtreeArray *subtrees\n) {\n for (uint32_t i = self->slices.size - 1; i + 1 > 0; i--) {\n StackVersion version = array_get(&self->slices, i)->version;\n if (array_get(&self->heads, version)->node == node) {\n StackSlice slice = {*subtrees, version};\n array_insert(&self->slices, i + 1, slice);\n return;\n }\n }\n\n StackVersion version = ts_stack__add_version(self, original_version, node);\n StackSlice slice = { *subtrees, version };\n array_push(&self->slices, slice);\n}\n\nstatic StackSliceArray stack__iter(\n Stack *self,\n StackVersion version,\n StackCallback callback,\n void *payload,\n int goal_subtree_count\n) {\n array_clear(&self->slices);\n array_clear(&self->iterators);\n\n StackHead *head = array_get(&self->heads, version);\n StackIterator new_iterator = {\n .node = head->node,\n .subtrees = array_new(),\n .subtree_count = 0,\n .is_pending = true,\n };\n\n bool include_subtrees = false;\n if (goal_subtree_count >= 0) {\n include_subtrees = true;\n array_reserve(&new_iterator.subtrees, (uint32_t)ts_subtree_alloc_size(goal_subtree_count) / sizeof(Subtree));\n }\n\n array_push(&self->iterators, new_iterator);\n\n while (self->iterators.size > 0) {\n for (uint32_t i = 0, size = self->iterators.size; i < size; i++) {\n StackIterator *iterator = array_get(&self->iterators, i);\n StackNode *node = iterator->node;\n\n StackAction action = callback(payload, iterator);\n bool should_pop = action & StackActionPop;\n bool should_stop = action & StackActionStop || node->link_count == 0;\n\n if (should_pop) {\n SubtreeArray subtrees = iterator->subtrees;\n if (!should_stop) {\n ts_subtree_array_copy(subtrees, &subtrees);\n }\n ts_subtree_array_reverse(&subtrees);\n ts_stack__add_slice(\n self,\n version,\n node,\n &subtrees\n );\n }\n\n if (should_stop) {\n if (!should_pop) {\n ts_subtree_array_delete(self->subtree_pool, &iterator->subtrees);\n }\n array_erase(&self->iterators, i);\n i--, size--;\n continue;\n }\n\n for (uint32_t j = 1; j <= node->link_count; j++) {\n StackIterator *next_iterator;\n StackLink link;\n if (j == node->link_count) {\n link = node->links[0];\n next_iterator = array_get(&self->iterators, i);\n } else {\n if (self->iterators.size >= MAX_ITERATOR_COUNT) continue;\n link = node->links[j];\n StackIterator current_iterator = *array_get(&self->iterators, i);\n array_push(&self->iterators, current_iterator);\n next_iterator = array_back(&self->iterators);\n ts_subtree_array_copy(next_iterator->subtrees, &next_iterator->subtrees);\n }\n\n next_iterator->node = link.node;\n if (link.subtree.ptr) {\n if (include_subtrees) {\n array_push(&next_iterator->subtrees, link.subtree);\n ts_subtree_retain(link.subtree);\n }\n\n if (!ts_subtree_extra(link.subtree)) {\n next_iterator->subtree_count++;\n if (!link.is_pending) {\n next_iterator->is_pending = false;\n }\n }\n } else {\n next_iterator->subtree_count++;\n next_iterator->is_pending = false;\n }\n }\n }\n }\n\n return self->slices;\n}\n\nStack *ts_stack_new(SubtreePool *subtree_pool) {\n Stack *self = ts_calloc(1, sizeof(Stack));\n\n array_init(&self->heads);\n array_init(&self->slices);\n array_init(&self->iterators);\n array_init(&self->node_pool);\n array_reserve(&self->heads, 4);\n array_reserve(&self->slices, 4);\n array_reserve(&self->iterators, 4);\n array_reserve(&self->node_pool, MAX_NODE_POOL_SIZE);\n\n self->subtree_pool = subtree_pool;\n self->base_node = stack_node_new(NULL, NULL_SUBTREE, false, 1, &self->node_pool);\n ts_stack_clear(self);\n\n return self;\n}\n\nvoid ts_stack_delete(Stack *self) {\n if (self->slices.contents)\n array_delete(&self->slices);\n if (self->iterators.contents)\n array_delete(&self->iterators);\n stack_node_release(self->base_node, &self->node_pool, self->subtree_pool);\n for (uint32_t i = 0; i < self->heads.size; i++) {\n stack_head_delete(array_get(&self->heads, i), &self->node_pool, self->subtree_pool);\n }\n array_clear(&self->heads);\n if (self->node_pool.contents) {\n for (uint32_t i = 0; i < self->node_pool.size; i++)\n ts_free(*array_get(&self->node_pool, i));\n array_delete(&self->node_pool);\n }\n array_delete(&self->heads);\n ts_free(self);\n}\n\nuint32_t ts_stack_version_count(const Stack *self) {\n return self->heads.size;\n}\n\nuint32_t ts_stack_halted_version_count(Stack *self) {\n uint32_t count = 0;\n for (uint32_t i = 0; i < self->heads.size; i++) {\n StackHead *head = array_get(&self->heads, i);\n if (head->status == StackStatusHalted) {\n count++;\n }\n }\n return count;\n}\n\nTSStateId ts_stack_state(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->node->state;\n}\n\nLength ts_stack_position(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->node->position;\n}\n\nSubtree ts_stack_last_external_token(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->last_external_token;\n}\n\nvoid ts_stack_set_last_external_token(Stack *self, StackVersion version, Subtree token) {\n StackHead *head = array_get(&self->heads, version);\n if (token.ptr) ts_subtree_retain(token);\n if (head->last_external_token.ptr) ts_subtree_release(self->subtree_pool, head->last_external_token);\n head->last_external_token = token;\n}\n\nunsigned ts_stack_error_cost(const Stack *self, StackVersion version) {\n StackHead *head = array_get(&self->heads, version);\n unsigned result = head->node->error_cost;\n if (\n head->status == StackStatusPaused ||\n (head->node->state == ERROR_STATE && !head->node->links[0].subtree.ptr)) {\n result += ERROR_COST_PER_RECOVERY;\n }\n return result;\n}\n\nunsigned ts_stack_node_count_since_error(const Stack *self, StackVersion version) {\n StackHead *head = array_get(&self->heads, version);\n if (head->node->node_count < head->node_count_at_last_error) {\n head->node_count_at_last_error = head->node->node_count;\n }\n return head->node->node_count - head->node_count_at_last_error;\n}\n\nvoid ts_stack_push(\n Stack *self,\n StackVersion version,\n Subtree subtree,\n bool pending,\n TSStateId state\n) {\n StackHead *head = array_get(&self->heads, version);\n StackNode *new_node = stack_node_new(head->node, subtree, pending, state, &self->node_pool);\n if (!subtree.ptr) head->node_count_at_last_error = new_node->node_count;\n head->node = new_node;\n}\n\nforceinline StackAction pop_count_callback(void *payload, const StackIterator *iterator) {\n unsigned *goal_subtree_count = payload;\n if (iterator->subtree_count == *goal_subtree_count) {\n return StackActionPop | StackActionStop;\n } else {\n return StackActionNone;\n }\n}\n\nStackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, uint32_t count) {\n return stack__iter(self, version, pop_count_callback, &count, (int)count);\n}\n\n\nforceinline StackAction pop_pending_callback(void *payload, const StackIterator *iterator) {\n (void)payload;\n if (iterator->subtree_count >= 1) {\n if (iterator->is_pending) {\n return StackActionPop | StackActionStop;\n } else {\n return StackActionStop;\n }\n } else {\n return StackActionNone;\n }\n}\n\nStackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version) {\n StackSliceArray pop = stack__iter(self, version, pop_pending_callback, NULL, 0);\n if (pop.size > 0) {\n ts_stack_renumber_version(self, array_get(&pop, 0)->version, version);\n array_get(&pop, 0)->version = version;\n }\n return pop;\n}\n\nforceinline StackAction pop_error_callback(void *payload, const StackIterator *iterator) {\n if (iterator->subtrees.size > 0) {\n bool *found_error = payload;\n if (!*found_error && ts_subtree_is_error(*array_get(&iterator->subtrees, 0))) {\n *found_error = true;\n return StackActionPop | StackActionStop;\n } else {\n return StackActionStop;\n }\n } else {\n return StackActionNone;\n }\n}\n\nSubtreeArray ts_stack_pop_error(Stack *self, StackVersion version) {\n StackNode *node = array_get(&self->heads, version)->node;\n for (unsigned i = 0; i < node->link_count; i++) {\n if (node->links[i].subtree.ptr && ts_subtree_is_error(node->links[i].subtree)) {\n bool found_error = false;\n StackSliceArray pop = stack__iter(self, version, pop_error_callback, &found_error, 1);\n if (pop.size > 0) {\n ts_assert(pop.size == 1);\n ts_stack_renumber_version(self, array_get(&pop, 0)->version, version);\n return array_get(&pop, 0)->subtrees;\n }\n break;\n }\n }\n return (SubtreeArray) {.size = 0};\n}\n\nforceinline StackAction pop_all_callback(void *payload, const StackIterator *iterator) {\n (void)payload;\n return iterator->node->link_count == 0 ? StackActionPop : StackActionNone;\n}\n\nStackSliceArray ts_stack_pop_all(Stack *self, StackVersion version) {\n return stack__iter(self, version, pop_all_callback, NULL, 0);\n}\n\ntypedef struct {\n StackSummary *summary;\n unsigned max_depth;\n} SummarizeStackSession;\n\nforceinline StackAction summarize_stack_callback(void *payload, const StackIterator *iterator) {\n SummarizeStackSession *session = payload;\n TSStateId state = iterator->node->state;\n unsigned depth = iterator->subtree_count;\n if (depth > session->max_depth) return StackActionStop;\n for (unsigned i = session->summary->size - 1; i + 1 > 0; i--) {\n StackSummaryEntry entry = *array_get(session->summary, i);\n if (entry.depth < depth) break;\n if (entry.depth == depth && entry.state == state) return StackActionNone;\n }\n array_push(session->summary, ((StackSummaryEntry) {\n .position = iterator->node->position,\n .depth = depth,\n .state = state,\n }));\n return StackActionNone;\n}\n\nvoid ts_stack_record_summary(Stack *self, StackVersion version, unsigned max_depth) {\n SummarizeStackSession session = {\n .summary = ts_malloc(sizeof(StackSummary)),\n .max_depth = max_depth\n };\n array_init(session.summary);\n stack__iter(self, version, summarize_stack_callback, &session, -1);\n StackHead *head = array_get(&self->heads, version);\n if (head->summary) {\n array_delete(head->summary);\n ts_free(head->summary);\n }\n head->summary = session.summary;\n}\n\nStackSummary *ts_stack_get_summary(Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->summary;\n}\n\nint ts_stack_dynamic_precedence(Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->node->dynamic_precedence;\n}\n\nbool ts_stack_has_advanced_since_error(const Stack *self, StackVersion version) {\n const StackHead *head = array_get(&self->heads, version);\n const StackNode *node = head->node;\n if (node->error_cost == 0) return true;\n while (node) {\n if (node->link_count > 0) {\n Subtree subtree = node->links[0].subtree;\n if (subtree.ptr) {\n if (ts_subtree_total_bytes(subtree) > 0) {\n return true;\n } else if (\n node->node_count > head->node_count_at_last_error &&\n ts_subtree_error_cost(subtree) == 0\n ) {\n node = node->links[0].node;\n continue;\n }\n }\n }\n break;\n }\n return false;\n}\n\nvoid ts_stack_remove_version(Stack *self, StackVersion version) {\n stack_head_delete(array_get(&self->heads, version), &self->node_pool, self->subtree_pool);\n array_erase(&self->heads, version);\n}\n\nvoid ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) {\n if (v1 == v2) return;\n ts_assert(v2 < v1);\n ts_assert((uint32_t)v1 < self->heads.size);\n StackHead *source_head = array_get(&self->heads, v1);\n StackHead *target_head = array_get(&self->heads, v2);\n if (target_head->summary && !source_head->summary) {\n source_head->summary = target_head->summary;\n target_head->summary = NULL;\n }\n stack_head_delete(target_head, &self->node_pool, self->subtree_pool);\n *target_head = *source_head;\n array_erase(&self->heads, v1);\n}\n\nvoid ts_stack_swap_versions(Stack *self, StackVersion v1, StackVersion v2) {\n StackHead temporary_head = *array_get(&self->heads, v1);\n *array_get(&self->heads, v1) = *array_get(&self->heads, v2);\n *array_get(&self->heads, v2) = temporary_head;\n}\n\nStackVersion ts_stack_copy_version(Stack *self, StackVersion version) {\n ts_assert(version < self->heads.size);\n StackHead version_head = *array_get(&self->heads, version);\n array_push(&self->heads, version_head);\n StackHead *head = array_back(&self->heads);\n stack_node_retain(head->node);\n if (head->last_external_token.ptr) ts_subtree_retain(head->last_external_token);\n head->summary = NULL;\n return self->heads.size - 1;\n}\n\nbool ts_stack_merge(Stack *self, StackVersion version1, StackVersion version2) {\n if (!ts_stack_can_merge(self, version1, version2)) return false;\n StackHead *head1 = array_get(&self->heads, version1);\n StackHead *head2 = array_get(&self->heads, version2);\n for (uint32_t i = 0; i < head2->node->link_count; i++) {\n stack_node_add_link(head1->node, head2->node->links[i], self->subtree_pool);\n }\n if (head1->node->state == ERROR_STATE) {\n head1->node_count_at_last_error = head1->node->node_count;\n }\n ts_stack_remove_version(self, version2);\n return true;\n}\n\nbool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion version2) {\n StackHead *head1 = array_get(&self->heads, version1);\n StackHead *head2 = array_get(&self->heads, version2);\n return\n head1->status == StackStatusActive &&\n head2->status == StackStatusActive &&\n head1->node->state == head2->node->state &&\n head1->node->position.bytes == head2->node->position.bytes &&\n head1->node->error_cost == head2->node->error_cost &&\n ts_subtree_external_scanner_state_eq(head1->last_external_token, head2->last_external_token);\n}\n\nvoid ts_stack_halt(Stack *self, StackVersion version) {\n array_get(&self->heads, version)->status = StackStatusHalted;\n}\n\nvoid ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead) {\n StackHead *head = array_get(&self->heads, version);\n head->status = StackStatusPaused;\n head->lookahead_when_paused = lookahead;\n head->node_count_at_last_error = head->node->node_count;\n}\n\nbool ts_stack_is_active(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->status == StackStatusActive;\n}\n\nbool ts_stack_is_halted(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->status == StackStatusHalted;\n}\n\nbool ts_stack_is_paused(const Stack *self, StackVersion version) {\n return array_get(&self->heads, version)->status == StackStatusPaused;\n}\n\nSubtree ts_stack_resume(Stack *self, StackVersion version) {\n StackHead *head = array_get(&self->heads, version);\n ts_assert(head->status == StackStatusPaused);\n Subtree result = head->lookahead_when_paused;\n head->status = StackStatusActive;\n head->lookahead_when_paused = NULL_SUBTREE;\n return result;\n}\n\nvoid ts_stack_clear(Stack *self) {\n stack_node_retain(self->base_node);\n for (uint32_t i = 0; i < self->heads.size; i++) {\n stack_head_delete(array_get(&self->heads, i), &self->node_pool, self->subtree_pool);\n }\n array_clear(&self->heads);\n array_push(&self->heads, ((StackHead) {\n .node = self->base_node,\n .status = StackStatusActive,\n .last_external_token = NULL_SUBTREE,\n .lookahead_when_paused = NULL_SUBTREE,\n }));\n}\n\nbool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, FILE *f) {\n array_reserve(&self->iterators, 32);\n if (!f) f = stderr;\n\n fprintf(f, \"digraph stack {\\n\");\n fprintf(f, \"rankdir=\\\"RL\\\";\\n\");\n fprintf(f, \"edge [arrowhead=none]\\n\");\n\n Array(StackNode *) visited_nodes = array_new();\n\n array_clear(&self->iterators);\n for (uint32_t i = 0; i < self->heads.size; i++) {\n StackHead *head = array_get(&self->heads, i);\n if (head->status == StackStatusHalted) continue;\n\n fprintf(f, \"node_head_%u [shape=none, label=\\\"\\\"]\\n\", i);\n fprintf(f, \"node_head_%u -> node_%p [\", i, (void *)head->node);\n\n if (head->status == StackStatusPaused) {\n fprintf(f, \"color=red \");\n }\n fprintf(f,\n \"label=%u, fontcolor=blue, weight=10000, labeltooltip=\\\"node_count: %u\\nerror_cost: %u\",\n i,\n ts_stack_node_count_since_error(self, i),\n ts_stack_error_cost(self, i)\n );\n\n if (head->summary) {\n fprintf(f, \"\\nsummary:\");\n for (uint32_t j = 0; j < head->summary->size; j++) fprintf(f, \" %u\", array_get(head->summary, j)->state);\n }\n\n if (head->last_external_token.ptr) {\n const ExternalScannerState *state = &head->last_external_token.ptr->external_scanner_state;\n const char *data = ts_external_scanner_state_data(state);\n fprintf(f, \"\\nexternal_scanner_state:\");\n for (uint32_t j = 0; j < state->length; j++) fprintf(f, \" %2X\", data[j]);\n }\n\n fprintf(f, \"\\\"]\\n\");\n array_push(&self->iterators, ((StackIterator) {\n .node = head->node\n }));\n }\n\n bool all_iterators_done = false;\n while (!all_iterators_done) {\n all_iterators_done = true;\n\n for (uint32_t i = 0; i < self->iterators.size; i++) {\n StackIterator iterator = *array_get(&self->iterators, i);\n StackNode *node = iterator.node;\n\n for (uint32_t j = 0; j < visited_nodes.size; j++) {\n if (*array_get(&visited_nodes, j) == node) {\n node = NULL;\n break;\n }\n }\n\n if (!node) continue;\n all_iterators_done = false;\n\n fprintf(f, \"node_%p [\", (void *)node);\n if (node->state == ERROR_STATE) {\n fprintf(f, \"label=\\\"?\\\"\");\n } else if (\n node->link_count == 1 &&\n node->links[0].subtree.ptr &&\n ts_subtree_extra(node->links[0].subtree)\n ) {\n fprintf(f, \"shape=point margin=0 label=\\\"\\\"\");\n } else {\n fprintf(f, \"label=\\\"%d\\\"\", node->state);\n }\n\n fprintf(\n f,\n \" tooltip=\\\"position: %u,%u\\nnode_count:%u\\nerror_cost: %u\\ndynamic_precedence: %d\\\"];\\n\",\n node->position.extent.row + 1,\n node->position.extent.column,\n node->node_count,\n node->error_cost,\n node->dynamic_precedence\n );\n\n for (int j = 0; j < node->link_count; j++) {\n StackLink link = node->links[j];\n fprintf(f, \"node_%p -> node_%p [\", (void *)node, (void *)link.node);\n if (link.is_pending) fprintf(f, \"style=dashed \");\n if (link.subtree.ptr && ts_subtree_extra(link.subtree)) fprintf(f, \"fontcolor=gray \");\n\n if (!link.subtree.ptr) {\n fprintf(f, \"color=red\");\n } else {\n fprintf(f, \"label=\\\"\");\n bool quoted = ts_subtree_visible(link.subtree) && !ts_subtree_named(link.subtree);\n if (quoted) fprintf(f, \"'\");\n ts_language_write_symbol_as_dot_string(language, f, ts_subtree_symbol(link.subtree));\n if (quoted) fprintf(f, \"'\");\n fprintf(f, \"\\\"\");\n fprintf(\n f,\n \"labeltooltip=\\\"error_cost: %u\\ndynamic_precedence: %\" PRId32 \"\\\"\",\n ts_subtree_error_cost(link.subtree),\n ts_subtree_dynamic_precedence(link.subtree)\n );\n }\n\n fprintf(f, \"];\\n\");\n\n StackIterator *next_iterator;\n if (j == 0) {\n next_iterator = array_get(&self->iterators, i);\n } else {\n array_push(&self->iterators, iterator);\n next_iterator = array_back(&self->iterators);\n }\n next_iterator->node = link.node;\n }\n\n array_push(&visited_nodes, node);\n }\n }\n\n fprintf(f, \"}\\n\");\n\n array_delete(&visited_nodes);\n return true;\n}\n\n#undef forceinline\n",
44
- "#ifndef TREE_SITTER_ATOMIC_H_\n#define TREE_SITTER_ATOMIC_H_\n\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#ifdef __TINYC__\n\nstatic inline size_t atomic_load(const volatile size_t *p) {\n return *p;\n}\n\nstatic inline uint32_t atomic_inc(volatile uint32_t *p) {\n *p += 1;\n return *p;\n}\n\nstatic inline uint32_t atomic_dec(volatile uint32_t *p) {\n *p-= 1;\n return *p;\n}\n\n#elif defined(_WIN32)\n\n#include <windows.h>\n\nstatic inline size_t atomic_load(const volatile size_t *p) {\n return *p;\n}\n\nstatic inline uint32_t atomic_inc(volatile uint32_t *p) {\n return InterlockedIncrement((long volatile *)p);\n}\n\nstatic inline uint32_t atomic_dec(volatile uint32_t *p) {\n return InterlockedDecrement((long volatile *)p);\n}\n\n#else\n\nstatic inline size_t atomic_load(const volatile size_t *p) {\n#ifdef __ATOMIC_RELAXED\n return __atomic_load_n(p, __ATOMIC_RELAXED);\n#else\n return __sync_fetch_and_add((volatile size_t *)p, 0);\n#endif\n}\n\nstatic inline uint32_t atomic_inc(volatile uint32_t *p) {\n #ifdef __ATOMIC_RELAXED\n return __atomic_add_fetch(p, 1U, __ATOMIC_SEQ_CST);\n #else\n return __sync_add_and_fetch(p, 1U);\n #endif\n}\n\nstatic inline uint32_t atomic_dec(volatile uint32_t *p) {\n #ifdef __ATOMIC_RELAXED\n return __atomic_sub_fetch(p, 1U, __ATOMIC_SEQ_CST);\n #else\n return __sync_sub_and_fetch(p, 1U);\n #endif\n}\n\n#endif\n\n#endif // TREE_SITTER_ATOMIC_H_\n",
45
- "#include \"./subtree.h\"\n\ntypedef struct {\n Subtree tree;\n uint32_t child_index;\n uint32_t byte_offset;\n} StackEntry;\n\ntypedef struct {\n Array(StackEntry) stack;\n Subtree last_external_token;\n} ReusableNode;\n\nstatic inline ReusableNode reusable_node_new(void) {\n return (ReusableNode) {array_new(), NULL_SUBTREE};\n}\n\nstatic inline void reusable_node_clear(ReusableNode *self) {\n array_clear(&self->stack);\n self->last_external_token = NULL_SUBTREE;\n}\n\nstatic inline Subtree reusable_node_tree(ReusableNode *self) {\n return self->stack.size > 0\n ? self->stack.contents[self->stack.size - 1].tree\n : NULL_SUBTREE;\n}\n\nstatic inline uint32_t reusable_node_byte_offset(ReusableNode *self) {\n return self->stack.size > 0\n ? self->stack.contents[self->stack.size - 1].byte_offset\n : UINT32_MAX;\n}\n\nstatic inline void reusable_node_delete(ReusableNode *self) {\n array_delete(&self->stack);\n}\n\nstatic inline void reusable_node_advance(ReusableNode *self) {\n StackEntry last_entry = *array_back(&self->stack);\n uint32_t byte_offset = last_entry.byte_offset + ts_subtree_total_bytes(last_entry.tree);\n if (ts_subtree_has_external_tokens(last_entry.tree)) {\n self->last_external_token = ts_subtree_last_external_token(last_entry.tree);\n }\n\n Subtree tree;\n uint32_t next_index;\n do {\n StackEntry popped_entry = array_pop(&self->stack);\n next_index = popped_entry.child_index + 1;\n if (self->stack.size == 0) return;\n tree = array_back(&self->stack)->tree;\n } while (ts_subtree_child_count(tree) <= next_index);\n\n array_push(&self->stack, ((StackEntry) {\n .tree = ts_subtree_children(tree)[next_index],\n .child_index = next_index,\n .byte_offset = byte_offset,\n }));\n}\n\nstatic inline bool reusable_node_descend(ReusableNode *self) {\n StackEntry last_entry = *array_back(&self->stack);\n if (ts_subtree_child_count(last_entry.tree) > 0) {\n array_push(&self->stack, ((StackEntry) {\n .tree = ts_subtree_children(last_entry.tree)[0],\n .child_index = 0,\n .byte_offset = last_entry.byte_offset,\n }));\n return true;\n } else {\n return false;\n }\n}\n\nstatic inline void reusable_node_advance_past_leaf(ReusableNode *self) {\n while (reusable_node_descend(self)) {}\n reusable_node_advance(self);\n}\n\nstatic inline void reusable_node_reset(ReusableNode *self, Subtree tree) {\n reusable_node_clear(self);\n array_push(&self->stack, ((StackEntry) {\n .tree = tree,\n .child_index = 0,\n .byte_offset = 0,\n }));\n\n // Never reuse the root node, because it has a non-standard internal structure\n // due to transformations that are applied when it is accepted: adding the EOF\n // child and any extra children.\n if (!reusable_node_descend(self)) {\n reusable_node_clear(self);\n }\n}\n",
46
- "#ifndef TREE_SITTER_REDUCE_ACTION_H_\n#define TREE_SITTER_REDUCE_ACTION_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"./array.h\"\n#include \"tree_sitter/api.h\"\n\ntypedef struct {\n uint32_t count;\n TSSymbol symbol;\n int dynamic_precedence;\n unsigned short production_id;\n} ReduceAction;\n\ntypedef Array(ReduceAction) ReduceActionSet;\n\nstatic inline void ts_reduce_action_set_add(ReduceActionSet *self,\n ReduceAction new_action) {\n for (uint32_t i = 0; i < self->size; i++) {\n ReduceAction action = self->contents[i];\n if (action.symbol == new_action.symbol && action.count == new_action.count)\n return;\n }\n array_push(self, new_action);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_REDUCE_ACTION_H_\n",
47
- "/*\n * On NetBSD, defining standard requirements like this removes symbols\n * from the namespace; however, we need non-standard symbols for\n * endian.h.\n */\n#if defined(__NetBSD__) && defined(_POSIX_C_SOURCE)\n#undef _POSIX_C_SOURCE\n#endif\n\n#include \"tree_sitter/api.h\"\n#include \"./alloc.h\"\n#include \"./array.h\"\n#include \"./language.h\"\n#include \"./point.h\"\n#include \"./tree_cursor.h\"\n#include \"./unicode.h\"\n#include <wctype.h>\n\n// #define DEBUG_ANALYZE_QUERY\n// #define DEBUG_EXECUTE_QUERY\n\n#define MAX_STEP_CAPTURE_COUNT 3\n#define MAX_NEGATED_FIELD_COUNT 8\n#define MAX_STATE_PREDECESSOR_COUNT 256\n#define MAX_ANALYSIS_STATE_DEPTH 8\n#define MAX_ANALYSIS_ITERATION_COUNT 256\n\n/*\n * Stream - A sequence of unicode characters derived from a UTF8 string.\n * This struct is used in parsing queries from S-expressions.\n */\ntypedef struct {\n const char *input;\n const char *start;\n const char *end;\n int32_t next;\n uint8_t next_size;\n} Stream;\n\n/*\n * QueryStep - A step in the process of matching a query. Each node within\n * a query S-expression corresponds to one of these steps. An entire pattern\n * is represented as a sequence of these steps. The basic properties of a\n * node are represented by these fields:\n * - `symbol` - The grammar symbol to match. A zero value represents the\n * wildcard symbol, '_'.\n * - `field` - The field name to match. A zero value means that a field name\n * was not specified.\n * - `capture_ids` - An array of integers representing the names of captures\n * associated with this node in the pattern, terminated by a `NONE` value.\n * - `depth` - The depth where this node occurs in the pattern. The root node\n * of the pattern has depth zero.\n * - `negated_field_list_id` - An id representing a set of fields that must\n * not be present on a node matching this step.\n *\n * Steps have some additional fields in order to handle the `.` (or \"anchor\") operator,\n * which forbids additional child nodes:\n * - `is_immediate` - Indicates that the node matching this step cannot be preceded\n * by other sibling nodes that weren't specified in the pattern.\n * - `is_last_child` - Indicates that the node matching this step cannot have any\n * subsequent named siblings.\n *\n * For simple patterns, steps are matched in sequential order. But in order to\n * handle alternative/repeated/optional sub-patterns, query steps are not always\n * structured as a linear sequence; they sometimes need to split and merge. This\n * is done using the following fields:\n * - `alternative_index` - The index of a different query step that serves as\n * an alternative to this step. A `NONE` value represents no alternative.\n * When a query state reaches a step with an alternative index, the state\n * is duplicated, with one copy remaining at the original step, and one copy\n * moving to the alternative step. The alternative may have its own alternative\n * step, so this splitting is an iterative process.\n * - `is_dead_end` - Indicates that this state cannot be passed directly, and\n * exists only in order to redirect to an alternative index, with no splitting.\n * - `is_pass_through` - Indicates that state has no matching logic of its own,\n * and exists only to split a state. One copy of the state advances immediately\n * to the next step, and one moves to the alternative step.\n * - `is_inside_alternation` - Indicates that state is inside an alternation.\n * Currently only written to quantifier steps, read by logic that maintains\n * correctness for quantifiers inside alternations.\n *\n * Steps also store some derived state that summarizes how they relate to other\n * steps within the same pattern. This is used to optimize the matching process:\n * - `contains_captures` - Indicates that this step or one of its child steps\n * has a non-empty `capture_ids` list.\n * - `parent_pattern_guaranteed` - Indicates that if this step is reached, then\n * it and all of its subsequent sibling steps within the same parent pattern\n * are guaranteed to match.\n * - `root_pattern_guaranteed` - Similar to `parent_pattern_guaranteed`, but\n * for the entire top-level pattern. When iterating through a query's\n * captures using `ts_query_cursor_next_capture`, this field is used to\n * detect that a capture can safely be returned from a match that has not\n * even completed yet.\n */\ntypedef struct {\n TSSymbol symbol;\n TSSymbol supertype_symbol;\n TSFieldId field;\n uint16_t capture_ids[MAX_STEP_CAPTURE_COUNT];\n uint16_t depth;\n uint16_t alternative_index;\n uint16_t negated_field_list_id;\n bool is_named: 1;\n bool is_immediate: 1;\n bool is_last_child: 1;\n bool is_pass_through: 1;\n bool is_dead_end: 1;\n bool is_inside_alternation: 1;\n bool contains_captures: 1;\n bool root_pattern_guaranteed: 1;\n bool parent_pattern_guaranteed: 1;\n bool is_missing: 1;\n} QueryStep;\n\n/*\n * Slice - A slice of an external array. Within a query, capture names,\n * literal string values, and predicate step information are stored in three\n * contiguous arrays. Individual captures, string values, and predicates are\n * represented as slices of these three arrays.\n */\ntypedef struct {\n uint32_t offset;\n uint32_t length;\n} Slice;\n\n/*\n * SymbolTable - a two-way mapping of strings to ids.\n */\ntypedef struct {\n Array(char) characters;\n Array(Slice) slices;\n} SymbolTable;\n\n/**\n * CaptureQuantifiers - a data structure holding the quantifiers of pattern captures.\n */\ntypedef Array(uint8_t) CaptureQuantifiers;\n\n/*\n * PatternEntry - Information about the starting point for matching a particular\n * pattern. These entries are stored in a 'pattern map' - a sorted array that\n * makes it possible to efficiently lookup patterns based on the symbol for their\n * first step. The entry consists of the following fields:\n * - `pattern_index` - the index of the pattern within the query\n * - `step_index` - the index of the pattern's first step in the shared `steps` array\n * - `is_rooted` - whether or not the pattern has a single root node. This property\n * affects decisions about whether or not to start the pattern for nodes outside\n * of a QueryCursor's range restriction.\n */\ntypedef struct {\n uint16_t step_index;\n uint16_t pattern_index;\n bool is_rooted;\n} PatternEntry;\n\ntypedef struct {\n Slice steps;\n Slice predicate_steps;\n uint32_t start_byte;\n uint32_t end_byte;\n bool is_non_local;\n} QueryPattern;\n\ntypedef struct {\n uint32_t byte_offset;\n uint16_t step_index;\n} StepOffset;\n\n/*\n * QueryState - The state of an in-progress match of a particular pattern\n * in a query. While executing, a `TSQueryCursor` must keep track of a number\n * of possible in-progress matches. Each of those possible matches is\n * represented as one of these states. Fields:\n * - `id` - A numeric id that is exposed to the public API. This allows the\n * caller to remove a given match, preventing any more of its captures\n * from being returned.\n * - `start_depth` - The depth in the tree where the first step of the state's\n * pattern was matched.\n * - `pattern_index` - The pattern that the state is matching.\n * - `consumed_capture_count` - The number of captures from this match that\n * have already been returned.\n * - `capture_list_id` - A numeric id that can be used to retrieve the state's\n * list of captures from the `CaptureListPool`.\n * - `seeking_immediate_match` - A flag that indicates that the state's next\n * step must be matched by the very next sibling. This is used when\n * processing repetitions, or when processing a wildcard node followed by\n * an anchor.\n * - `has_in_progress_alternatives` - A flag that indicates that there is are\n * other states that have the same captures as this state, but are at\n * different steps in their pattern. This means that in order to obey the\n * 'longest-match' rule, this state should not be returned as a match until\n * it is clear that there can be no other alternative match with more captures.\n */\ntypedef struct {\n uint32_t id;\n uint32_t capture_list_id;\n uint16_t start_depth;\n uint16_t step_index;\n uint16_t pattern_index;\n uint16_t consumed_capture_count: 12;\n bool seeking_immediate_match: 1;\n bool has_in_progress_alternatives: 1;\n bool dead: 1;\n bool needs_parent: 1;\n} QueryState;\n\ntypedef Array(TSQueryCapture) CaptureList;\n\n/*\n * CaptureListPool - A collection of *lists* of captures. Each query state needs\n * to maintain its own list of captures. To avoid repeated allocations, this struct\n * maintains a fixed set of capture lists, and keeps track of which ones are\n * currently in use by a query state.\n */\ntypedef struct {\n Array(CaptureList) list;\n CaptureList empty_list;\n // The maximum number of capture lists that we are allowed to allocate. We\n // never allow `list` to allocate more entries than this, dropping pending\n // matches if needed to stay under the limit.\n uint32_t max_capture_list_count;\n // The number of capture lists allocated in `list` that are not currently in\n // use. We reuse those existing-but-unused capture lists before trying to\n // allocate any new ones. We use an invalid value (UINT32_MAX) for a capture\n // list's length to indicate that it's not in use.\n uint32_t free_capture_list_count;\n} CaptureListPool;\n\n/*\n * AnalysisState - The state needed for walking the parse table when analyzing\n * a query pattern, to determine at which steps the pattern might fail to match.\n */\ntypedef struct {\n TSStateId parse_state;\n TSSymbol parent_symbol;\n uint16_t child_index;\n TSFieldId field_id: 15;\n bool done: 1;\n} AnalysisStateEntry;\n\ntypedef struct {\n AnalysisStateEntry stack[MAX_ANALYSIS_STATE_DEPTH];\n uint16_t depth;\n uint16_t step_index;\n TSSymbol root_symbol;\n} AnalysisState;\n\ntypedef Array(AnalysisState *) AnalysisStateSet;\n\ntypedef struct {\n AnalysisStateSet states;\n AnalysisStateSet next_states;\n AnalysisStateSet deeper_states;\n AnalysisStateSet state_pool;\n Array(uint16_t) final_step_indices;\n Array(TSSymbol) finished_parent_symbols;\n bool did_abort;\n} QueryAnalysis;\n\n/*\n * AnalysisSubgraph - A subset of the states in the parse table that are used\n * in constructing nodes with a certain symbol. Each state is accompanied by\n * some information about the possible node that could be produced in\n * downstream states.\n */\ntypedef struct {\n TSStateId state;\n uint16_t production_id;\n uint8_t child_index: 7;\n bool done: 1;\n} AnalysisSubgraphNode;\n\ntypedef struct {\n TSSymbol symbol;\n Array(TSStateId) start_states;\n Array(AnalysisSubgraphNode) nodes;\n} AnalysisSubgraph;\n\ntypedef Array(AnalysisSubgraph) AnalysisSubgraphArray;\n\n/*\n * StatePredecessorMap - A map that stores the predecessors of each parse state.\n * This is used during query analysis to determine which parse states can lead\n * to which reduce actions.\n */\ntypedef struct {\n TSStateId *contents;\n} StatePredecessorMap;\n\n/*\n * TSQuery - A tree query, compiled from a string of S-expressions. The query\n * itself is immutable. The mutable state used in the process of executing the\n * query is stored in a `TSQueryCursor`.\n */\nstruct TSQuery {\n SymbolTable captures;\n SymbolTable predicate_values;\n Array(CaptureQuantifiers) capture_quantifiers;\n Array(QueryStep) steps;\n Array(PatternEntry) pattern_map;\n Array(TSQueryPredicateStep) predicate_steps;\n Array(QueryPattern) patterns;\n Array(StepOffset) step_offsets;\n Array(TSFieldId) negated_fields;\n Array(char) string_buffer;\n Array(TSSymbol) repeat_symbols_with_rootless_patterns;\n const TSLanguage *language;\n uint16_t wildcard_root_pattern_count;\n};\n\n/*\n * TSQueryCursor - A stateful struct used to execute a query on a tree.\n */\nstruct TSQueryCursor {\n const TSQuery *query;\n TSTreeCursor cursor;\n Array(QueryState) states;\n Array(QueryState) finished_states;\n CaptureListPool capture_list_pool;\n uint32_t depth;\n uint32_t max_start_depth;\n TSRange included_range;\n TSRange containing_range;\n uint32_t next_state_id;\n const TSQueryCursorOptions *query_options;\n TSQueryCursorState query_state;\n unsigned operation_count;\n bool on_visible_node;\n bool ascending;\n bool halted;\n bool did_exceed_match_limit;\n};\n\nstatic const TSQueryError PARENT_DONE = -1;\nstatic const uint16_t PATTERN_DONE_MARKER = UINT16_MAX;\nstatic const uint16_t NONE = UINT16_MAX;\nstatic const TSSymbol WILDCARD_SYMBOL = 0;\nstatic const unsigned OP_COUNT_PER_QUERY_CALLBACK_CHECK = 100;\n\n/**********\n * Stream\n **********/\n\n// Advance to the next unicode code point in the stream.\nstatic bool stream_advance(Stream *self) {\n self->input += self->next_size;\n if (self->input < self->end) {\n uint32_t size = ts_decode_utf8(\n (const uint8_t *)self->input,\n (uint32_t)(self->end - self->input),\n &self->next\n );\n if (size > 0) {\n self->next_size = size;\n return true;\n }\n } else {\n self->next_size = 0;\n self->next = '\\0';\n }\n return false;\n}\n\n// Reset the stream to the given input position, represented as a pointer\n// into the input string.\nstatic void stream_reset(Stream *self, const char *input) {\n self->input = input;\n self->next_size = 0;\n stream_advance(self);\n}\n\nstatic Stream stream_new(const char *string, uint32_t length) {\n Stream self = {\n .next = 0,\n .input = string,\n .start = string,\n .end = string + length,\n };\n stream_advance(&self);\n return self;\n}\n\nstatic void stream_skip_whitespace(Stream *self) {\n for (;;) {\n if (iswspace(self->next)) {\n stream_advance(self);\n } else if (self->next == ';') {\n // skip over comments\n stream_advance(self);\n while (self->next && self->next != '\\n') {\n if (!stream_advance(self)) break;\n }\n } else {\n break;\n }\n }\n}\n\nstatic bool stream_is_ident_start(Stream *self) {\n return iswalnum(self->next) || self->next == '_' || self->next == '-';\n}\n\nstatic void stream_scan_identifier(Stream *stream) {\n do {\n stream_advance(stream);\n } while (\n iswalnum(stream->next) ||\n stream->next == '_' ||\n stream->next == '-' ||\n stream->next == '.'\n );\n}\n\nstatic uint32_t stream_offset(Stream *self) {\n return (uint32_t)(self->input - self->start);\n}\n\n/******************\n * CaptureListPool\n ******************/\n\nstatic CaptureListPool capture_list_pool_new(void) {\n return (CaptureListPool) {\n .list = array_new(),\n .empty_list = array_new(),\n .max_capture_list_count = UINT32_MAX,\n .free_capture_list_count = 0,\n };\n}\n\nstatic void capture_list_pool_reset(CaptureListPool *self) {\n for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) {\n // This invalid size means that the list is not in use.\n array_get(&self->list, i)->size = UINT32_MAX;\n }\n self->free_capture_list_count = self->list.size;\n}\n\nstatic void capture_list_pool_delete(CaptureListPool *self) {\n for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) {\n array_delete(array_get(&self->list, i));\n }\n array_delete(&self->list);\n}\n\nstatic const CaptureList *capture_list_pool_get(const CaptureListPool *self, uint16_t id) {\n if (id >= self->list.size) return &self->empty_list;\n return array_get(&self->list, id);\n}\n\nstatic CaptureList *capture_list_pool_get_mut(CaptureListPool *self, uint16_t id) {\n ts_assert(id < self->list.size);\n return array_get(&self->list, id);\n}\n\nstatic bool capture_list_pool_is_empty(const CaptureListPool *self) {\n // The capture list pool is empty if all allocated lists are in use, and we\n // have reached the maximum allowed number of allocated lists.\n return self->free_capture_list_count == 0 && self->list.size >= self->max_capture_list_count;\n}\n\nstatic uint16_t capture_list_pool_acquire(CaptureListPool *self) {\n // First see if any already allocated capture list is currently unused.\n if (self->free_capture_list_count > 0) {\n for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) {\n if (array_get(&self->list, i)->size == UINT32_MAX) {\n array_clear(array_get(&self->list, i));\n self->free_capture_list_count--;\n return i;\n }\n }\n }\n\n // Otherwise allocate and initialize a new capture list, as long as that\n // doesn't put us over the requested maximum.\n uint32_t i = self->list.size;\n if (i >= self->max_capture_list_count) {\n return NONE;\n }\n CaptureList list;\n array_init(&list);\n array_push(&self->list, list);\n return i;\n}\n\nstatic void capture_list_pool_release(CaptureListPool *self, uint16_t id) {\n if (id >= self->list.size) return;\n array_get(&self->list, id)->size = UINT32_MAX;\n self->free_capture_list_count++;\n}\n\n/**************\n * Quantifiers\n **************/\n\nstatic TSQuantifier quantifier_mul(\n TSQuantifier left,\n TSQuantifier right\n) {\n switch (left)\n {\n case TSQuantifierZero:\n return TSQuantifierZero;\n case TSQuantifierZeroOrOne:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZero;\n case TSQuantifierZeroOrOne:\n case TSQuantifierOne:\n return TSQuantifierZeroOrOne;\n case TSQuantifierZeroOrMore:\n case TSQuantifierOneOrMore:\n return TSQuantifierZeroOrMore;\n };\n break;\n case TSQuantifierZeroOrMore:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZero;\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierZeroOrMore;\n };\n break;\n case TSQuantifierOne:\n return right;\n case TSQuantifierOneOrMore:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZero;\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n }\n return TSQuantifierZero; // to make compiler happy, but all cases should be covered above!\n}\n\nstatic TSQuantifier quantifier_join(\n TSQuantifier left,\n TSQuantifier right\n) {\n switch (left)\n {\n case TSQuantifierZero:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZero;\n case TSQuantifierZeroOrOne:\n case TSQuantifierOne:\n return TSQuantifierZeroOrOne;\n case TSQuantifierZeroOrMore:\n case TSQuantifierOneOrMore:\n return TSQuantifierZeroOrMore;\n };\n break;\n case TSQuantifierZeroOrOne:\n switch (right) {\n case TSQuantifierZero:\n case TSQuantifierZeroOrOne:\n case TSQuantifierOne:\n return TSQuantifierZeroOrOne;\n break;\n case TSQuantifierZeroOrMore:\n case TSQuantifierOneOrMore:\n return TSQuantifierZeroOrMore;\n break;\n };\n break;\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n switch (right) {\n case TSQuantifierZero:\n case TSQuantifierZeroOrOne:\n return TSQuantifierZeroOrOne;\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n return TSQuantifierOne;\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n case TSQuantifierOneOrMore:\n switch (right) {\n case TSQuantifierZero:\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n }\n return TSQuantifierZero; // to make compiler happy, but all cases should be covered above!\n}\n\nstatic TSQuantifier quantifier_add(\n TSQuantifier left,\n TSQuantifier right\n) {\n switch (left)\n {\n case TSQuantifierZero:\n return right;\n case TSQuantifierZeroOrOne:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZeroOrOne;\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n case TSQuantifierZeroOrMore:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierZeroOrMore;\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n return TSQuantifierZeroOrMore;\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n case TSQuantifierOne:\n switch (right) {\n case TSQuantifierZero:\n return TSQuantifierOne;\n case TSQuantifierZeroOrOne:\n case TSQuantifierZeroOrMore:\n case TSQuantifierOne:\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n };\n break;\n case TSQuantifierOneOrMore:\n return TSQuantifierOneOrMore;\n }\n return TSQuantifierZero; // to make compiler happy, but all cases should be covered above!\n}\n\n// Create new capture quantifiers structure\nstatic CaptureQuantifiers capture_quantifiers_new(void) {\n return (CaptureQuantifiers) array_new();\n}\n\n// Delete capture quantifiers structure\nstatic void capture_quantifiers_delete(\n CaptureQuantifiers *self\n) {\n array_delete(self);\n}\n\n// Clear capture quantifiers structure\nstatic void capture_quantifiers_clear(\n CaptureQuantifiers *self\n) {\n array_clear(self);\n}\n\n// Replace capture quantifiers with the given quantifiers\nstatic void capture_quantifiers_replace(\n CaptureQuantifiers *self,\n CaptureQuantifiers *quantifiers\n) {\n array_clear(self);\n array_push_all(self, quantifiers);\n}\n\n// Return capture quantifier for the given capture id\nstatic TSQuantifier capture_quantifier_for_id(\n const CaptureQuantifiers *self,\n uint16_t id\n) {\n return (self->size <= id) ? TSQuantifierZero : (TSQuantifier) *array_get(self, id);\n}\n\n// Add the given quantifier to the current value for id\nstatic void capture_quantifiers_add_for_id(\n CaptureQuantifiers *self,\n uint16_t id,\n TSQuantifier quantifier\n) {\n if (self->size <= id) {\n array_grow_by(self, id + 1 - self->size);\n }\n uint8_t *own_quantifier = array_get(self, id);\n *own_quantifier = (uint8_t) quantifier_add((TSQuantifier) *own_quantifier, quantifier);\n}\n\n// Point-wise add the given quantifiers to the current values\nstatic void capture_quantifiers_add_all(\n CaptureQuantifiers *self,\n CaptureQuantifiers *quantifiers\n) {\n if (self->size < quantifiers->size) {\n array_grow_by(self, quantifiers->size - self->size);\n }\n for (uint16_t id = 0; id < (uint16_t)quantifiers->size; id++) {\n uint8_t *quantifier = array_get(quantifiers, id);\n uint8_t *own_quantifier = array_get(self, id);\n *own_quantifier = (uint8_t) quantifier_add((TSQuantifier) *own_quantifier, (TSQuantifier) *quantifier);\n }\n}\n\n// Join the given quantifier with the current values\nstatic void capture_quantifiers_mul(\n CaptureQuantifiers *self,\n TSQuantifier quantifier\n) {\n for (uint16_t id = 0; id < (uint16_t)self->size; id++) {\n uint8_t *own_quantifier = array_get(self, id);\n *own_quantifier = (uint8_t) quantifier_mul((TSQuantifier) *own_quantifier, quantifier);\n }\n}\n\n// Point-wise join the quantifiers from a list of alternatives with the current values\nstatic void capture_quantifiers_join_all(\n CaptureQuantifiers *self,\n CaptureQuantifiers *quantifiers\n) {\n if (self->size < quantifiers->size) {\n array_grow_by(self, quantifiers->size - self->size);\n }\n for (uint32_t id = 0; id < quantifiers->size; id++) {\n uint8_t *quantifier = array_get(quantifiers, id);\n uint8_t *own_quantifier = array_get(self, id);\n *own_quantifier = (uint8_t) quantifier_join((TSQuantifier) *own_quantifier, (TSQuantifier) *quantifier);\n }\n for (uint32_t id = quantifiers->size; id < self->size; id++) {\n uint8_t *own_quantifier = array_get(self, id);\n *own_quantifier = (uint8_t) quantifier_join((TSQuantifier) *own_quantifier, TSQuantifierZero);\n }\n}\n\n/**************\n * SymbolTable\n **************/\n\nstatic SymbolTable symbol_table_new(void) {\n return (SymbolTable) {\n .characters = array_new(),\n .slices = array_new(),\n };\n}\n\nstatic void symbol_table_delete(SymbolTable *self) {\n array_delete(&self->characters);\n array_delete(&self->slices);\n}\n\nstatic int symbol_table_id_for_name(\n const SymbolTable *self,\n const char *name,\n uint32_t length\n) {\n for (unsigned i = 0; i < self->slices.size; i++) {\n Slice slice = *array_get(&self->slices, i);\n if (\n slice.length == length &&\n !strncmp(array_get(&self->characters, slice.offset), name, length)\n ) return i;\n }\n return -1;\n}\n\nstatic const char *symbol_table_name_for_id(\n const SymbolTable *self,\n uint16_t id,\n uint32_t *length\n) {\n Slice slice = *(array_get(&self->slices,id));\n *length = slice.length;\n return array_get(&self->characters, slice.offset);\n}\n\nstatic uint16_t symbol_table_insert_name(\n SymbolTable *self,\n const char *name,\n uint32_t length\n) {\n int id = symbol_table_id_for_name(self, name, length);\n if (id >= 0) return (uint16_t)id;\n Slice slice = {\n .offset = self->characters.size,\n .length = length,\n };\n array_grow_by(&self->characters, length + 1);\n memcpy(array_get(&self->characters, slice.offset), name, length);\n *array_get(&self->characters, self->characters.size - 1) = 0;\n array_push(&self->slices, slice);\n return self->slices.size - 1;\n}\n\n/************\n * QueryStep\n ************/\n\nstatic QueryStep query_step__new(\n TSSymbol symbol,\n uint16_t depth,\n bool is_immediate\n) {\n QueryStep step = {\n .symbol = symbol,\n .depth = depth,\n .alternative_index = NONE,\n .is_immediate = is_immediate,\n };\n for (unsigned i = 0; i < MAX_STEP_CAPTURE_COUNT; i++) {\n step.capture_ids[i] = NONE;\n }\n return step;\n}\n\nstatic void query_step__add_capture(QueryStep *self, uint16_t capture_id) {\n for (unsigned i = 0; i < MAX_STEP_CAPTURE_COUNT; i++) {\n if (self->capture_ids[i] == NONE) {\n self->capture_ids[i] = capture_id;\n break;\n }\n }\n}\n\nstatic void query_step__remove_capture(QueryStep *self, uint16_t capture_id) {\n for (unsigned i = 0; i < MAX_STEP_CAPTURE_COUNT; i++) {\n if (self->capture_ids[i] == capture_id) {\n self->capture_ids[i] = NONE;\n while (i + 1 < MAX_STEP_CAPTURE_COUNT) {\n if (self->capture_ids[i + 1] == NONE) break;\n self->capture_ids[i] = self->capture_ids[i + 1];\n self->capture_ids[i + 1] = NONE;\n i++;\n }\n break;\n }\n }\n}\n\n/**********************\n * StatePredecessorMap\n **********************/\n\nstatic inline StatePredecessorMap state_predecessor_map_new(\n const TSLanguage *language\n) {\n return (StatePredecessorMap) {\n .contents = ts_calloc(\n (size_t)language->state_count * (MAX_STATE_PREDECESSOR_COUNT + 1),\n sizeof(TSStateId)\n ),\n };\n}\n\nstatic inline void state_predecessor_map_delete(StatePredecessorMap *self) {\n ts_free(self->contents);\n}\n\nstatic inline void state_predecessor_map_add(\n StatePredecessorMap *self,\n TSStateId state,\n TSStateId predecessor\n) {\n size_t index = (size_t)state * (MAX_STATE_PREDECESSOR_COUNT + 1);\n TSStateId *count = &self->contents[index];\n if (\n *count == 0 ||\n (*count < MAX_STATE_PREDECESSOR_COUNT && self->contents[index + *count] != predecessor)\n ) {\n (*count)++;\n self->contents[index + *count] = predecessor;\n }\n}\n\nstatic inline const TSStateId *state_predecessor_map_get(\n const StatePredecessorMap *self,\n TSStateId state,\n unsigned *count\n) {\n size_t index = (size_t)state * (MAX_STATE_PREDECESSOR_COUNT + 1);\n *count = self->contents[index];\n return &self->contents[index + 1];\n}\n\n/****************\n * AnalysisState\n ****************/\n\nstatic unsigned analysis_state__recursion_depth(const AnalysisState *self) {\n unsigned result = 0;\n for (unsigned i = 0; i < self->depth; i++) {\n TSSymbol symbol = self->stack[i].parent_symbol;\n for (unsigned j = 0; j < i; j++) {\n if (self->stack[j].parent_symbol == symbol) {\n result++;\n break;\n }\n }\n }\n return result;\n}\n\nstatic inline int analysis_state__compare(\n AnalysisState *const *self,\n AnalysisState *const *other\n) {\n if ((*self)->depth < (*other)->depth) return 1;\n for (unsigned i = 0; i < (*self)->depth; i++) {\n if (i >= (*other)->depth) return -1;\n AnalysisStateEntry s1 = (*self)->stack[i];\n AnalysisStateEntry s2 = (*other)->stack[i];\n if (s1.child_index < s2.child_index) return -1;\n if (s1.child_index > s2.child_index) return 1;\n if (s1.parent_symbol < s2.parent_symbol) return -1;\n if (s1.parent_symbol > s2.parent_symbol) return 1;\n if (s1.parse_state < s2.parse_state) return -1;\n if (s1.parse_state > s2.parse_state) return 1;\n if (s1.field_id < s2.field_id) return -1;\n if (s1.field_id > s2.field_id) return 1;\n }\n if ((*self)->step_index < (*other)->step_index) return -1;\n if ((*self)->step_index > (*other)->step_index) return 1;\n return 0;\n}\n\nstatic inline AnalysisStateEntry *analysis_state__top(AnalysisState *self) {\n if (self->depth == 0) {\n return &self->stack[0];\n }\n return &self->stack[self->depth - 1];\n}\n\nstatic inline bool analysis_state__has_supertype(AnalysisState *self, TSSymbol symbol) {\n for (unsigned i = 0; i < self->depth; i++) {\n if (self->stack[i].parent_symbol == symbol) return true;\n }\n return false;\n}\n\n/******************\n * AnalysisStateSet\n ******************/\n\n// Obtains an `AnalysisState` instance, either by consuming one from this set's object pool, or by\n// cloning one from scratch.\nstatic inline AnalysisState *analysis_state_pool__clone_or_reuse(\n AnalysisStateSet *self,\n AnalysisState *borrowed_item\n) {\n AnalysisState *new_item;\n if (self->size) {\n new_item = array_pop(self);\n } else {\n new_item = ts_malloc(sizeof(AnalysisState));\n }\n *new_item = *borrowed_item;\n return new_item;\n}\n\n// Inserts a clone of the passed-in item at the appropriate position to maintain ordering in this\n// set. The set does not contain duplicates, so if the item is already present, it will not be\n// inserted, and no clone will be made.\n//\n// The caller retains ownership of the passed-in memory. However, the clone that is created by this\n// function will be managed by the state set.\nstatic inline void analysis_state_set__insert_sorted(\n AnalysisStateSet *self,\n AnalysisStateSet *pool,\n AnalysisState *borrowed_item\n) {\n unsigned index, exists;\n array_search_sorted_with(self, analysis_state__compare, &borrowed_item, &index, &exists);\n if (!exists) {\n AnalysisState *new_item = analysis_state_pool__clone_or_reuse(pool, borrowed_item);\n array_insert(self, index, new_item);\n }\n}\n\n// Inserts a clone of the passed-in item at the end position of this list.\n//\n// IMPORTANT: The caller MUST ENSURE that this item is larger (by the comparison function\n// `analysis_state__compare`) than largest item already in this set. If items are inserted in the\n// wrong order, the set will not function properly for future use.\n//\n// The caller retains ownership of the passed-in memory. However, the clone that is created by this\n// function will be managed by the state set.\nstatic inline void analysis_state_set__push(\n AnalysisStateSet *self,\n AnalysisStateSet *pool,\n AnalysisState *borrowed_item\n) {\n AnalysisState *new_item = analysis_state_pool__clone_or_reuse(pool, borrowed_item);\n array_push(self, new_item);\n}\n\n// Removes all items from this set, returning it to an empty state.\nstatic inline void analysis_state_set__clear(AnalysisStateSet *self, AnalysisStateSet *pool) {\n array_push_all(pool, self);\n array_clear(self);\n}\n\n// Releases all memory that is managed with this state set, including any items currently present.\n// After calling this function, the set is no longer suitable for use.\nstatic inline void analysis_state_set__delete(AnalysisStateSet *self) {\n for (unsigned i = 0; i < self->size; i++) {\n ts_free(self->contents[i]);\n }\n array_delete(self);\n}\n\n/****************\n * QueryAnalyzer\n ****************/\n\nstatic inline QueryAnalysis query_analysis__new(void) {\n return (QueryAnalysis) {\n .states = array_new(),\n .next_states = array_new(),\n .deeper_states = array_new(),\n .state_pool = array_new(),\n .final_step_indices = array_new(),\n .finished_parent_symbols = array_new(),\n .did_abort = false,\n };\n}\n\nstatic inline void query_analysis__delete(QueryAnalysis *self) {\n analysis_state_set__delete(&self->states);\n analysis_state_set__delete(&self->next_states);\n analysis_state_set__delete(&self->deeper_states);\n analysis_state_set__delete(&self->state_pool);\n array_delete(&self->final_step_indices);\n array_delete(&self->finished_parent_symbols);\n}\n\n/***********************\n * AnalysisSubgraphNode\n ***********************/\n\nstatic inline int analysis_subgraph_node__compare(const AnalysisSubgraphNode *self, const AnalysisSubgraphNode *other) {\n if (self->state < other->state) return -1;\n if (self->state > other->state) return 1;\n if (self->child_index < other->child_index) return -1;\n if (self->child_index > other->child_index) return 1;\n if (self->done < other->done) return -1;\n if (self->done > other->done) return 1;\n if (self->production_id < other->production_id) return -1;\n if (self->production_id > other->production_id) return 1;\n return 0;\n}\n\n/*********\n * Query\n *********/\n\n// The `pattern_map` contains a mapping from TSSymbol values to indices in the\n// `steps` array. For a given syntax node, the `pattern_map` makes it possible\n// to quickly find the starting steps of all of the patterns whose root matches\n// that node. Each entry has two fields: a `pattern_index`, which identifies one\n// of the patterns in the query, and a `step_index`, which indicates the start\n// offset of that pattern's steps within the `steps` array.\n//\n// The entries are sorted by the patterns' root symbols, and lookups use a\n// binary search. This ensures that the cost of this initial lookup step\n// scales logarithmically with the number of patterns in the query.\n//\n// This returns `true` if the symbol is present and `false` otherwise.\n// If the symbol is not present `*result` is set to the index where the\n// symbol should be inserted.\nstatic inline bool ts_query__pattern_map_search(\n const TSQuery *self,\n TSSymbol needle,\n uint32_t *result\n) {\n uint32_t base_index = self->wildcard_root_pattern_count;\n uint32_t size = self->pattern_map.size - base_index;\n if (size == 0) {\n *result = base_index;\n return false;\n }\n while (size > 1) {\n uint32_t half_size = size / 2;\n uint32_t mid_index = base_index + half_size;\n TSSymbol mid_symbol = array_get(&self->steps,\n array_get(&self->pattern_map, mid_index)->step_index\n )->symbol;\n if (needle > mid_symbol) base_index = mid_index;\n size -= half_size;\n }\n\n TSSymbol symbol = array_get(&self->steps,\n array_get(&self->pattern_map, base_index)->step_index\n )->symbol;\n\n if (needle > symbol) {\n base_index++;\n if (base_index < self->pattern_map.size) {\n symbol = array_get(&self->steps,\n array_get(&self->pattern_map, base_index)->step_index\n )->symbol;\n }\n }\n\n *result = base_index;\n return needle == symbol;\n}\n\n// Insert a new pattern's start index into the pattern map, maintaining\n// the pattern map's ordering invariant.\nstatic inline void ts_query__pattern_map_insert(\n TSQuery *self,\n TSSymbol symbol,\n PatternEntry new_entry\n) {\n uint32_t index;\n ts_query__pattern_map_search(self, symbol, &index);\n\n // Ensure that the entries are sorted not only by symbol, but also\n // by pattern_index. This way, states for earlier patterns will be\n // initiated first, which allows the ordering of the states array\n // to be maintained more efficiently.\n while (index < self->pattern_map.size) {\n PatternEntry *entry = array_get(&self->pattern_map, index);\n if (\n array_get(&self->steps, entry->step_index)->symbol == symbol &&\n entry->pattern_index < new_entry.pattern_index\n ) {\n index++;\n } else {\n break;\n }\n }\n\n array_insert(&self->pattern_map, index, new_entry);\n}\n\n// Walk the subgraph for this non-terminal, tracking all of the possible\n// sequences of progress within the pattern.\nstatic void ts_query__perform_analysis(\n TSQuery *self,\n const AnalysisSubgraphArray *subgraphs,\n QueryAnalysis *analysis\n) {\n unsigned recursion_depth_limit = 0;\n unsigned prev_final_step_count = 0;\n array_clear(&analysis->final_step_indices);\n array_clear(&analysis->finished_parent_symbols);\n\n for (unsigned iteration = 0;; iteration++) {\n if (iteration == MAX_ANALYSIS_ITERATION_COUNT) {\n analysis->did_abort = true;\n break;\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"Iteration: %u. Final step indices:\", iteration);\n for (unsigned j = 0; j < analysis->final_step_indices.size; j++) {\n printf(\" %4u\", *array_get(&analysis->final_step_indices, j));\n }\n printf(\"\\n\");\n for (unsigned j = 0; j < analysis->states.size; j++) {\n AnalysisState *state = *array_get(&analysis->states, j);\n printf(\" %3u: step: %u, stack: [\", j, state->step_index);\n for (unsigned k = 0; k < state->depth; k++) {\n printf(\n \" {%s, child: %u, state: %4u\",\n self->language->symbol_names[state->stack[k].parent_symbol],\n state->stack[k].child_index,\n state->stack[k].parse_state\n );\n if (state->stack[k].field_id) printf(\", field: %s\", self->language->field_names[state->stack[k].field_id]);\n if (state->stack[k].done) printf(\", DONE\");\n printf(\"}\");\n }\n printf(\" ]\\n\");\n }\n #endif\n\n // If no further progress can be made within the current recursion depth limit, then\n // bump the depth limit by one, and continue to process the states the exceeded the\n // limit. But only allow this if progress has been made since the last time the depth\n // limit was increased.\n if (analysis->states.size == 0) {\n if (\n analysis->deeper_states.size > 0 &&\n analysis->final_step_indices.size > prev_final_step_count\n ) {\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"Increase recursion depth limit to %u\\n\", recursion_depth_limit + 1);\n #endif\n\n prev_final_step_count = analysis->final_step_indices.size;\n recursion_depth_limit++;\n AnalysisStateSet _states = analysis->states;\n analysis->states = analysis->deeper_states;\n analysis->deeper_states = _states;\n continue;\n }\n\n break;\n }\n\n analysis_state_set__clear(&analysis->next_states, &analysis->state_pool);\n for (unsigned j = 0; j < analysis->states.size; j++) {\n AnalysisState * const state = *array_get(&analysis->states, j);\n\n // For efficiency, it's important to avoid processing the same analysis state more\n // than once. To achieve this, keep the states in order of ascending position within\n // their hypothetical syntax trees. In each iteration of this loop, start by advancing\n // the states that have made the least progress. Avoid advancing states that have already\n // made more progress.\n if (analysis->next_states.size > 0) {\n int comparison = analysis_state__compare(\n &state,\n array_back(&analysis->next_states)\n );\n if (comparison == 0) {\n analysis_state_set__insert_sorted(&analysis->next_states, &analysis->state_pool, state);\n continue;\n } else if (comparison > 0) {\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"Terminate iteration at state %u\\n\", j);\n #endif\n while (j < analysis->states.size) {\n analysis_state_set__push(\n &analysis->next_states,\n &analysis->state_pool,\n *array_get(&analysis->states, j)\n );\n j++;\n }\n break;\n }\n }\n\n const TSStateId parse_state = analysis_state__top(state)->parse_state;\n const TSSymbol parent_symbol = analysis_state__top(state)->parent_symbol;\n const TSFieldId parent_field_id = analysis_state__top(state)->field_id;\n const unsigned child_index = analysis_state__top(state)->child_index;\n const QueryStep * const step = array_get(&self->steps, state->step_index);\n\n unsigned subgraph_index, exists;\n array_search_sorted_by(subgraphs, .symbol, parent_symbol, &subgraph_index, &exists);\n if (!exists) continue;\n const AnalysisSubgraph *subgraph = array_get(subgraphs, subgraph_index);\n\n // Follow every possible path in the parse table, but only visit states that\n // are part of the subgraph for the current symbol.\n LookaheadIterator lookahead_iterator = ts_language_lookaheads(self->language, parse_state);\n while (ts_lookahead_iterator__next(&lookahead_iterator)) {\n TSSymbol sym = lookahead_iterator.symbol;\n\n AnalysisSubgraphNode successor = {\n .state = parse_state,\n .child_index = child_index,\n };\n if (lookahead_iterator.action_count) {\n const TSParseAction *action = &lookahead_iterator.actions[lookahead_iterator.action_count - 1];\n if (action->type == TSParseActionTypeShift) {\n if (!action->shift.extra) {\n successor.state = action->shift.state;\n successor.child_index++;\n }\n } else {\n continue;\n }\n } else if (lookahead_iterator.next_state != 0) {\n successor.state = lookahead_iterator.next_state;\n successor.child_index++;\n } else {\n continue;\n }\n\n unsigned node_index;\n array_search_sorted_with(\n &subgraph->nodes,\n analysis_subgraph_node__compare, &successor,\n &node_index, &exists\n );\n while (node_index < subgraph->nodes.size) {\n AnalysisSubgraphNode *node = array_get(&subgraph->nodes, node_index);\n node_index++;\n if (node->state != successor.state || node->child_index != successor.child_index) break;\n\n // Use the subgraph to determine what alias and field will eventually be applied\n // to this child node.\n TSSymbol alias = ts_language_alias_at(self->language, node->production_id, child_index);\n TSSymbol visible_symbol = alias\n ? alias\n : self->language->symbol_metadata[sym].visible\n ? self->language->public_symbol_map[sym]\n : 0;\n TSFieldId field_id = parent_field_id;\n if (!field_id) {\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(self->language, node->production_id, &field_map, &field_map_end);\n for (; field_map != field_map_end; field_map++) {\n if (!field_map->inherited && field_map->child_index == child_index) {\n field_id = field_map->field_id;\n break;\n }\n }\n }\n\n // Create a new state that has advanced past this hypothetical subtree.\n AnalysisState next_state = *state;\n AnalysisStateEntry *next_state_top = analysis_state__top(&next_state);\n next_state_top->child_index = successor.child_index;\n next_state_top->parse_state = successor.state;\n if (node->done) next_state_top->done = true;\n\n // Determine if this hypothetical child node would match the current step\n // of the query pattern.\n bool does_match = false;\n\n // ERROR nodes can appear anywhere, so if the step is\n // looking for an ERROR node, consider it potentially matchable.\n if (step->symbol == ts_builtin_sym_error) {\n does_match = true;\n } else if (visible_symbol) {\n does_match = true;\n if (step->symbol == WILDCARD_SYMBOL) {\n if (\n step->is_named &&\n !self->language->symbol_metadata[visible_symbol].named\n ) does_match = false;\n } else if (step->symbol != visible_symbol) {\n does_match = false;\n }\n if (step->field && step->field != field_id) {\n does_match = false;\n }\n if (\n step->supertype_symbol &&\n !analysis_state__has_supertype(state, step->supertype_symbol)\n ) does_match = false;\n }\n\n // If this child is hidden, then descend into it and walk through its children.\n // If the top entry of the stack is at the end of its rule, then that entry can\n // be replaced. Otherwise, push a new entry onto the stack.\n else if (sym >= self->language->token_count) {\n if (!next_state_top->done) {\n if (next_state.depth + 1 >= MAX_ANALYSIS_STATE_DEPTH) {\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"Exceeded depth limit for state %u\\n\", j);\n #endif\n\n analysis->did_abort = true;\n continue;\n }\n\n next_state.depth++;\n next_state_top = analysis_state__top(&next_state);\n }\n\n *next_state_top = (AnalysisStateEntry) {\n .parse_state = parse_state,\n .parent_symbol = sym,\n .child_index = 0,\n .field_id = field_id,\n .done = false,\n };\n\n if (analysis_state__recursion_depth(&next_state) > recursion_depth_limit) {\n analysis_state_set__insert_sorted(\n &analysis->deeper_states,\n &analysis->state_pool,\n &next_state\n );\n continue;\n }\n }\n\n // Pop from the stack when this state reached the end of its current syntax node.\n while (next_state.depth > 0 && next_state_top->done) {\n next_state.depth--;\n next_state_top = analysis_state__top(&next_state);\n }\n\n // If this hypothetical child did match the current step of the query pattern,\n // then advance to the next step at the current depth. This involves skipping\n // over any descendant steps of the current child.\n const QueryStep *next_step = step;\n if (does_match) {\n for (;;) {\n next_state.step_index++;\n next_step = array_get(&self->steps, next_state.step_index);\n if (\n next_step->depth == PATTERN_DONE_MARKER ||\n next_step->depth <= step->depth\n ) break;\n }\n } else if (successor.state == parse_state) {\n continue;\n }\n\n for (;;) {\n // Skip pass-through states. Although these states have alternatives, they are only\n // used to implement repetitions, and query analysis does not need to process\n // repetitions in order to determine whether steps are possible and definite.\n if (next_step->is_pass_through) {\n next_state.step_index++;\n next_step++;\n continue;\n }\n\n // If the pattern is finished or hypothetical parent node is complete, then\n // record that matching can terminate at this step of the pattern. Otherwise,\n // add this state to the list of states to process on the next iteration.\n if (!next_step->is_dead_end) {\n bool did_finish_pattern = array_get(&self->steps, next_state.step_index)->depth != step->depth;\n if (did_finish_pattern) {\n array_insert_sorted_by(&analysis->finished_parent_symbols, , state->root_symbol);\n } else if (next_state.depth == 0) {\n array_insert_sorted_by(&analysis->final_step_indices, , next_state.step_index);\n } else {\n analysis_state_set__insert_sorted(&analysis->next_states, &analysis->state_pool, &next_state);\n }\n }\n\n // If the state has advanced to a step with an alternative step, then add another state\n // at that alternative step. This process is simpler than the process of actually matching a\n // pattern during query execution, because for the purposes of query analysis, there is no\n // need to process repetitions.\n if (\n does_match &&\n next_step->alternative_index != NONE &&\n next_step->alternative_index > next_state.step_index\n ) {\n next_state.step_index = next_step->alternative_index;\n next_step = array_get(&self->steps, next_state.step_index);\n } else {\n break;\n }\n }\n }\n }\n }\n\n AnalysisStateSet _states = analysis->states;\n analysis->states = analysis->next_states;\n analysis->next_states = _states;\n }\n}\n\nstatic bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) {\n Array(uint16_t) non_rooted_pattern_start_steps = array_new();\n for (unsigned i = 0; i < self->pattern_map.size; i++) {\n PatternEntry *pattern = array_get(&self->pattern_map, i);\n if (!pattern->is_rooted) {\n QueryStep *step = array_get(&self->steps, pattern->step_index);\n if (step->symbol != WILDCARD_SYMBOL) {\n array_push(&non_rooted_pattern_start_steps, i);\n }\n }\n }\n\n // Walk forward through all of the steps in the query, computing some\n // basic information about each step. Mark all of the steps that contain\n // captures, and record the indices of all of the steps that have child steps.\n Array(uint32_t) parent_step_indices = array_new();\n bool all_patterns_are_valid = true;\n for (unsigned i = 0; i < self->steps.size; i++) {\n QueryStep *step = array_get(&self->steps, i);\n if (step->depth == PATTERN_DONE_MARKER) {\n step->parent_pattern_guaranteed = true;\n step->root_pattern_guaranteed = true;\n continue;\n }\n\n bool has_children = false;\n bool is_wildcard = step->symbol == WILDCARD_SYMBOL;\n step->contains_captures = step->capture_ids[0] != NONE;\n for (unsigned j = i + 1; j < self->steps.size; j++) {\n QueryStep *next_step = array_get(&self->steps, j);\n if (\n next_step->depth == PATTERN_DONE_MARKER ||\n next_step->depth <= step->depth\n ) break;\n if (next_step->capture_ids[0] != NONE) {\n step->contains_captures = true;\n }\n if (!is_wildcard) {\n next_step->root_pattern_guaranteed = true;\n next_step->parent_pattern_guaranteed = true;\n }\n has_children = true;\n }\n\n if (has_children) {\n if (!is_wildcard) {\n array_push(&parent_step_indices, i);\n } else if (step->supertype_symbol && self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {\n // Look at the child steps to see if any aren't valid subtypes for this supertype.\n uint32_t subtype_length;\n const TSSymbol *subtypes = ts_language_subtypes(\n self->language,\n step->supertype_symbol,\n &subtype_length\n );\n\n for (unsigned j = i + 1; j < self->steps.size; j++) {\n QueryStep *child_step = array_get(&self->steps, j);\n if (child_step->depth == PATTERN_DONE_MARKER || child_step->depth <= step->depth) {\n break;\n }\n if (child_step->depth == step->depth + 1 && child_step->symbol != WILDCARD_SYMBOL) {\n bool is_valid_subtype = false;\n for (uint32_t k = 0; k < subtype_length; k++) {\n if (child_step->symbol == subtypes[k]) {\n is_valid_subtype = true;\n break;\n }\n }\n\n if (!is_valid_subtype) {\n for (unsigned offset_idx = 0; offset_idx < self->step_offsets.size; offset_idx++) {\n StepOffset *step_offset = array_get(&self->step_offsets, offset_idx);\n if (step_offset->step_index >= j) {\n *error_offset = step_offset->byte_offset;\n all_patterns_are_valid = false;\n goto supertype_cleanup;\n }\n }\n }\n }\n }\n }\n }\n }\n\n // For every parent symbol in the query, initialize an 'analysis subgraph'.\n // This subgraph lists all of the states in the parse table that are directly\n // involved in building subtrees for this symbol.\n //\n // In addition to the parent symbols in the query, construct subgraphs for all\n // of the hidden symbols in the grammar, because these might occur within\n // one of the parent nodes, such that their children appear to belong to the\n // parent.\n AnalysisSubgraphArray subgraphs = array_new();\n for (unsigned i = 0; i < parent_step_indices.size; i++) {\n uint32_t parent_step_index = *array_get(&parent_step_indices, i);\n TSSymbol parent_symbol = array_get(&self->steps, parent_step_index)->symbol;\n AnalysisSubgraph subgraph = { .symbol = parent_symbol };\n array_insert_sorted_by(&subgraphs, .symbol, subgraph);\n }\n for (TSSymbol sym = (uint16_t)self->language->token_count; sym < (uint16_t)self->language->symbol_count; sym++) {\n if (!ts_language_symbol_metadata(self->language, sym).visible) {\n AnalysisSubgraph subgraph = { .symbol = sym };\n array_insert_sorted_by(&subgraphs, .symbol, subgraph);\n }\n }\n\n // Scan the parse table to find the data needed to populate these subgraphs.\n // Collect three things during this scan:\n // 1) All of the parse states where one of these symbols can start.\n // 2) All of the parse states where one of these symbols can end, along\n // with information about the node that would be created.\n // 3) A list of predecessor states for each state.\n StatePredecessorMap predecessor_map = state_predecessor_map_new(self->language);\n for (TSStateId state = 1; state < (uint16_t)self->language->state_count; state++) {\n unsigned subgraph_index, exists;\n LookaheadIterator lookahead_iterator = ts_language_lookaheads(self->language, state);\n while (ts_lookahead_iterator__next(&lookahead_iterator)) {\n if (lookahead_iterator.action_count) {\n for (unsigned i = 0; i < lookahead_iterator.action_count; i++) {\n const TSParseAction *action = &lookahead_iterator.actions[i];\n if (action->type == TSParseActionTypeReduce) {\n const TSSymbol *aliases, *aliases_end;\n ts_language_aliases_for_symbol(\n self->language,\n action->reduce.symbol,\n &aliases,\n &aliases_end\n );\n for (const TSSymbol *symbol = aliases; symbol < aliases_end; symbol++) {\n array_search_sorted_by(\n &subgraphs,\n .symbol,\n *symbol,\n &subgraph_index,\n &exists\n );\n if (exists) {\n AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index);\n if (subgraph->nodes.size == 0 || array_back(&subgraph->nodes)->state != state) {\n array_push(&subgraph->nodes, ((AnalysisSubgraphNode) {\n .state = state,\n .production_id = action->reduce.production_id,\n .child_index = action->reduce.child_count,\n .done = true,\n }));\n }\n }\n }\n } else if (action->type == TSParseActionTypeShift && !action->shift.extra) {\n TSStateId next_state = action->shift.state;\n state_predecessor_map_add(&predecessor_map, next_state, state);\n }\n }\n } else if (lookahead_iterator.next_state != 0) {\n if (lookahead_iterator.next_state != state) {\n state_predecessor_map_add(&predecessor_map, lookahead_iterator.next_state, state);\n }\n if (ts_language_state_is_primary(self->language, state)) {\n const TSSymbol *aliases, *aliases_end;\n ts_language_aliases_for_symbol(\n self->language,\n lookahead_iterator.symbol,\n &aliases,\n &aliases_end\n );\n for (const TSSymbol *symbol = aliases; symbol < aliases_end; symbol++) {\n array_search_sorted_by(\n &subgraphs,\n .symbol,\n *symbol,\n &subgraph_index,\n &exists\n );\n if (exists) {\n AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index);\n if (\n subgraph->start_states.size == 0 ||\n *array_back(&subgraph->start_states) != state\n )\n array_push(&subgraph->start_states, state);\n }\n }\n }\n }\n }\n }\n\n // For each subgraph, compute the preceding states by walking backward\n // from the end states using the predecessor map.\n Array(AnalysisSubgraphNode) next_nodes = array_new();\n for (unsigned i = 0; i < subgraphs.size; i++) {\n AnalysisSubgraph *subgraph = array_get(&subgraphs, i);\n if (subgraph->nodes.size == 0) {\n array_delete(&subgraph->start_states);\n array_erase(&subgraphs, i);\n i--;\n continue;\n }\n array_assign(&next_nodes, &subgraph->nodes);\n while (next_nodes.size > 0) {\n AnalysisSubgraphNode node = array_pop(&next_nodes);\n if (node.child_index > 1) {\n unsigned predecessor_count;\n const TSStateId *predecessors = state_predecessor_map_get(\n &predecessor_map,\n node.state,\n &predecessor_count\n );\n for (unsigned j = 0; j < predecessor_count; j++) {\n AnalysisSubgraphNode predecessor_node = {\n .state = predecessors[j],\n .child_index = node.child_index - 1,\n .production_id = node.production_id,\n .done = false,\n };\n unsigned index, exists;\n array_search_sorted_with(\n &subgraph->nodes, analysis_subgraph_node__compare, &predecessor_node,\n &index, &exists\n );\n if (!exists) {\n array_insert(&subgraph->nodes, index, predecessor_node);\n array_push(&next_nodes, predecessor_node);\n }\n }\n }\n }\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"\\nSubgraphs:\\n\");\n for (unsigned i = 0; i < subgraphs.size; i++) {\n AnalysisSubgraph *subgraph = array_get(&subgraphs, i);\n printf(\" %u, %s:\\n\", subgraph->symbol, ts_language_symbol_name(self->language, subgraph->symbol));\n for (unsigned j = 0; j < subgraph->start_states.size; j++) {\n printf(\n \" {state: %u}\\n\",\n *array_get(&subgraph->start_states, j)\n );\n }\n for (unsigned j = 0; j < subgraph->nodes.size; j++) {\n AnalysisSubgraphNode *node = array_get(&subgraph->nodes, j);\n printf(\n \" {state: %u, child_index: %u, production_id: %u, done: %d}\\n\",\n node->state, node->child_index, node->production_id, node->done\n );\n }\n printf(\"\\n\");\n }\n #endif\n\n // For each non-terminal pattern, determine if the pattern can successfully match,\n // and identify all of the possible children within the pattern where matching could fail.\n QueryAnalysis analysis = query_analysis__new();\n for (unsigned i = 0; i < parent_step_indices.size; i++) {\n uint16_t parent_step_index = *array_get(&parent_step_indices, i);\n uint16_t parent_depth = array_get(&self->steps, parent_step_index)->depth;\n TSSymbol parent_symbol = array_get(&self->steps, parent_step_index)->symbol;\n if (parent_symbol == ts_builtin_sym_error) continue;\n\n // Find the subgraph that corresponds to this pattern's root symbol. If the pattern's\n // root symbol is a terminal, then return an error.\n unsigned subgraph_index, exists;\n array_search_sorted_by(&subgraphs, .symbol, parent_symbol, &subgraph_index, &exists);\n if (!exists) {\n unsigned first_child_step_index = parent_step_index + 1;\n uint32_t j, child_exists;\n array_search_sorted_by(&self->step_offsets, .step_index, first_child_step_index, &j, &child_exists);\n ts_assert(child_exists);\n *error_offset = array_get(&self->step_offsets, j)->byte_offset;\n all_patterns_are_valid = false;\n break;\n }\n\n // Initialize an analysis state at every parse state in the table where\n // this parent symbol can occur.\n AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index);\n analysis_state_set__clear(&analysis.states, &analysis.state_pool);\n analysis_state_set__clear(&analysis.deeper_states, &analysis.state_pool);\n for (unsigned j = 0; j < subgraph->start_states.size; j++) {\n TSStateId parse_state = *array_get(&subgraph->start_states, j);\n analysis_state_set__push(&analysis.states, &analysis.state_pool, &((AnalysisState) {\n .step_index = parent_step_index + 1,\n .stack = {\n [0] = {\n .parse_state = parse_state,\n .parent_symbol = parent_symbol,\n .child_index = 0,\n .field_id = 0,\n .done = false,\n },\n },\n .depth = 1,\n .root_symbol = parent_symbol,\n }));\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\n \"\\nWalk states for %s:\\n\",\n ts_language_symbol_name(self->language, (*array_get(&analysis.states, 0))->stack[0].parent_symbol)\n );\n #endif\n\n analysis.did_abort = false;\n ts_query__perform_analysis(self, &subgraphs, &analysis);\n\n // If this pattern could not be fully analyzed, then every step should\n // be considered fallible.\n if (analysis.did_abort) {\n for (unsigned j = parent_step_index + 1; j < self->steps.size; j++) {\n QueryStep *step = array_get(&self->steps, j);\n if (\n step->depth <= parent_depth ||\n step->depth == PATTERN_DONE_MARKER\n ) break;\n if (!step->is_dead_end) {\n step->parent_pattern_guaranteed = false;\n step->root_pattern_guaranteed = false;\n }\n }\n continue;\n }\n\n // If this pattern cannot match, store the pattern index so that it can be\n // returned to the caller.\n if (analysis.finished_parent_symbols.size == 0) {\n uint16_t impossible_step_index;\n if (analysis.final_step_indices.size > 0) {\n impossible_step_index = *array_back(&analysis.final_step_indices);\n } else {\n // If there isn't a final step, then that means the parent step itself is unreachable.\n impossible_step_index = parent_step_index;\n }\n uint32_t j, impossible_exists;\n array_search_sorted_by(&self->step_offsets, .step_index, impossible_step_index, &j, &impossible_exists);\n if (j >= self->step_offsets.size) j = self->step_offsets.size - 1;\n *error_offset = array_get(&self->step_offsets, j)->byte_offset;\n all_patterns_are_valid = false;\n break;\n }\n\n // Mark as fallible any step where a match terminated.\n // Later, this property will be propagated to all of the step's predecessors.\n for (unsigned j = 0; j < analysis.final_step_indices.size; j++) {\n uint32_t final_step_index = *array_get(&analysis.final_step_indices, j);\n QueryStep *step = array_get(&self->steps, final_step_index);\n if (\n step->depth != PATTERN_DONE_MARKER &&\n step->depth > parent_depth &&\n !step->is_dead_end\n ) {\n step->parent_pattern_guaranteed = false;\n step->root_pattern_guaranteed = false;\n }\n }\n }\n\n // Mark as indefinite any step with captures that are used in predicates.\n Array(uint16_t) predicate_capture_ids = array_new();\n for (unsigned i = 0; i < self->patterns.size; i++) {\n QueryPattern *pattern = array_get(&self->patterns, i);\n\n // Gather all of the captures that are used in predicates for this pattern.\n array_clear(&predicate_capture_ids);\n for (\n unsigned start = pattern->predicate_steps.offset,\n end = start + pattern->predicate_steps.length,\n j = start; j < end; j++\n ) {\n TSQueryPredicateStep *step = array_get(&self->predicate_steps, j);\n if (step->type == TSQueryPredicateStepTypeCapture) {\n uint16_t value_id = step->value_id;\n array_insert_sorted_by(&predicate_capture_ids, , value_id);\n }\n }\n\n // Find all of the steps that have these captures.\n for (\n unsigned start = pattern->steps.offset,\n end = start + pattern->steps.length,\n j = start; j < end; j++\n ) {\n QueryStep *step = array_get(&self->steps, j);\n for (unsigned k = 0; k < MAX_STEP_CAPTURE_COUNT; k++) {\n uint16_t capture_id = step->capture_ids[k];\n if (capture_id == NONE) break;\n unsigned index, exists;\n array_search_sorted_by(&predicate_capture_ids, , capture_id, &index, &exists);\n if (exists) {\n step->root_pattern_guaranteed = false;\n break;\n }\n }\n }\n }\n\n // Propagate fallibility. If a pattern is fallible at a given step, then it is\n // fallible at all of its preceding steps.\n bool done = self->steps.size == 0;\n while (!done) {\n done = true;\n for (unsigned i = self->steps.size - 1; i > 0; i--) {\n QueryStep *step = array_get(&self->steps, i);\n if (step->depth == PATTERN_DONE_MARKER) continue;\n\n // Determine if this step is definite or has definite alternatives.\n bool parent_pattern_guaranteed = false;\n for (;;) {\n if (step->root_pattern_guaranteed) {\n parent_pattern_guaranteed = true;\n break;\n }\n if (step->alternative_index == NONE || step->alternative_index < i) {\n break;\n }\n step = array_get(&self->steps, step->alternative_index);\n }\n\n // If not, mark its predecessor as indefinite.\n if (!parent_pattern_guaranteed) {\n QueryStep *prev_step = array_get(&self->steps, i - 1);\n if (\n !prev_step->is_dead_end &&\n prev_step->depth != PATTERN_DONE_MARKER &&\n prev_step->root_pattern_guaranteed\n ) {\n prev_step->root_pattern_guaranteed = false;\n done = false;\n }\n }\n }\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"Steps:\\n\");\n for (unsigned i = 0; i < self->steps.size; i++) {\n QueryStep *step = array_get(&self->steps, i);\n if (step->depth == PATTERN_DONE_MARKER) {\n printf(\" %u: DONE\\n\", i);\n } else {\n printf(\n \" %u: {symbol: %s, field: %s, depth: %u, parent_pattern_guaranteed: %d, root_pattern_guaranteed: %d}\\n\",\n i,\n (step->symbol == WILDCARD_SYMBOL)\n ? \"ANY\"\n : ts_language_symbol_name(self->language, step->symbol),\n (step->field ? ts_language_field_name_for_id(self->language, step->field) : \"-\"),\n step->depth,\n step->parent_pattern_guaranteed,\n step->root_pattern_guaranteed\n );\n }\n }\n #endif\n\n // Determine which repetition symbols in this language have the possibility\n // of matching non-rooted patterns in this query. These repetition symbols\n // prevent certain optimizations with range restrictions.\n analysis.did_abort = false;\n for (uint32_t i = 0; i < non_rooted_pattern_start_steps.size; i++) {\n uint16_t pattern_entry_index = *array_get(&non_rooted_pattern_start_steps, i);\n PatternEntry *pattern_entry = array_get(&self->pattern_map, pattern_entry_index);\n\n analysis_state_set__clear(&analysis.states, &analysis.state_pool);\n analysis_state_set__clear(&analysis.deeper_states, &analysis.state_pool);\n for (unsigned j = 0; j < subgraphs.size; j++) {\n AnalysisSubgraph *subgraph = array_get(&subgraphs, j);\n TSSymbolMetadata metadata = ts_language_symbol_metadata(self->language, subgraph->symbol);\n if (metadata.visible || metadata.named) continue;\n\n for (uint32_t k = 0; k < subgraph->start_states.size; k++) {\n TSStateId parse_state = *array_get(&subgraph->start_states, k);\n analysis_state_set__push(&analysis.states, &analysis.state_pool, &((AnalysisState) {\n .step_index = pattern_entry->step_index,\n .stack = {\n [0] = {\n .parse_state = parse_state,\n .parent_symbol = subgraph->symbol,\n .child_index = 0,\n .field_id = 0,\n .done = false,\n },\n },\n .root_symbol = subgraph->symbol,\n .depth = 1,\n }));\n }\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n printf(\"\\nWalk states for rootless pattern step %u:\\n\", pattern_entry->step_index);\n #endif\n\n ts_query__perform_analysis(\n self,\n &subgraphs,\n &analysis\n );\n\n if (analysis.finished_parent_symbols.size > 0) {\n array_get(&self->patterns, pattern_entry->pattern_index)->is_non_local = true;\n }\n\n for (unsigned k = 0; k < analysis.finished_parent_symbols.size; k++) {\n TSSymbol symbol = *array_get(&analysis.finished_parent_symbols, k);\n array_insert_sorted_by(&self->repeat_symbols_with_rootless_patterns, , symbol);\n }\n }\n\n #ifdef DEBUG_ANALYZE_QUERY\n if (self->repeat_symbols_with_rootless_patterns.size > 0) {\n printf(\"\\nRepetition symbols with rootless patterns:\\n\");\n printf(\"aborted analysis: %d\\n\", analysis.did_abort);\n for (unsigned i = 0; i < self->repeat_symbols_with_rootless_patterns.size; i++) {\n TSSymbol symbol = *array_get(&self->repeat_symbols_with_rootless_patterns, i);\n printf(\" %u, %s\\n\", symbol, ts_language_symbol_name(self->language, symbol));\n }\n printf(\"\\n\");\n }\n #endif\n\n // Cleanup\n for (unsigned i = 0; i < subgraphs.size; i++) {\n array_delete(&array_get(&subgraphs, i)->start_states);\n array_delete(&array_get(&subgraphs, i)->nodes);\n }\n array_delete(&subgraphs);\n query_analysis__delete(&analysis);\n array_delete(&next_nodes);\n array_delete(&predicate_capture_ids);\n state_predecessor_map_delete(&predecessor_map);\n\nsupertype_cleanup:\n array_delete(&non_rooted_pattern_start_steps);\n array_delete(&parent_step_indices);\n\n return all_patterns_are_valid;\n}\n\nstatic void ts_query__add_negated_fields(\n TSQuery *self,\n uint16_t step_index,\n TSFieldId *field_ids,\n uint16_t field_count\n) {\n QueryStep *step = array_get(&self->steps, step_index);\n\n // The negated field array stores a list of field lists, separated by zeros.\n // Try to find the start index of an existing list that matches this new list.\n bool failed_match = false;\n unsigned match_count = 0;\n unsigned start_i = 0;\n for (unsigned i = 0; i < self->negated_fields.size; i++) {\n TSFieldId existing_field_id = *array_get(&self->negated_fields, i);\n\n // At each zero value, terminate the match attempt. If we've exactly\n // matched the new field list, then reuse this index. Otherwise,\n // start over the matching process.\n if (existing_field_id == 0) {\n if (match_count == field_count) {\n step->negated_field_list_id = start_i;\n return;\n } else {\n start_i = i + 1;\n match_count = 0;\n failed_match = false;\n }\n }\n\n // If the existing list matches our new list so far, then advance\n // to the next element of the new list.\n else if (\n match_count < field_count &&\n existing_field_id == field_ids[match_count] &&\n !failed_match\n ) {\n match_count++;\n }\n\n // Otherwise, this existing list has failed to match.\n else {\n match_count = 0;\n failed_match = true;\n }\n }\n\n step->negated_field_list_id = self->negated_fields.size;\n array_extend(&self->negated_fields, field_count, field_ids);\n array_push(&self->negated_fields, 0);\n}\n\nstatic TSQueryError ts_query__parse_string_literal(\n TSQuery *self,\n Stream *stream\n) {\n const char *string_start = stream->input;\n if (stream->next != '\"') return TSQueryErrorSyntax;\n stream_advance(stream);\n const char *prev_position = stream->input;\n\n bool is_escaped = false;\n array_clear(&self->string_buffer);\n for (;;) {\n if (is_escaped) {\n is_escaped = false;\n switch (stream->next) {\n case 'n':\n array_push(&self->string_buffer, '\\n');\n break;\n case 'r':\n array_push(&self->string_buffer, '\\r');\n break;\n case 't':\n array_push(&self->string_buffer, '\\t');\n break;\n case '0':\n array_push(&self->string_buffer, '\\0');\n break;\n default:\n array_extend(&self->string_buffer, stream->next_size, stream->input);\n break;\n }\n prev_position = stream->input + stream->next_size;\n } else {\n if (stream->next == '\\\\') {\n array_extend(&self->string_buffer, (uint32_t)(stream->input - prev_position), prev_position);\n prev_position = stream->input + 1;\n is_escaped = true;\n } else if (stream->next == '\"') {\n array_extend(&self->string_buffer, (uint32_t)(stream->input - prev_position), prev_position);\n stream_advance(stream);\n return TSQueryErrorNone;\n } else if (stream->next == '\\n') {\n stream_reset(stream, string_start);\n return TSQueryErrorSyntax;\n }\n }\n if (!stream_advance(stream)) {\n stream_reset(stream, string_start);\n return TSQueryErrorSyntax;\n }\n }\n}\n\n// Parse a single predicate associated with a pattern, adding it to the\n// query's internal `predicate_steps` array. Predicates are arbitrary\n// S-expressions associated with a pattern which are meant to be handled at\n// a higher level of abstraction, such as the Rust/JavaScript bindings. They\n// can contain '@'-prefixed capture names, double-quoted strings, and bare\n// symbols, which also represent strings.\nstatic TSQueryError ts_query__parse_predicate(\n TSQuery *self,\n Stream *stream\n) {\n if (!stream_is_ident_start(stream)) return TSQueryErrorSyntax;\n const char *predicate_name = stream->input;\n stream_scan_identifier(stream);\n if (stream->next != '?' && stream->next != '!') {\n return TSQueryErrorSyntax;\n }\n stream_advance(stream);\n uint32_t length = (uint32_t)(stream->input - predicate_name);\n uint16_t id = symbol_table_insert_name(\n &self->predicate_values,\n predicate_name,\n length\n );\n array_push(&self->predicate_steps, ((TSQueryPredicateStep) {\n .type = TSQueryPredicateStepTypeString,\n .value_id = id,\n }));\n stream_skip_whitespace(stream);\n\n for (;;) {\n if (stream->next == ')') {\n stream_advance(stream);\n stream_skip_whitespace(stream);\n array_push(&self->predicate_steps, ((TSQueryPredicateStep) {\n .type = TSQueryPredicateStepTypeDone,\n .value_id = 0,\n }));\n break;\n }\n\n // Parse an '@'-prefixed capture name\n else if (stream->next == '@') {\n stream_advance(stream);\n\n // Parse the capture name\n if (!stream_is_ident_start(stream)) return TSQueryErrorSyntax;\n const char *capture_name = stream->input;\n stream_scan_identifier(stream);\n uint32_t capture_length = (uint32_t)(stream->input - capture_name);\n\n // Add the capture id to the first step of the pattern\n int capture_id = symbol_table_id_for_name(\n &self->captures,\n capture_name,\n capture_length\n );\n if (capture_id == -1) {\n stream_reset(stream, capture_name);\n return TSQueryErrorCapture;\n }\n\n array_push(&self->predicate_steps, ((TSQueryPredicateStep) {\n .type = TSQueryPredicateStepTypeCapture,\n .value_id = capture_id,\n }));\n }\n\n // Parse a string literal\n else if (stream->next == '\"') {\n TSQueryError e = ts_query__parse_string_literal(self, stream);\n if (e) return e;\n uint16_t query_id = symbol_table_insert_name(\n &self->predicate_values,\n self->string_buffer.contents,\n self->string_buffer.size\n );\n array_push(&self->predicate_steps, ((TSQueryPredicateStep) {\n .type = TSQueryPredicateStepTypeString,\n .value_id = query_id,\n }));\n }\n\n // Parse a bare symbol\n else if (stream_is_ident_start(stream)) {\n const char *symbol_start = stream->input;\n stream_scan_identifier(stream);\n uint32_t symbol_length = (uint32_t)(stream->input - symbol_start);\n uint16_t query_id = symbol_table_insert_name(\n &self->predicate_values,\n symbol_start,\n symbol_length\n );\n array_push(&self->predicate_steps, ((TSQueryPredicateStep) {\n .type = TSQueryPredicateStepTypeString,\n .value_id = query_id,\n }));\n }\n\n else {\n return TSQueryErrorSyntax;\n }\n\n stream_skip_whitespace(stream);\n }\n\n return 0;\n}\n\n// Read one S-expression pattern from the stream, and incorporate it into\n// the query's internal state machine representation. For nested patterns,\n// this function calls itself recursively.\n//\n// The caller is responsible for passing in a dedicated CaptureQuantifiers.\n// These should not be shared between different calls to ts_query__parse_pattern!\nstatic TSQueryError ts_query__parse_pattern(\n TSQuery *self,\n Stream *stream,\n uint32_t depth,\n bool is_immediate,\n bool is_inside_alternation,\n CaptureQuantifiers *capture_quantifiers\n) {\n if (stream->next == 0) return TSQueryErrorSyntax;\n if (stream->next == ')' || stream->next == ']') return PARENT_DONE;\n\n const uint32_t starting_step_index = self->steps.size;\n\n // Store the byte offset of each step in the query.\n if (\n self->step_offsets.size == 0 ||\n array_back(&self->step_offsets)->step_index != starting_step_index\n ) {\n array_push(&self->step_offsets, ((StepOffset) {\n .step_index = starting_step_index,\n .byte_offset = stream_offset(stream),\n }));\n }\n\n // An open bracket is the start of an alternation.\n if (stream->next == '[') {\n stream_advance(stream);\n stream_skip_whitespace(stream);\n\n // Parse each branch, and add a placeholder step in between the branches.\n Array(uint32_t) branch_step_indices = array_new();\n CaptureQuantifiers branch_capture_quantifiers = capture_quantifiers_new();\n for (;;) {\n uint32_t start_index = self->steps.size;\n TSQueryError e = ts_query__parse_pattern(\n self,\n stream,\n depth,\n is_immediate,\n true,\n &branch_capture_quantifiers\n );\n\n if (e == PARENT_DONE) {\n if (stream->next == ']' && branch_step_indices.size > 0) {\n stream_advance(stream);\n break;\n }\n e = TSQueryErrorSyntax;\n }\n if (e) {\n capture_quantifiers_delete(&branch_capture_quantifiers);\n array_delete(&branch_step_indices);\n return e;\n }\n\n if (start_index == starting_step_index) {\n capture_quantifiers_replace(capture_quantifiers, &branch_capture_quantifiers);\n } else {\n capture_quantifiers_join_all(capture_quantifiers, &branch_capture_quantifiers);\n }\n\n array_push(&branch_step_indices, start_index);\n array_push(&self->steps, query_step__new(0, depth, false));\n capture_quantifiers_clear(&branch_capture_quantifiers);\n }\n (void)array_pop(&self->steps);\n\n // For all of the branches except for the last one, add the subsequent branch as an\n // alternative, and link the end of the branch to the current end of the steps.\n for (unsigned i = 0; i < branch_step_indices.size - 1; i++) {\n uint32_t step_index = *array_get(&branch_step_indices, i);\n uint32_t next_step_index = *array_get(&branch_step_indices, i + 1);\n QueryStep *start_step = array_get(&self->steps, step_index);\n QueryStep *end_step = array_get(&self->steps, next_step_index - 1);\n start_step->alternative_index = next_step_index;\n end_step->alternative_index = self->steps.size;\n end_step->is_dead_end = true;\n }\n\n capture_quantifiers_delete(&branch_capture_quantifiers);\n array_delete(&branch_step_indices);\n }\n\n // An open parenthesis can be the start of three possible constructs:\n // * A grouped sequence\n // * A predicate\n // * A named node\n else if (stream->next == '(') {\n stream_advance(stream);\n stream_skip_whitespace(stream);\n\n // If this parenthesis is followed by a node, then it represents a grouped sequence.\n if (stream->next == '(' || stream->next == '\"' || stream->next == '[') {\n bool child_is_immediate = is_immediate;\n CaptureQuantifiers child_capture_quantifiers = capture_quantifiers_new();\n for (;;) {\n if (stream->next == '.') {\n child_is_immediate = true;\n stream_advance(stream);\n stream_skip_whitespace(stream);\n }\n TSQueryError e = ts_query__parse_pattern(\n self,\n stream,\n depth,\n child_is_immediate,\n is_inside_alternation,\n &child_capture_quantifiers\n );\n if (e == PARENT_DONE) {\n if (stream->next == ')') {\n stream_advance(stream);\n break;\n }\n e = TSQueryErrorSyntax;\n }\n if (e) {\n capture_quantifiers_delete(&child_capture_quantifiers);\n return e;\n }\n\n capture_quantifiers_add_all(capture_quantifiers, &child_capture_quantifiers);\n capture_quantifiers_clear(&child_capture_quantifiers);\n child_is_immediate = false;\n }\n\n capture_quantifiers_delete(&child_capture_quantifiers);\n }\n\n // A dot/pound character indicates the start of a predicate.\n else if (stream->next == '.' || stream->next == '#') {\n stream_advance(stream);\n return ts_query__parse_predicate(self, stream);\n }\n\n // Otherwise, this parenthesis is the start of a named node.\n else {\n TSSymbol symbol;\n bool is_missing = false;\n const char *node_name = stream->input;\n\n // Parse a normal node name\n if (stream_is_ident_start(stream)) {\n stream_scan_identifier(stream);\n uint32_t length = (uint32_t)(stream->input - node_name);\n\n // Parse the wildcard symbol\n if (length == 1 && node_name[0] == '_') {\n symbol = WILDCARD_SYMBOL;\n } else if (!strncmp(node_name, \"MISSING\", length)) {\n is_missing = true;\n stream_skip_whitespace(stream);\n\n if (stream_is_ident_start(stream)) {\n const char *missing_node_name = stream->input;\n stream_scan_identifier(stream);\n uint32_t missing_node_length = (uint32_t)(stream->input - missing_node_name);\n symbol = ts_language_symbol_for_name(\n self->language,\n missing_node_name,\n missing_node_length,\n true\n );\n if (!symbol) {\n stream_reset(stream, missing_node_name);\n return TSQueryErrorNodeType;\n }\n }\n\n else if (stream->next == '\"') {\n const char *string_start = stream->input;\n TSQueryError e = ts_query__parse_string_literal(self, stream);\n if (e) return e;\n\n symbol = ts_language_symbol_for_name(\n self->language,\n self->string_buffer.contents,\n self->string_buffer.size,\n false\n );\n if (!symbol) {\n stream_reset(stream, string_start + 1);\n return TSQueryErrorNodeType;\n }\n }\n\n else if (stream->next == ')') {\n symbol = WILDCARD_SYMBOL;\n }\n\n else {\n stream_reset(stream, stream->input);\n return TSQueryErrorSyntax;\n }\n }\n\n else {\n symbol = ts_language_symbol_for_name(\n self->language,\n node_name,\n length,\n true\n );\n if (!symbol) {\n stream_reset(stream, node_name);\n return TSQueryErrorNodeType;\n }\n }\n } else {\n return TSQueryErrorSyntax;\n }\n\n // Add a step for the node.\n array_push(&self->steps, query_step__new(symbol, depth, is_immediate));\n QueryStep *step = array_back(&self->steps);\n if (ts_language_symbol_metadata(self->language, symbol).supertype) {\n step->supertype_symbol = step->symbol;\n step->symbol = WILDCARD_SYMBOL;\n }\n if (is_missing) {\n step->is_missing = true;\n }\n if (symbol == WILDCARD_SYMBOL) {\n step->is_named = true;\n }\n\n // Parse a supertype symbol\n if (stream->next == '/') {\n if (!step->supertype_symbol) {\n stream_reset(stream, node_name - 1); // reset to the start of the node\n return TSQueryErrorStructure;\n }\n\n stream_advance(stream);\n\n const char *subtype_node_name = stream->input;\n\n if (stream_is_ident_start(stream)) { // Named node\n stream_scan_identifier(stream);\n uint32_t length = (uint32_t)(stream->input - subtype_node_name);\n step->symbol = ts_language_symbol_for_name(\n self->language,\n subtype_node_name,\n length,\n true\n );\n } else if (stream->next == '\"') { // Anonymous leaf node\n TSQueryError e = ts_query__parse_string_literal(self, stream);\n if (e) return e;\n step->symbol = ts_language_symbol_for_name(\n self->language,\n self->string_buffer.contents,\n self->string_buffer.size,\n false\n );\n } else {\n return TSQueryErrorSyntax;\n }\n\n if (!step->symbol) {\n stream_reset(stream, subtype_node_name);\n return TSQueryErrorNodeType;\n }\n\n // Get all the possible subtypes for the given supertype,\n // and check if the given subtype is valid.\n if (self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {\n uint32_t subtype_length;\n const TSSymbol *subtypes = ts_language_subtypes(\n self->language,\n step->supertype_symbol,\n &subtype_length\n );\n\n bool subtype_is_valid = false;\n for (uint32_t i = 0; i < subtype_length; i++) {\n if (subtypes[i] == step->symbol) {\n subtype_is_valid = true;\n break;\n }\n }\n\n // This subtype is not valid for the given supertype.\n if (!subtype_is_valid) {\n stream_reset(stream, node_name - 1); // reset to the start of the node\n return TSQueryErrorStructure;\n }\n }\n }\n\n stream_skip_whitespace(stream);\n\n // Parse the child patterns\n bool child_is_immediate = false;\n uint16_t last_child_step_index = 0;\n uint16_t negated_field_count = 0;\n TSFieldId negated_field_ids[MAX_NEGATED_FIELD_COUNT];\n CaptureQuantifiers child_capture_quantifiers = capture_quantifiers_new();\n for (;;) {\n // Parse a negated field assertion\n if (stream->next == '!') {\n stream_advance(stream);\n stream_skip_whitespace(stream);\n if (!stream_is_ident_start(stream)) {\n capture_quantifiers_delete(&child_capture_quantifiers);\n return TSQueryErrorSyntax;\n }\n const char *field_name = stream->input;\n stream_scan_identifier(stream);\n uint32_t length = (uint32_t)(stream->input - field_name);\n stream_skip_whitespace(stream);\n\n TSFieldId field_id = ts_language_field_id_for_name(\n self->language,\n field_name,\n length\n );\n if (!field_id) {\n stream->input = field_name;\n capture_quantifiers_delete(&child_capture_quantifiers);\n return TSQueryErrorField;\n }\n\n // Keep the field ids sorted.\n if (negated_field_count < MAX_NEGATED_FIELD_COUNT) {\n negated_field_ids[negated_field_count] = field_id;\n negated_field_count++;\n }\n\n continue;\n }\n\n // Parse a sibling anchor\n if (stream->next == '.') {\n child_is_immediate = true;\n stream_advance(stream);\n stream_skip_whitespace(stream);\n }\n\n uint16_t step_index = self->steps.size;\n TSQueryError e = ts_query__parse_pattern(\n self,\n stream,\n depth + 1,\n child_is_immediate,\n is_inside_alternation,\n &child_capture_quantifiers\n );\n // In the event we only parsed a predicate, meaning no new steps were added,\n // then subtract one so we're not indexing past the end of the array\n if (step_index == self->steps.size) step_index--;\n if (e == PARENT_DONE) {\n if (stream->next == ')') {\n if (child_is_immediate) {\n if (last_child_step_index == 0) {\n capture_quantifiers_delete(&child_capture_quantifiers);\n return TSQueryErrorSyntax;\n }\n // Mark this step *and* its alternatives as the last child of the parent.\n QueryStep *last_child_step = array_get(&self->steps, last_child_step_index);\n last_child_step->is_last_child = true;\n if (\n last_child_step->alternative_index != NONE &&\n last_child_step->alternative_index < self->steps.size\n ) {\n QueryStep *alternative_step = array_get(&self->steps, last_child_step->alternative_index);\n alternative_step->is_last_child = true;\n while (\n alternative_step->alternative_index != NONE &&\n alternative_step->alternative_index < self->steps.size\n ) {\n alternative_step = array_get(&self->steps, alternative_step->alternative_index);\n alternative_step->is_last_child = true;\n }\n }\n }\n\n if (negated_field_count) {\n ts_query__add_negated_fields(\n self,\n starting_step_index,\n negated_field_ids,\n negated_field_count\n );\n }\n\n stream_advance(stream);\n break;\n }\n e = TSQueryErrorSyntax;\n }\n if (e) {\n capture_quantifiers_delete(&child_capture_quantifiers);\n return e;\n }\n\n capture_quantifiers_add_all(capture_quantifiers, &child_capture_quantifiers);\n\n last_child_step_index = step_index;\n child_is_immediate = false;\n capture_quantifiers_clear(&child_capture_quantifiers);\n }\n capture_quantifiers_delete(&child_capture_quantifiers);\n }\n }\n\n // Parse a wildcard pattern\n else if (stream->next == '_') {\n stream_advance(stream);\n stream_skip_whitespace(stream);\n\n // Add a step that matches any kind of node\n array_push(&self->steps, query_step__new(WILDCARD_SYMBOL, depth, is_immediate));\n }\n\n // Parse a double-quoted anonymous leaf node expression\n else if (stream->next == '\"') {\n const char *string_start = stream->input;\n TSQueryError e = ts_query__parse_string_literal(self, stream);\n if (e) return e;\n\n // Add a step for the node\n TSSymbol symbol = ts_language_symbol_for_name(\n self->language,\n self->string_buffer.contents,\n self->string_buffer.size,\n false\n );\n if (!symbol) {\n stream_reset(stream, string_start + 1);\n return TSQueryErrorNodeType;\n }\n array_push(&self->steps, query_step__new(symbol, depth, is_immediate));\n }\n\n // Parse a field-prefixed pattern\n else if (stream_is_ident_start(stream)) {\n // Parse the field name\n const char *field_name = stream->input;\n stream_scan_identifier(stream);\n uint32_t length = (uint32_t)(stream->input - field_name);\n stream_skip_whitespace(stream);\n\n if (stream->next != ':') {\n stream_reset(stream, field_name);\n return TSQueryErrorSyntax;\n }\n stream_advance(stream);\n stream_skip_whitespace(stream);\n\n // Parse the pattern\n CaptureQuantifiers field_capture_quantifiers = capture_quantifiers_new();\n TSQueryError e = ts_query__parse_pattern(\n self,\n stream,\n depth,\n is_immediate,\n is_inside_alternation,\n &field_capture_quantifiers\n );\n if (e) {\n capture_quantifiers_delete(&field_capture_quantifiers);\n if (e == PARENT_DONE) e = TSQueryErrorSyntax;\n return e;\n }\n\n // Add the field name to the first step of the pattern\n TSFieldId field_id = ts_language_field_id_for_name(\n self->language,\n field_name,\n length\n );\n if (!field_id) {\n stream->input = field_name;\n return TSQueryErrorField;\n }\n\n uint32_t step_index = starting_step_index;\n QueryStep *step = array_get(&self->steps, step_index);\n for (;;) {\n step->field = field_id;\n if (\n step->alternative_index != NONE &&\n step->alternative_index > step_index &&\n step->alternative_index < self->steps.size\n ) {\n step_index = step->alternative_index;\n step = array_get(&self->steps, step_index);\n } else {\n break;\n }\n }\n\n capture_quantifiers_add_all(capture_quantifiers, &field_capture_quantifiers);\n capture_quantifiers_delete(&field_capture_quantifiers);\n }\n\n else {\n return TSQueryErrorSyntax;\n }\n\n stream_skip_whitespace(stream);\n\n // Parse suffixes modifiers for this pattern\n TSQuantifier quantifier = TSQuantifierOne;\n for (;;) {\n // Parse the one-or-more operator.\n if (stream->next == '+') {\n quantifier = quantifier_join(TSQuantifierOneOrMore, quantifier);\n\n stream_advance(stream);\n stream_skip_whitespace(stream);\n }\n\n // Parse the zero-or-more repetition operator.\n else if (stream->next == '*') {\n quantifier = quantifier_join(TSQuantifierZeroOrMore, quantifier);\n\n stream_advance(stream);\n stream_skip_whitespace(stream);\n }\n\n // Parse the optional operator.\n else if (stream->next == '?') {\n quantifier = quantifier_join(TSQuantifierZeroOrOne, quantifier);\n\n stream_advance(stream);\n stream_skip_whitespace(stream);\n }\n\n // Parse an '@'-prefixed capture pattern\n else if (stream->next == '@') {\n stream_advance(stream);\n if (!stream_is_ident_start(stream)) return TSQueryErrorSyntax;\n const char *capture_name = stream->input;\n stream_scan_identifier(stream);\n uint32_t length = (uint32_t)(stream->input - capture_name);\n stream_skip_whitespace(stream);\n\n // Add the capture id to the first step of the pattern\n uint16_t capture_id = symbol_table_insert_name(\n &self->captures,\n capture_name,\n length\n );\n\n // Add the capture quantifier\n capture_quantifiers_add_for_id(capture_quantifiers, capture_id, TSQuantifierOne);\n\n uint32_t step_index = starting_step_index;\n for (;;) {\n QueryStep *step = array_get(&self->steps, step_index);\n query_step__add_capture(step, capture_id);\n if (\n step->alternative_index != NONE &&\n step->alternative_index > step_index &&\n step->alternative_index < self->steps.size\n ) {\n step_index = step->alternative_index;\n } else {\n break;\n }\n }\n }\n\n // No more suffix modifiers\n else {\n break;\n }\n }\n\n QueryStep repeat_step;\n QueryStep *step;\n switch (quantifier) {\n case TSQuantifierOneOrMore:\n repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false);\n repeat_step.is_inside_alternation = is_inside_alternation;\n repeat_step.alternative_index = starting_step_index;\n repeat_step.is_pass_through = true;\n array_push(&self->steps, repeat_step);\n break;\n case TSQuantifierZeroOrMore:\n repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false);\n repeat_step.is_inside_alternation = is_inside_alternation;\n repeat_step.alternative_index = starting_step_index;\n repeat_step.is_pass_through = true;\n array_push(&self->steps, repeat_step);\n\n // Stop when `step->alternative_index` is `NONE` or it points to\n // `repeat_step` or beyond. Note that having just been pushed,\n // `repeat_step` occupies slot `self->steps.size - 1`.\n step = array_get(&self->steps, starting_step_index);\n while (step->alternative_index != NONE && step->alternative_index < self->steps.size - 1) {\n step = array_get(&self->steps, step->alternative_index);\n }\n step->alternative_index = self->steps.size;\n break;\n case TSQuantifierZeroOrOne:\n step = array_get(&self->steps, starting_step_index);\n while (step->alternative_index != NONE && step->alternative_index < self->steps.size) {\n step = array_get(&self->steps, step->alternative_index);\n }\n step->alternative_index = self->steps.size;\n break;\n default:\n break;\n }\n\n capture_quantifiers_mul(capture_quantifiers, quantifier);\n\n return 0;\n}\n\nTSQuery *ts_query_new(\n const TSLanguage *language,\n const char *source,\n uint32_t source_len,\n uint32_t *error_offset,\n TSQueryError *error_type\n) {\n if (\n !language ||\n language->abi_version > TREE_SITTER_LANGUAGE_VERSION ||\n language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION\n ) {\n *error_type = TSQueryErrorLanguage;\n return NULL;\n }\n\n TSQuery *self = ts_malloc(sizeof(TSQuery));\n *self = (TSQuery) {\n .steps = array_new(),\n .pattern_map = array_new(),\n .captures = symbol_table_new(),\n .capture_quantifiers = array_new(),\n .predicate_values = symbol_table_new(),\n .predicate_steps = array_new(),\n .patterns = array_new(),\n .step_offsets = array_new(),\n .string_buffer = array_new(),\n .negated_fields = array_new(),\n .repeat_symbols_with_rootless_patterns = array_new(),\n .wildcard_root_pattern_count = 0,\n .language = ts_language_copy(language),\n };\n\n array_push(&self->negated_fields, 0);\n\n // Parse all of the S-expressions in the given string.\n Stream stream = stream_new(source, source_len);\n stream_skip_whitespace(&stream);\n while (stream.input < stream.end) {\n uint32_t pattern_index = self->patterns.size;\n uint32_t start_step_index = self->steps.size;\n uint32_t start_predicate_step_index = self->predicate_steps.size;\n array_push(&self->patterns, ((QueryPattern) {\n .steps = (Slice) {.offset = start_step_index},\n .predicate_steps = (Slice) {.offset = start_predicate_step_index},\n .start_byte = stream_offset(&stream),\n .is_non_local = false,\n }));\n CaptureQuantifiers capture_quantifiers = capture_quantifiers_new();\n *error_type = ts_query__parse_pattern(self, &stream, 0, false, false, &capture_quantifiers);\n array_push(&self->steps, query_step__new(0, PATTERN_DONE_MARKER, false));\n\n QueryPattern *pattern = array_back(&self->patterns);\n pattern->steps.length = self->steps.size - start_step_index;\n pattern->predicate_steps.length = self->predicate_steps.size - start_predicate_step_index;\n pattern->end_byte = stream_offset(&stream);\n\n // If any pattern could not be parsed, then report the error information\n // and terminate.\n if (*error_type) {\n if (*error_type == PARENT_DONE) *error_type = TSQueryErrorSyntax;\n *error_offset = stream_offset(&stream);\n capture_quantifiers_delete(&capture_quantifiers);\n ts_query_delete(self);\n return NULL;\n }\n\n // Maintain a list of capture quantifiers for each pattern\n array_push(&self->capture_quantifiers, capture_quantifiers);\n\n // Maintain a map that can look up patterns for a given root symbol.\n uint16_t wildcard_root_alternative_index = NONE;\n for (;;) {\n QueryStep *step = array_get(&self->steps, start_step_index);\n\n // If a pattern has a wildcard at its root, but it has a non-wildcard child,\n // then optimize the matching process by skipping matching the wildcard.\n // Later, during the matching process, the query cursor will check that\n // there is a parent node, and capture it if necessary.\n if (step->symbol == WILDCARD_SYMBOL && step->depth == 0 && !step->field) {\n QueryStep *second_step = array_get(&self->steps, start_step_index + 1);\n if (second_step->symbol != WILDCARD_SYMBOL && second_step->depth == 1 && !second_step->is_immediate) {\n wildcard_root_alternative_index = step->alternative_index;\n start_step_index += 1;\n step = second_step;\n }\n }\n\n // Determine whether the pattern has a single root node. This affects\n // decisions about whether or not to start matching the pattern when\n // a query cursor has a range restriction or when immediately within an\n // error node.\n uint32_t start_depth = step->depth;\n bool is_rooted = start_depth == 0;\n for (uint32_t step_index = start_step_index + 1; step_index < self->steps.size; step_index++) {\n QueryStep *child_step = array_get(&self->steps, step_index);\n if (child_step->is_dead_end) break;\n if (child_step->depth == start_depth) {\n is_rooted = false;\n break;\n }\n }\n\n ts_query__pattern_map_insert(self, step->symbol, (PatternEntry) {\n .step_index = start_step_index,\n .pattern_index = pattern_index,\n .is_rooted = is_rooted\n });\n if (step->symbol == WILDCARD_SYMBOL) {\n self->wildcard_root_pattern_count++;\n }\n\n // If there are alternatives or options at the root of the pattern,\n // then add multiple entries to the pattern map.\n if (step->alternative_index != NONE) {\n start_step_index = step->alternative_index;\n } else if (wildcard_root_alternative_index != NONE) {\n start_step_index = wildcard_root_alternative_index;\n wildcard_root_alternative_index = NONE;\n } else {\n break;\n }\n }\n\n // Fix up quantifier loop-backs within alternations. When a branch of an\n // alternation has a + or * quantifier, the quantifier's pass_through step\n // loops back to the branch's first step. However, the alternation linking\n // assigns that same step's `alternative_index` to point to the _next_ branch.\n // This causes the quantifier loop to incorrectly explore other alternation branches,\n // when a quantified branch matches, loops back, and then fails to match. To correct\n // this, we create \"clean\" copies of the branches' first steps without the link to the\n // next branch. After a quantified branch matches, it loops back to the cleaned copy.\n {\n uint32_t pat_start = pattern->steps.offset;\n uint32_t pat_end = pat_start + pattern->steps.length - 1; // exclude DONE\n\n for (uint32_t i = pat_start; i < pat_end; i++) {\n QueryStep *s = array_get(&self->steps, i);\n // Ensure this step is a pass_through with a _backward_ alternative (a quantifier loop-back)\n if (!s->is_pass_through || !s->is_inside_alternation\n || s->alternative_index == NONE || s->alternative_index >= i) continue;\n\n uint32_t target_idx = s->alternative_index;\n QueryStep *target = array_get(&self->steps, target_idx);\n\n // Check if the target has a forward alternative from alternation linking\n uint16_t target_alt_index = target->alternative_index;\n if (target_alt_index == NONE\n || target_alt_index <= target_idx || target_alt_index >= pat_end) continue;\n\n // Create a clean copy of the target step without the alternation alternative.\n uint32_t copy_idx = self->steps.size;\n QueryStep copy = *target;\n copy.alternative_index = NONE;\n uint16_t target_depth = target->depth;\n array_push(&self->steps, copy);\n\n // Add a dead_end that redirects to the pass through step after the target,\n // so the pattern continues correctly after the cleaned copy matches.\n QueryStep redirect = query_step__new(0, target_depth, false);\n redirect.is_dead_end = true;\n redirect.alternative_index = target_idx + 1;\n array_push(&self->steps, redirect);\n\n // Update the pass_through to loop back to the copy. Reacquire `s` since\n // `self->steps` may have been reallocated.\n s = array_get(&self->steps, i);\n s->alternative_index = copy_idx;\n }\n }\n }\n\n if (!ts_query__analyze_patterns(self, error_offset)) {\n *error_type = TSQueryErrorStructure;\n ts_query_delete(self);\n return NULL;\n }\n\n array_delete(&self->string_buffer);\n return self;\n}\n\nvoid ts_query_delete(TSQuery *self) {\n if (self) {\n array_delete(&self->steps);\n array_delete(&self->pattern_map);\n array_delete(&self->predicate_steps);\n array_delete(&self->patterns);\n array_delete(&self->step_offsets);\n array_delete(&self->string_buffer);\n array_delete(&self->negated_fields);\n array_delete(&self->repeat_symbols_with_rootless_patterns);\n ts_language_delete(self->language);\n symbol_table_delete(&self->captures);\n symbol_table_delete(&self->predicate_values);\n for (uint32_t index = 0; index < self->capture_quantifiers.size; index++) {\n CaptureQuantifiers *capture_quantifiers = array_get(&self->capture_quantifiers, index);\n capture_quantifiers_delete(capture_quantifiers);\n }\n array_delete(&self->capture_quantifiers);\n ts_free(self);\n }\n}\n\nuint32_t ts_query_pattern_count(const TSQuery *self) {\n return self->patterns.size;\n}\n\nuint32_t ts_query_capture_count(const TSQuery *self) {\n return self->captures.slices.size;\n}\n\nuint32_t ts_query_string_count(const TSQuery *self) {\n return self->predicate_values.slices.size;\n}\n\nconst char *ts_query_capture_name_for_id(\n const TSQuery *self,\n uint32_t index,\n uint32_t *length\n) {\n return symbol_table_name_for_id(&self->captures, index, length);\n}\n\nTSQuantifier ts_query_capture_quantifier_for_id(\n const TSQuery *self,\n uint32_t pattern_index,\n uint32_t capture_index\n) {\n CaptureQuantifiers *capture_quantifiers = array_get(&self->capture_quantifiers, pattern_index);\n return capture_quantifier_for_id(capture_quantifiers, capture_index);\n}\n\nconst char *ts_query_string_value_for_id(\n const TSQuery *self,\n uint32_t index,\n uint32_t *length\n) {\n return symbol_table_name_for_id(&self->predicate_values, index, length);\n}\n\nconst TSQueryPredicateStep *ts_query_predicates_for_pattern(\n const TSQuery *self,\n uint32_t pattern_index,\n uint32_t *step_count\n) {\n Slice slice = array_get(&self->patterns, pattern_index)->predicate_steps;\n *step_count = slice.length;\n if (slice.length == 0) return NULL;\n return array_get(&self->predicate_steps, slice.offset);\n}\n\nuint32_t ts_query_start_byte_for_pattern(\n const TSQuery *self,\n uint32_t pattern_index\n) {\n return array_get(&self->patterns, pattern_index)->start_byte;\n}\n\nuint32_t ts_query_end_byte_for_pattern(\n const TSQuery *self,\n uint32_t pattern_index\n) {\n return array_get(&self->patterns, pattern_index)->end_byte;\n}\n\nbool ts_query_is_pattern_rooted(\n const TSQuery *self,\n uint32_t pattern_index\n) {\n for (unsigned i = 0; i < self->pattern_map.size; i++) {\n PatternEntry *entry = array_get(&self->pattern_map, i);\n if (entry->pattern_index == pattern_index) {\n if (!entry->is_rooted) return false;\n }\n }\n return true;\n}\n\nbool ts_query_is_pattern_non_local(\n const TSQuery *self,\n uint32_t pattern_index\n) {\n if (pattern_index < self->patterns.size) {\n return array_get(&self->patterns, pattern_index)->is_non_local;\n } else {\n return false;\n }\n}\n\nbool ts_query_is_pattern_guaranteed_at_step(\n const TSQuery *self,\n uint32_t byte_offset\n) {\n uint32_t step_index = UINT32_MAX;\n for (unsigned i = 0; i < self->step_offsets.size; i++) {\n StepOffset *step_offset = array_get(&self->step_offsets, i);\n if (step_offset->byte_offset > byte_offset) break;\n step_index = step_offset->step_index;\n }\n if (step_index < self->steps.size) {\n return array_get(&self->steps, step_index)->root_pattern_guaranteed;\n } else {\n return false;\n }\n}\n\nbool ts_query__step_is_fallible(\n const TSQuery *self,\n uint16_t step_index\n) {\n ts_assert((uint32_t)step_index + 1 < self->steps.size);\n QueryStep *step = array_get(&self->steps, step_index);\n QueryStep *next_step = array_get(&self->steps, step_index + 1);\n return (\n next_step->depth != PATTERN_DONE_MARKER &&\n next_step->depth > step->depth &&\n (!next_step->parent_pattern_guaranteed || step->symbol == WILDCARD_SYMBOL)\n );\n}\n\nvoid ts_query_disable_capture(\n TSQuery *self,\n const char *name,\n uint32_t length\n) {\n // Remove capture information for any pattern step that previously\n // captured with the given name.\n int id = symbol_table_id_for_name(&self->captures, name, length);\n if (id != -1) {\n for (unsigned i = 0; i < self->steps.size; i++) {\n QueryStep *step = array_get(&self->steps, i);\n query_step__remove_capture(step, id);\n }\n }\n}\n\nvoid ts_query_disable_pattern(\n TSQuery *self,\n uint32_t pattern_index\n) {\n // Remove the given pattern from the pattern map. Its steps will still\n // be in the `steps` array, but they will never be read.\n for (unsigned i = 0; i < self->pattern_map.size; i++) {\n PatternEntry *pattern = array_get(&self->pattern_map, i);\n if (pattern->pattern_index == pattern_index) {\n array_erase(&self->pattern_map, i);\n i--;\n }\n }\n}\n\n/***************\n * QueryCursor\n ***************/\n\nTSQueryCursor *ts_query_cursor_new(void) {\n TSQueryCursor *self = ts_malloc(sizeof(TSQueryCursor));\n *self = (TSQueryCursor) {\n .did_exceed_match_limit = false,\n .ascending = false,\n .halted = false,\n .states = array_new(),\n .finished_states = array_new(),\n .capture_list_pool = capture_list_pool_new(),\n .included_range = {\n .start_point = {0, 0},\n .end_point = POINT_MAX,\n .start_byte = 0,\n .end_byte = UINT32_MAX,\n },\n .containing_range = {\n .start_point = {0, 0},\n .end_point = POINT_MAX,\n .start_byte = 0,\n .end_byte = UINT32_MAX,\n },\n .max_start_depth = UINT32_MAX,\n .operation_count = 0,\n };\n array_reserve(&self->states, 8);\n array_reserve(&self->finished_states, 8);\n return self;\n}\n\nvoid ts_query_cursor_delete(TSQueryCursor *self) {\n array_delete(&self->states);\n array_delete(&self->finished_states);\n ts_tree_cursor_delete(&self->cursor);\n capture_list_pool_delete(&self->capture_list_pool);\n ts_free(self);\n}\n\nbool ts_query_cursor_did_exceed_match_limit(const TSQueryCursor *self) {\n return self->did_exceed_match_limit;\n}\n\nuint32_t ts_query_cursor_match_limit(const TSQueryCursor *self) {\n return self->capture_list_pool.max_capture_list_count;\n}\n\nvoid ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit) {\n self->capture_list_pool.max_capture_list_count = limit;\n}\n\n#ifdef DEBUG_EXECUTE_QUERY\n#define LOG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define LOG(...)\n#endif\n\nvoid ts_query_cursor_exec(\n TSQueryCursor *self,\n const TSQuery *query,\n TSNode node\n) {\n if (query) {\n LOG(\"query steps:\\n\");\n for (unsigned i = 0; i < query->steps.size; i++) {\n QueryStep *step = array_get(&query->steps, i);\n LOG(\" %u: {\", i);\n if (step->depth == PATTERN_DONE_MARKER) {\n LOG(\"DONE\");\n } else if (step->is_dead_end) {\n LOG(\"dead_end\");\n } else if (step->is_pass_through) {\n LOG(\"pass_through\");\n } else if (step->symbol != WILDCARD_SYMBOL) {\n LOG(\"symbol: %s\", query->language->symbol_names[step->symbol]);\n } else {\n LOG(\"symbol: *\");\n }\n if (step->field) {\n LOG(\", field: %s\", query->language->field_names[step->field]);\n }\n if (step->alternative_index != NONE) {\n LOG(\", alternative: %u\", step->alternative_index);\n }\n LOG(\"},\\n\");\n }\n }\n\n array_clear(&self->states);\n array_clear(&self->finished_states);\n ts_tree_cursor_reset(&self->cursor, node);\n capture_list_pool_reset(&self->capture_list_pool);\n self->on_visible_node = true;\n self->next_state_id = 0;\n self->depth = 0;\n self->ascending = false;\n self->halted = false;\n self->query = query;\n self->did_exceed_match_limit = false;\n self->operation_count = 0;\n self->query_options = NULL;\n self->query_state = (TSQueryCursorState) {0};\n}\n\nvoid ts_query_cursor_exec_with_options(\n TSQueryCursor *self,\n const TSQuery *query,\n TSNode node,\n const TSQueryCursorOptions *query_options\n) {\n ts_query_cursor_exec(self, query, node);\n if (query_options) {\n self->query_options = query_options;\n self->query_state = (TSQueryCursorState) {\n .payload = query_options->payload\n };\n }\n}\n\nbool ts_query_cursor_set_byte_range(\n TSQueryCursor *self,\n uint32_t start_byte,\n uint32_t end_byte\n) {\n if (end_byte == 0) {\n end_byte = UINT32_MAX;\n }\n if (start_byte > end_byte) {\n return false;\n }\n self->included_range.start_byte = start_byte;\n self->included_range.end_byte = end_byte;\n return true;\n}\n\nbool ts_query_cursor_set_point_range(\n TSQueryCursor *self,\n TSPoint start_point,\n TSPoint end_point\n) {\n if (end_point.row == 0 && end_point.column == 0) {\n end_point = POINT_MAX;\n }\n if (point_gt(start_point, end_point)) {\n return false;\n }\n self->included_range.start_point = start_point;\n self->included_range.end_point = end_point;\n return true;\n}\n\nbool ts_query_cursor_set_containing_byte_range(\n TSQueryCursor *self,\n uint32_t start_byte,\n uint32_t end_byte\n) {\n if (end_byte == 0) {\n end_byte = UINT32_MAX;\n }\n if (start_byte > end_byte) {\n return false;\n }\n self->containing_range.start_byte = start_byte;\n self->containing_range.end_byte = end_byte;\n return true;\n}\n\nbool ts_query_cursor_set_containing_point_range(\n TSQueryCursor *self,\n TSPoint start_point,\n TSPoint end_point\n) {\n if (end_point.row == 0 && end_point.column == 0) {\n end_point = POINT_MAX;\n }\n if (point_gt(start_point, end_point)) {\n return false;\n }\n self->containing_range.start_point = start_point;\n self->containing_range.end_point = end_point;\n return true;\n}\n\n// Search through all of the in-progress states, and find the captured\n// node that occurs earliest in the document.\nstatic bool ts_query_cursor__first_in_progress_capture(\n TSQueryCursor *self,\n uint32_t *state_index,\n uint32_t *byte_offset,\n uint32_t *pattern_index,\n bool *is_definite\n) {\n bool result = false;\n *state_index = UINT32_MAX;\n *byte_offset = UINT32_MAX;\n *pattern_index = UINT32_MAX;\n for (unsigned i = 0; i < self->states.size; i++) {\n QueryState *state = array_get(&self->states, i);\n if (state->dead) continue;\n\n const CaptureList *captures = capture_list_pool_get(\n &self->capture_list_pool,\n state->capture_list_id\n );\n if (state->consumed_capture_count >= captures->size) {\n continue;\n }\n\n TSNode node = array_get(captures, state->consumed_capture_count)->node;\n if (\n ts_node_end_byte(node) <= self->included_range.start_byte ||\n point_lte(ts_node_end_point(node), self->included_range.start_point)\n ) {\n state->consumed_capture_count++;\n i--;\n continue;\n }\n\n uint32_t node_start_byte = ts_node_start_byte(node);\n if (\n !result ||\n node_start_byte < *byte_offset ||\n (node_start_byte == *byte_offset && state->pattern_index < *pattern_index)\n ) {\n QueryStep *step = array_get(&self->query->steps, state->step_index);\n if (is_definite) {\n // We're being a bit conservative here by asserting that the following step\n // is not immediate, because this capture might end up being discarded if the\n // following symbol in the tree isn't the required symbol for this step.\n *is_definite = step->root_pattern_guaranteed && !step->is_immediate;\n } else if (step->root_pattern_guaranteed) {\n continue;\n }\n\n result = true;\n *state_index = i;\n *byte_offset = node_start_byte;\n *pattern_index = state->pattern_index;\n }\n }\n return result;\n}\n\n// Determine which node is first in a depth-first traversal\nint ts_query_cursor__compare_nodes(TSNode left, TSNode right) {\n if (left.id != right.id) {\n uint32_t left_start = ts_node_start_byte(left);\n uint32_t right_start = ts_node_start_byte(right);\n if (left_start < right_start) return -1;\n if (left_start > right_start) return 1;\n uint32_t left_node_count = ts_node_end_byte(left);\n uint32_t right_node_count = ts_node_end_byte(right);\n if (left_node_count > right_node_count) return -1;\n if (left_node_count < right_node_count) return 1;\n }\n return 0;\n}\n\n// Determine if either state contains a superset of the other state's captures.\nvoid ts_query_cursor__compare_captures(\n TSQueryCursor *self,\n QueryState *left_state,\n QueryState *right_state,\n bool *left_contains_right,\n bool *right_contains_left\n) {\n const CaptureList *left_captures = capture_list_pool_get(\n &self->capture_list_pool,\n left_state->capture_list_id\n );\n const CaptureList *right_captures = capture_list_pool_get(\n &self->capture_list_pool,\n right_state->capture_list_id\n );\n *left_contains_right = true;\n *right_contains_left = true;\n unsigned i = 0, j = 0;\n for (;;) {\n if (i < left_captures->size) {\n if (j < right_captures->size) {\n TSQueryCapture *left = array_get(left_captures, i);\n TSQueryCapture *right = array_get(right_captures, j);\n if (left->node.id == right->node.id && left->index == right->index) {\n i++;\n j++;\n } else {\n switch (ts_query_cursor__compare_nodes(left->node, right->node)) {\n case -1:\n *right_contains_left = false;\n i++;\n break;\n case 1:\n *left_contains_right = false;\n j++;\n break;\n default:\n *right_contains_left = false;\n *left_contains_right = false;\n i++;\n j++;\n break;\n }\n }\n } else {\n *right_contains_left = false;\n break;\n }\n } else {\n if (j < right_captures->size) {\n *left_contains_right = false;\n }\n break;\n }\n }\n}\n\nstatic void ts_query_cursor__add_state(\n TSQueryCursor *self,\n const PatternEntry *pattern\n) {\n QueryStep *step = array_get(&self->query->steps, pattern->step_index);\n uint32_t start_depth = self->depth - step->depth;\n\n // Keep the states array in ascending order of start_depth and pattern_index,\n // so that it can be processed more efficiently elsewhere. Usually, there is\n // no work to do here because of two facts:\n // * States with lower start_depth are naturally added first due to the\n // order in which nodes are visited.\n // * Earlier patterns are naturally added first because of the ordering of the\n // pattern_map data structure that's used to initiate matches.\n //\n // This loop is only needed in cases where two conditions hold:\n // * A pattern consists of more than one sibling node, so that its states\n // remain in progress after exiting the node that started the match.\n // * The first node in the pattern matches against multiple nodes at the\n // same depth.\n //\n // An example of this is the pattern '((comment)* (function))'. If multiple\n // `comment` nodes appear in a row, then we may initiate a new state for this\n // pattern while another state for the same pattern is already in progress.\n // If there are multiple patterns like this in a query, then this loop will\n // need to execute in order to keep the states ordered by pattern_index.\n uint32_t index = self->states.size;\n while (index > 0) {\n QueryState *prev_state = array_get(&self->states, index - 1);\n if (prev_state->start_depth < start_depth) break;\n if (prev_state->start_depth == start_depth) {\n // Avoid inserting an unnecessary duplicate state, which would be\n // immediately pruned by the longest-match criteria.\n if (\n prev_state->pattern_index == pattern->pattern_index &&\n prev_state->step_index == pattern->step_index\n ) return;\n if (prev_state->pattern_index <= pattern->pattern_index) break;\n }\n index--;\n }\n\n LOG(\n \" start state. pattern:%u, step:%u\\n\",\n pattern->pattern_index,\n pattern->step_index\n );\n array_insert(&self->states, index, ((QueryState) {\n .id = UINT32_MAX,\n .capture_list_id = NONE,\n .step_index = pattern->step_index,\n .pattern_index = pattern->pattern_index,\n .start_depth = start_depth,\n .consumed_capture_count = 0,\n .seeking_immediate_match = true,\n .has_in_progress_alternatives = false,\n .needs_parent = step->depth == 1,\n .dead = false,\n }));\n}\n\n// Acquire a capture list for this state. If there are no capture lists left in the\n// pool, this will steal the capture list from another existing state, and mark that\n// other state as 'dead'.\nstatic CaptureList *ts_query_cursor__prepare_to_capture(\n TSQueryCursor *self,\n QueryState *state,\n unsigned state_index_to_preserve\n) {\n if (state->capture_list_id == NONE) {\n state->capture_list_id = capture_list_pool_acquire(&self->capture_list_pool);\n\n // If there are no capture lists left in the pool, then terminate whichever\n // state has captured the earliest node in the document, and steal its\n // capture list.\n if (state->capture_list_id == NONE) {\n self->did_exceed_match_limit = true;\n uint32_t state_index, byte_offset, pattern_index;\n if (\n ts_query_cursor__first_in_progress_capture(\n self,\n &state_index,\n &byte_offset,\n &pattern_index,\n NULL\n ) &&\n state_index != state_index_to_preserve\n ) {\n LOG(\n \" abandon state. index:%u, pattern:%u, offset:%u.\\n\",\n state_index, pattern_index, byte_offset\n );\n QueryState *other_state = array_get(&self->states, state_index);\n state->capture_list_id = other_state->capture_list_id;\n other_state->capture_list_id = NONE;\n other_state->dead = true;\n CaptureList *list = capture_list_pool_get_mut(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_clear(list);\n return list;\n } else {\n LOG(\" ran out of capture lists\");\n return NULL;\n }\n }\n }\n return capture_list_pool_get_mut(&self->capture_list_pool, state->capture_list_id);\n}\n\nstatic void ts_query_cursor__capture(\n TSQueryCursor *self,\n QueryState *state,\n QueryStep *step,\n TSNode node\n) {\n if (state->dead) return;\n CaptureList *capture_list = ts_query_cursor__prepare_to_capture(self, state, UINT32_MAX);\n if (!capture_list) {\n state->dead = true;\n return;\n }\n\n for (unsigned j = 0; j < MAX_STEP_CAPTURE_COUNT; j++) {\n uint16_t capture_id = step->capture_ids[j];\n if (step->capture_ids[j] == NONE) break;\n array_push(capture_list, ((TSQueryCapture) { node, capture_id }));\n LOG(\n \" capture node. type:%s, pattern:%u, capture_id:%u, capture_count:%u\\n\",\n ts_node_type(node),\n state->pattern_index,\n capture_id,\n capture_list->size\n );\n }\n}\n\n// Duplicate the given state and insert the newly-created state immediately after\n// the given state in the `states` array. Ensures that the given state reference is\n// still valid, even if the states array is reallocated.\nstatic QueryState *ts_query_cursor__copy_state(\n TSQueryCursor *self,\n QueryState **state_ref\n) {\n const QueryState *state = *state_ref;\n uint32_t state_index = (uint32_t)(state - self->states.contents);\n QueryState copy = *state;\n copy.capture_list_id = NONE;\n\n // If the state has captures, copy its capture list.\n if (state->capture_list_id != NONE) {\n CaptureList *new_captures = ts_query_cursor__prepare_to_capture(self, &copy, state_index);\n if (!new_captures) return NULL;\n const CaptureList *old_captures = capture_list_pool_get(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_push_all(new_captures, old_captures);\n }\n\n array_insert(&self->states, state_index + 1, copy);\n *state_ref = array_get(&self->states, state_index);\n return array_get(&self->states, state_index + 1);\n}\n\nstatic inline bool ts_query_cursor__should_descend(\n TSQueryCursor *self,\n bool node_intersects_range\n) {\n\n if (node_intersects_range && self->depth < self->max_start_depth) {\n return true;\n }\n\n // If there are in-progress matches whose remaining steps occur\n // deeper in the tree, then descend.\n for (unsigned i = 0; i < self->states.size; i++) {\n QueryState *state = array_get(&self->states, i);\n QueryStep *next_step = array_get(&self->query->steps, state->step_index);\n if (\n next_step->depth != PATTERN_DONE_MARKER &&\n state->start_depth + next_step->depth > self->depth\n ) {\n return true;\n }\n }\n\n if (self->depth >= self->max_start_depth) {\n return false;\n }\n\n // If the current node is hidden, then a non-rooted pattern might match\n // one if its roots inside of this node, and match another of its roots\n // as part of a sibling node, so we may need to descend.\n if (!self->on_visible_node) {\n // Descending into a repetition node outside of the range can be\n // expensive, because these nodes can have many visible children.\n // Avoid descending into repetition nodes unless we have already\n // determined that this query can match rootless patterns inside\n // of this type of repetition node.\n Subtree subtree = ts_tree_cursor_current_subtree(&self->cursor);\n if (ts_subtree_is_repetition(subtree)) {\n bool exists;\n uint32_t index;\n array_search_sorted_by(\n &self->query->repeat_symbols_with_rootless_patterns,,\n ts_subtree_symbol(subtree),\n &index,\n &exists\n );\n return exists;\n }\n\n return true;\n }\n\n return false;\n}\n\nbool range_intersects(const TSRange *a, const TSRange *b) {\n bool is_empty = a->start_byte == a->end_byte;\n return (\n (\n a->end_byte > b->start_byte ||\n (is_empty && a->end_byte == b->start_byte)\n ) &&\n (\n point_gt(a->end_point, b->start_point) ||\n (is_empty && point_eq(a->end_point, b->start_point))\n ) &&\n a->start_byte < b->end_byte &&\n point_lt(a->start_point, b->end_point)\n );\n}\n\nbool range_within(const TSRange *a, const TSRange *b) {\n return (\n a->start_byte >= b->start_byte &&\n point_gte(a->start_point, b->start_point) &&\n a->end_byte <= b->end_byte &&\n point_lte(a->end_point, b->end_point)\n );\n}\n\n// Walk the tree, processing patterns until at least one pattern finishes,\n// If one or more patterns finish, return `true` and store their states in the\n// `finished_states` array. Multiple patterns can finish on the same node. If\n// there are no more matches, return `false`.\nstatic inline bool ts_query_cursor__advance(\n TSQueryCursor *self,\n bool stop_on_definite_step\n) {\n bool did_match = false;\n for (;;) {\n if (self->halted) {\n while (self->states.size > 0) {\n QueryState state = array_pop(&self->states);\n capture_list_pool_release(\n &self->capture_list_pool,\n state.capture_list_id\n );\n }\n }\n\n if (++self->operation_count == OP_COUNT_PER_QUERY_CALLBACK_CHECK) {\n self->operation_count = 0;\n }\n\n if (self->query_options && self->query_options->progress_callback) {\n self->query_state.current_byte_offset = ts_node_start_byte(ts_tree_cursor_current_node(&self->cursor));\n }\n if (\n did_match ||\n self->halted ||\n (\n self->operation_count == 0 &&\n (\n (self->query_options && self->query_options->progress_callback && self->query_options->progress_callback(&self->query_state))\n )\n )\n ) {\n return did_match;\n }\n\n // Exit the current node.\n if (self->ascending) {\n if (self->on_visible_node) {\n LOG(\n \"leave node. depth:%u, type:%s\\n\",\n self->depth,\n ts_node_type(ts_tree_cursor_current_node(&self->cursor))\n );\n\n // After leaving a node, remove any states that cannot make further progress.\n uint32_t deleted_count = 0;\n for (unsigned i = 0, n = self->states.size; i < n; i++) {\n QueryState *state = array_get(&self->states, i);\n QueryStep *step = array_get(&self->query->steps, state->step_index);\n\n // If a state completed its pattern inside of this node, but was deferred from finishing\n // in order to search for longer matches, mark it as finished.\n if (\n step->depth == PATTERN_DONE_MARKER &&\n (state->start_depth > self->depth || self->depth == 0)\n ) {\n LOG(\" finish pattern %u\\n\", state->pattern_index);\n array_push(&self->finished_states, *state);\n did_match = true;\n deleted_count++;\n }\n\n // If a state needed to match something within this node, then remove that state\n // as it has failed to match.\n else if (\n step->depth != PATTERN_DONE_MARKER &&\n (uint32_t)state->start_depth + (uint32_t)step->depth > self->depth\n ) {\n LOG(\n \" failed to match. pattern:%u, step:%u\\n\",\n state->pattern_index,\n state->step_index\n );\n capture_list_pool_release(\n &self->capture_list_pool,\n state->capture_list_id\n );\n deleted_count++;\n }\n\n else if (deleted_count > 0) {\n *array_get(&self->states, i - deleted_count) = *state;\n }\n }\n self->states.size -= deleted_count;\n }\n\n // Leave this node by stepping to its next sibling or to its parent.\n switch (ts_tree_cursor_goto_next_sibling_internal(&self->cursor)) {\n case TreeCursorStepVisible:\n if (!self->on_visible_node) {\n self->depth++;\n self->on_visible_node = true;\n }\n self->ascending = false;\n break;\n case TreeCursorStepHidden:\n if (self->on_visible_node) {\n self->depth--;\n self->on_visible_node = false;\n }\n self->ascending = false;\n break;\n default:\n if (ts_tree_cursor_goto_parent(&self->cursor)) {\n self->depth--;\n } else {\n LOG(\"halt at root\\n\");\n self->halted = true;\n }\n }\n }\n\n // Enter a new node.\n else {\n TSNode node = ts_tree_cursor_current_node(&self->cursor);\n TSNode parent_node = ts_tree_cursor_parent_node(&self->cursor);\n\n bool parent_intersects_range =\n ts_node_is_null(parent_node) ||\n range_intersects(&(TSRange) {\n .start_point = ts_node_start_point(parent_node),\n .end_point = ts_node_end_point(parent_node),\n .start_byte = ts_node_start_byte(parent_node),\n .end_byte = ts_node_end_byte(parent_node),\n }, &self->included_range);\n TSRange node_range = (TSRange) {\n .start_point = ts_node_start_point(node),\n .end_point = ts_node_end_point(node),\n .start_byte = ts_node_start_byte(node),\n .end_byte = ts_node_end_byte(node),\n };\n bool node_intersects_range =\n parent_intersects_range && range_intersects(&node_range, &self->included_range);\n bool node_intersects_containing_range =\n range_intersects(&node_range, &self->containing_range);\n bool node_within_containing_range =\n range_within(&node_range, &self->containing_range);\n\n if (node_within_containing_range && self->on_visible_node) {\n TSSymbol symbol = ts_node_symbol(node);\n bool is_named = ts_node_is_named(node);\n bool is_missing = ts_node_is_missing(node);\n bool has_later_siblings;\n bool has_later_named_siblings;\n bool can_have_later_siblings_with_this_field;\n TSFieldId field_id = 0;\n TSSymbol supertypes[8] = {0};\n unsigned supertype_count = 8;\n ts_tree_cursor_current_status(\n &self->cursor,\n &field_id,\n &has_later_siblings,\n &has_later_named_siblings,\n &can_have_later_siblings_with_this_field,\n supertypes,\n &supertype_count\n );\n LOG(\n \"enter node. depth:%u, type:%s, field:%s, row:%u state_count:%u, finished_state_count:%u\\n\",\n self->depth,\n ts_node_type(node),\n ts_language_field_name_for_id(self->query->language, field_id),\n ts_node_start_point(node).row,\n self->states.size,\n self->finished_states.size\n );\n\n bool node_is_error = symbol == ts_builtin_sym_error;\n bool parent_is_error =\n !ts_node_is_null(parent_node) &&\n ts_node_symbol(parent_node) == ts_builtin_sym_error;\n\n // Add new states for any patterns whose root node is a wildcard.\n if (!node_is_error) {\n for (unsigned i = 0; i < self->query->wildcard_root_pattern_count; i++) {\n PatternEntry *pattern = array_get(&self->query->pattern_map, i);\n\n // If this node matches the first step of the pattern, then add a new\n // state at the start of this pattern.\n QueryStep *step = array_get(&self->query->steps, pattern->step_index);\n uint32_t start_depth = self->depth - step->depth;\n if (\n (pattern->is_rooted ?\n node_intersects_range :\n (parent_intersects_range && !parent_is_error)) &&\n (!step->field || field_id == step->field) &&\n (!step->supertype_symbol || supertype_count > 0) &&\n (start_depth <= self->max_start_depth)\n ) {\n ts_query_cursor__add_state(self, pattern);\n }\n }\n }\n\n // Add new states for any patterns whose root node matches this node.\n unsigned i;\n if (ts_query__pattern_map_search(self->query, symbol, &i)) {\n PatternEntry *pattern = array_get(&self->query->pattern_map, i);\n\n QueryStep *step = array_get(&self->query->steps, pattern->step_index);\n uint32_t start_depth = self->depth - step->depth;\n do {\n // If this node matches the first step of the pattern, then add a new\n // state at the start of this pattern.\n if (\n (pattern->is_rooted ?\n node_intersects_range :\n (parent_intersects_range && !parent_is_error)) &&\n (!step->field || field_id == step->field) &&\n (start_depth <= self->max_start_depth)\n ) {\n ts_query_cursor__add_state(self, pattern);\n }\n\n // Advance to the next pattern whose root node matches this node.\n i++;\n if (i == self->query->pattern_map.size) break;\n pattern = array_get(&self->query->pattern_map, i);\n step = array_get(&self->query->steps, pattern->step_index);\n } while (step->symbol == symbol);\n }\n\n // Update all of the in-progress states with current node.\n for (unsigned j = 0, copy_count = 0; j < self->states.size; j += 1 + copy_count) {\n QueryState *state = array_get(&self->states, j);\n QueryStep *step = array_get(&self->query->steps, state->step_index);\n state->has_in_progress_alternatives = false;\n copy_count = 0;\n\n // Check that the node matches all of the criteria for the next\n // step of the pattern.\n if ((uint32_t)state->start_depth + (uint32_t)step->depth != self->depth) continue;\n\n // Determine if this node matches this step of the pattern, and also\n // if this node can have later siblings that match this step of the\n // pattern.\n bool node_does_match = false;\n if (step->symbol == WILDCARD_SYMBOL) {\n if (step->is_missing) {\n node_does_match = is_missing;\n } else {\n node_does_match = !node_is_error && (is_named || !step->is_named);\n }\n } else {\n node_does_match = symbol == step->symbol && (!step->is_missing || is_missing);\n }\n bool later_sibling_can_match = has_later_siblings;\n if ((step->is_immediate && is_named) || state->seeking_immediate_match) {\n later_sibling_can_match = false;\n }\n if (step->is_last_child && has_later_named_siblings) {\n node_does_match = false;\n }\n if (step->supertype_symbol) {\n bool has_supertype = false;\n for (unsigned k = 0; k < supertype_count; k++) {\n if (supertypes[k] == step->supertype_symbol) {\n has_supertype = true;\n break;\n }\n }\n if (!has_supertype) node_does_match = false;\n }\n if (step->field) {\n if (step->field == field_id) {\n if (!can_have_later_siblings_with_this_field) {\n later_sibling_can_match = false;\n }\n } else {\n node_does_match = false;\n }\n }\n\n if (step->negated_field_list_id) {\n TSFieldId *negated_field_ids = array_get(&self->query->negated_fields, step->negated_field_list_id);\n for (;;) {\n TSFieldId negated_field_id = *negated_field_ids;\n if (negated_field_id) {\n negated_field_ids++;\n if (ts_node_child_by_field_id(node, negated_field_id).id) {\n node_does_match = false;\n break;\n }\n } else {\n break;\n }\n }\n }\n\n // Remove states immediately if it is ever clear that they cannot match.\n if (!node_does_match) {\n if (!later_sibling_can_match) {\n LOG(\n \" discard state. pattern:%u, step:%u\\n\",\n state->pattern_index,\n state->step_index\n );\n capture_list_pool_release(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_erase(&self->states, j);\n j--;\n }\n continue;\n }\n\n // Some patterns can match their root node in multiple ways, capturing different\n // children. If this pattern step could match later children within the same\n // parent, then this query state cannot simply be updated in place. It must be\n // split into two states: one that matches this node, and one which skips over\n // this node, to preserve the possibility of matching later siblings.\n if (later_sibling_can_match && (\n step->contains_captures ||\n ts_query__step_is_fallible(self->query, state->step_index)\n )) {\n if (ts_query_cursor__copy_state(self, &state)) {\n LOG(\n \" split state for capture. pattern:%u, step:%u\\n\",\n state->pattern_index,\n state->step_index\n );\n copy_count++;\n }\n }\n\n // If this pattern started with a wildcard, such that the pattern map\n // actually points to the *second* step of the pattern, then check\n // that the node has a parent, and capture the parent node if necessary.\n if (state->needs_parent) {\n TSNode parent = ts_tree_cursor_parent_node(&self->cursor);\n if (ts_node_is_null(parent)) {\n LOG(\" missing parent node\\n\");\n state->dead = true;\n } else {\n state->needs_parent = false;\n QueryStep *skipped_wildcard_step = step;\n do {\n skipped_wildcard_step--;\n } while (\n skipped_wildcard_step->is_dead_end ||\n skipped_wildcard_step->is_pass_through ||\n skipped_wildcard_step->depth > 0\n );\n if (skipped_wildcard_step->capture_ids[0] != NONE) {\n LOG(\" capture wildcard parent\\n\");\n ts_query_cursor__capture(\n self,\n state,\n skipped_wildcard_step,\n parent\n );\n }\n }\n }\n\n // If the current node is captured in this pattern, add it to the capture list.\n if (step->capture_ids[0] != NONE) {\n ts_query_cursor__capture(self, state, step, node);\n }\n\n if (state->dead) {\n array_erase(&self->states, j);\n j--;\n continue;\n }\n\n // Advance this state to the next step of its pattern.\n state->step_index++;\n LOG(\n \" advance state. pattern:%u, step:%u\\n\",\n state->pattern_index,\n state->step_index\n );\n\n QueryStep *next_step = array_get(&self->query->steps, state->step_index);\n\n // For a given step, if the current symbol is the wildcard symbol, `_`, and it is **not**\n // named, meaning it should capture anonymous nodes, **and** the next step is immediate,\n // we reuse the `seeking_immediate_match` flag to indicate that we are looking for an\n // immediate match due to an unnamed wildcard symbol.\n //\n // The reason for this is that typically, anchors will not consider anonymous nodes,\n // but we're special casing the wildcard symbol to allow for any immediate matches,\n // regardless of whether they are named or not.\n if (step->symbol == WILDCARD_SYMBOL && !step->is_named && next_step->is_immediate) {\n state->seeking_immediate_match = true;\n } else {\n state->seeking_immediate_match = false;\n }\n\n if (stop_on_definite_step && next_step->root_pattern_guaranteed) did_match = true;\n\n // If this state's next step has an alternative step, then copy the state in order\n // to pursue both alternatives. The alternative step itself may have an alternative,\n // so this is an interactive process.\n unsigned end_index = j + 1;\n for (unsigned k = j; k < end_index; k++) {\n QueryState *child_state = array_get(&self->states, k);\n QueryStep *child_step = array_get(&self->query->steps, child_state->step_index);\n if (child_step->alternative_index != NONE) {\n // A \"dead-end\" step exists only to add a non-sequential jump into the step sequence,\n // via its alternative index. When a state reaches a dead-end step, it jumps straight\n // to the step's alternative.\n if (child_step->is_dead_end) {\n child_state->step_index = child_step->alternative_index;\n k--;\n continue;\n }\n\n // A \"pass-through\" step exists only to add a branch into the step sequence,\n // via its alternative_index. When a state reaches a pass-through step, it splits\n // in order to process the alternative step, and then it advances to the next step.\n if (child_step->is_pass_through) {\n child_state->step_index++;\n k--;\n }\n\n QueryState *copy = ts_query_cursor__copy_state(self, &child_state);\n if (copy) {\n LOG(\n \" split state for branch. pattern:%u, from_step:%u, to_step:%u, pass_through:%d, capture_count:%u\\n\",\n copy->pattern_index,\n copy->step_index,\n next_step->alternative_index,\n next_step->is_pass_through,\n capture_list_pool_get(&self->capture_list_pool, copy->capture_list_id)->size\n );\n end_index++;\n copy_count++;\n copy->step_index = child_step->alternative_index;\n if (child_step->is_pass_through) {\n copy->seeking_immediate_match = true;\n }\n }\n }\n }\n }\n\n for (unsigned j = 0; j < self->states.size; j++) {\n QueryState *state = array_get(&self->states, j);\n if (state->dead) {\n array_erase(&self->states, j);\n j--;\n continue;\n }\n\n // Enforce the longest-match criteria. When a query pattern contains optional or\n // repeated nodes, this is necessary to avoid multiple redundant states, where\n // one state has a strict subset of another state's captures.\n bool did_remove = false;\n for (unsigned k = j + 1; k < self->states.size; k++) {\n QueryState *other_state = array_get(&self->states, k);\n\n // Query states are kept in ascending order of start_depth and pattern_index.\n // Since the longest-match criteria is only used for deduping matches of the same\n // pattern and root node, we only need to perform pairwise comparisons within a\n // small slice of the states array.\n if (\n other_state->start_depth != state->start_depth ||\n other_state->pattern_index != state->pattern_index\n ) break;\n\n bool left_contains_right, right_contains_left;\n ts_query_cursor__compare_captures(\n self,\n state,\n other_state,\n &left_contains_right,\n &right_contains_left\n );\n if (left_contains_right) {\n if (state->step_index == other_state->step_index) {\n LOG(\n \" drop shorter state. pattern: %u, step_index: %u\\n\",\n state->pattern_index,\n state->step_index\n );\n capture_list_pool_release(&self->capture_list_pool, other_state->capture_list_id);\n array_erase(&self->states, k);\n k--;\n continue;\n }\n other_state->has_in_progress_alternatives = true;\n }\n if (right_contains_left) {\n if (state->step_index == other_state->step_index) {\n LOG(\n \" drop shorter state. pattern: %u, step_index: %u\\n\",\n state->pattern_index,\n state->step_index\n );\n capture_list_pool_release(&self->capture_list_pool, state->capture_list_id);\n array_erase(&self->states, j);\n j--;\n did_remove = true;\n break;\n }\n state->has_in_progress_alternatives = true;\n }\n }\n\n // If the state is at the end of its pattern, remove it from the list\n // of in-progress states and add it to the list of finished states.\n if (!did_remove) {\n LOG(\n \" keep state. pattern: %u, start_depth: %u, step_index: %u, capture_count: %u\\n\",\n state->pattern_index,\n state->start_depth,\n state->step_index,\n capture_list_pool_get(&self->capture_list_pool, state->capture_list_id)->size\n );\n QueryStep *next_step = array_get(&self->query->steps, state->step_index);\n if (next_step->depth == PATTERN_DONE_MARKER) {\n if (state->has_in_progress_alternatives) {\n LOG(\" defer finishing pattern %u\\n\", state->pattern_index);\n } else {\n LOG(\" finish pattern %u\\n\", state->pattern_index);\n array_push(&self->finished_states, *state);\n array_erase(&self->states, (uint32_t)(state - self->states.contents));\n did_match = true;\n j--;\n }\n }\n }\n }\n }\n\n if (node_intersects_containing_range && ts_query_cursor__should_descend(self, node_intersects_range)) {\n switch (ts_tree_cursor_goto_first_child_internal(&self->cursor)) {\n case TreeCursorStepVisible:\n self->depth++;\n self->on_visible_node = true;\n continue;\n case TreeCursorStepHidden:\n self->on_visible_node = false;\n continue;\n default:\n break;\n }\n }\n\n self->ascending = true;\n }\n }\n}\n\nbool ts_query_cursor_next_match(\n TSQueryCursor *self,\n TSQueryMatch *match\n) {\n if (self->finished_states.size == 0) {\n if (!ts_query_cursor__advance(self, false)) {\n return false;\n }\n }\n\n QueryState *state = array_get(&self->finished_states, 0);\n if (state->id == UINT32_MAX) state->id = self->next_state_id++;\n match->id = state->id;\n match->pattern_index = state->pattern_index;\n const CaptureList *captures = capture_list_pool_get(\n &self->capture_list_pool,\n state->capture_list_id\n );\n match->captures = captures->contents;\n match->capture_count = captures->size;\n capture_list_pool_release(&self->capture_list_pool, state->capture_list_id);\n array_erase(&self->finished_states, 0);\n return true;\n}\n\nvoid ts_query_cursor_remove_match(\n TSQueryCursor *self,\n uint32_t match_id\n) {\n for (unsigned i = 0; i < self->finished_states.size; i++) {\n const QueryState *state = array_get(&self->finished_states, i);\n if (state->id == match_id) {\n capture_list_pool_release(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_erase(&self->finished_states, i);\n return;\n }\n }\n\n // Remove unfinished query states as well to prevent future\n // captures for a match being removed.\n for (unsigned i = 0; i < self->states.size; i++) {\n const QueryState *state = array_get(&self->states, i);\n if (state->id == match_id) {\n capture_list_pool_release(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_erase(&self->states, i);\n return;\n }\n }\n}\n\nbool ts_query_cursor_next_capture(\n TSQueryCursor *self,\n TSQueryMatch *match,\n uint32_t *capture_index\n) {\n // The goal here is to return captures in order, even though they may not\n // be discovered in order, because patterns can overlap. Search for matches\n // until there is a finished capture that is before any unfinished capture.\n for (;;) {\n // First, find the earliest capture in an unfinished match.\n uint32_t first_unfinished_capture_byte;\n uint32_t first_unfinished_pattern_index;\n uint32_t first_unfinished_state_index;\n bool first_unfinished_state_is_definite = false;\n bool found_unfinished_state = ts_query_cursor__first_in_progress_capture(\n self,\n &first_unfinished_state_index,\n &first_unfinished_capture_byte,\n &first_unfinished_pattern_index,\n &first_unfinished_state_is_definite\n );\n\n // Then find the earliest capture in a finished match. It must occur\n // before the first capture in an *unfinished* match.\n QueryState *first_finished_state = NULL;\n uint32_t first_finished_capture_byte = first_unfinished_capture_byte;\n uint32_t first_finished_pattern_index = first_unfinished_pattern_index;\n for (unsigned i = 0; i < self->finished_states.size;) {\n QueryState *state = array_get(&self->finished_states, i);\n const CaptureList *captures = capture_list_pool_get(\n &self->capture_list_pool,\n state->capture_list_id\n );\n\n // Remove states whose captures are all consumed.\n if (state->consumed_capture_count >= captures->size) {\n capture_list_pool_release(\n &self->capture_list_pool,\n state->capture_list_id\n );\n array_erase(&self->finished_states, i);\n continue;\n }\n\n TSNode node = array_get(captures, state->consumed_capture_count)->node;\n\n bool node_precedes_range = (\n ts_node_end_byte(node) <= self->included_range.start_byte ||\n point_lte(ts_node_end_point(node), self->included_range.start_point)\n );\n bool node_follows_range = (\n ts_node_start_byte(node) >= self->included_range.end_byte ||\n point_gte(ts_node_start_point(node), self->included_range.end_point)\n );\n bool node_outside_of_range = node_precedes_range || node_follows_range;\n\n // Skip captures that are outside of the cursor's range.\n if (node_outside_of_range) {\n state->consumed_capture_count++;\n continue;\n }\n\n uint32_t node_start_byte = ts_node_start_byte(node);\n if (\n node_start_byte < first_finished_capture_byte ||\n (\n node_start_byte == first_finished_capture_byte &&\n state->pattern_index < first_finished_pattern_index\n )\n ) {\n first_finished_state = state;\n first_finished_capture_byte = node_start_byte;\n first_finished_pattern_index = state->pattern_index;\n }\n i++;\n }\n\n // If there is finished capture that is clearly before any unfinished\n // capture, then return its match, and its capture index. Internally\n // record the fact that the capture has been 'consumed'.\n QueryState *state;\n if (first_finished_state) {\n state = first_finished_state;\n } else if (first_unfinished_state_is_definite) {\n state = array_get(&self->states, first_unfinished_state_index);\n } else {\n state = NULL;\n }\n\n if (state) {\n if (state->id == UINT32_MAX) state->id = self->next_state_id++;\n match->id = state->id;\n match->pattern_index = state->pattern_index;\n const CaptureList *captures = capture_list_pool_get(\n &self->capture_list_pool,\n state->capture_list_id\n );\n match->captures = captures->contents;\n match->capture_count = captures->size;\n *capture_index = state->consumed_capture_count;\n state->consumed_capture_count++;\n return true;\n }\n\n if (capture_list_pool_is_empty(&self->capture_list_pool) && found_unfinished_state) {\n LOG(\n \" abandon state. index:%u, pattern:%u, offset:%u.\\n\",\n first_unfinished_state_index,\n first_unfinished_pattern_index,\n first_unfinished_capture_byte\n );\n capture_list_pool_release(\n &self->capture_list_pool,\n array_get(&self->states, first_unfinished_state_index)->capture_list_id\n );\n array_erase(&self->states, first_unfinished_state_index);\n }\n\n // If there are no finished matches that are ready to be returned, then\n // continue finding more matches.\n if (\n !ts_query_cursor__advance(self, true) &&\n self->finished_states.size == 0\n ) return false;\n }\n}\n\nvoid ts_query_cursor_set_max_start_depth(\n TSQueryCursor *self,\n uint32_t max_start_depth\n) {\n self->max_start_depth = max_start_depth;\n}\n\n#undef LOG\n",
48
- "#ifndef TREE_SITTER_UNICODE_H_\n#define TREE_SITTER_UNICODE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <limits.h>\n#include <stdint.h>\n\n#define U_EXPORT\n#define U_EXPORT2\n#include \"unicode/utf8.h\"\n#include \"unicode/utf16.h\"\n#include \"portable/endian.h\"\n\n#define U16_NEXT_LE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \\\n (c)=le16toh((s)[(i)++]); \\\n if(U16_IS_LEAD(c)) { \\\n uint16_t __c2; \\\n if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \\\n ++(i); \\\n (c)=U16_GET_SUPPLEMENTARY((c), __c2); \\\n } \\\n } \\\n} UPRV_BLOCK_MACRO_END\n\n#define U16_NEXT_BE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \\\n (c)=be16toh((s)[(i)++]); \\\n if(U16_IS_LEAD(c)) { \\\n uint16_t __c2; \\\n if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \\\n ++(i); \\\n (c)=U16_GET_SUPPLEMENTARY((c), __c2); \\\n } \\\n } \\\n} UPRV_BLOCK_MACRO_END\n\nstatic const int32_t TS_DECODE_ERROR = U_SENTINEL;\n\nstatic inline uint32_t ts_decode_utf8(\n const uint8_t *string,\n uint32_t length,\n int32_t *code_point\n) {\n uint32_t i = 0;\n U8_NEXT(string, i, length, *code_point);\n return i;\n}\n\nstatic inline uint32_t ts_decode_utf16_le(\n const uint8_t *string,\n uint32_t length,\n int32_t *code_point\n) {\n uint32_t i = 0;\n U16_NEXT_LE(((uint16_t *)string), i, length, *code_point);\n return i * 2;\n}\n\nstatic inline uint32_t ts_decode_utf16_be(\n const uint8_t *string,\n uint32_t length,\n int32_t *code_point\n) {\n uint32_t i = 0;\n U16_NEXT_BE(((uint16_t *)string), i, length, *code_point);\n return i * 2;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_UNICODE_H_\n",
49
- "#include \"tree_sitter/api.h\"\n#include \"./tree_cursor.h\"\n#include \"./language.h\"\n#include \"./tree.h\"\n\ntypedef struct {\n Subtree parent;\n const TSTree *tree;\n Length position;\n uint32_t child_index;\n uint32_t structural_child_index;\n uint32_t descendant_index;\n const TSSymbol *alias_sequence;\n} CursorChildIterator;\n\n// CursorChildIterator\n\nstatic inline bool ts_tree_cursor_is_entry_visible(const TreeCursor *self, uint32_t index) {\n TreeCursorEntry *entry = array_get(&self->stack, index);\n if (index == 0 || ts_subtree_visible(*entry->subtree)) {\n return true;\n } else if (!ts_subtree_extra(*entry->subtree)) {\n TreeCursorEntry *parent_entry = array_get(&self->stack, index - 1);\n return ts_language_alias_at(\n self->tree->language,\n parent_entry->subtree->ptr->production_id,\n entry->structural_child_index\n );\n } else {\n return false;\n }\n}\n\nstatic inline CursorChildIterator ts_tree_cursor_iterate_children(const TreeCursor *self) {\n TreeCursorEntry *last_entry = array_back(&self->stack);\n if (ts_subtree_child_count(*last_entry->subtree) == 0) {\n return (CursorChildIterator) {NULL_SUBTREE, self->tree, length_zero(), 0, 0, 0, NULL};\n }\n const TSSymbol *alias_sequence = ts_language_alias_sequence(\n self->tree->language,\n last_entry->subtree->ptr->production_id\n );\n\n uint32_t descendant_index = last_entry->descendant_index;\n if (ts_tree_cursor_is_entry_visible(self, self->stack.size - 1)) {\n descendant_index += 1;\n }\n\n return (CursorChildIterator) {\n .tree = self->tree,\n .parent = *last_entry->subtree,\n .position = last_entry->position,\n .child_index = 0,\n .structural_child_index = 0,\n .descendant_index = descendant_index,\n .alias_sequence = alias_sequence,\n };\n}\n\nstatic inline bool ts_tree_cursor_child_iterator_next(\n CursorChildIterator *self,\n TreeCursorEntry *result,\n bool *visible\n) {\n if (!self->parent.ptr || self->child_index == self->parent.ptr->child_count) return false;\n const Subtree *child = &ts_subtree_children(self->parent)[self->child_index];\n *result = (TreeCursorEntry) {\n .subtree = child,\n .position = self->position,\n .child_index = self->child_index,\n .structural_child_index = self->structural_child_index,\n .descendant_index = self->descendant_index,\n };\n *visible = ts_subtree_visible(*child);\n bool extra = ts_subtree_extra(*child);\n if (!extra) {\n if (self->alias_sequence) {\n *visible |= self->alias_sequence[self->structural_child_index];\n }\n self->structural_child_index++;\n }\n\n self->descendant_index += ts_subtree_visible_descendant_count(*child);\n if (*visible) {\n self->descendant_index += 1;\n }\n\n self->position = length_add(self->position, ts_subtree_size(*child));\n self->child_index++;\n\n if (self->child_index < self->parent.ptr->child_count) {\n Subtree next_child = ts_subtree_children(self->parent)[self->child_index];\n self->position = length_add(self->position, ts_subtree_padding(next_child));\n }\n\n return true;\n}\n\n// Return a position that, when `b` is added to it, yields `a`. This\n// can only be computed if `b` has zero rows. Otherwise, this function\n// returns `LENGTH_UNDEFINED`, and the caller needs to recompute\n// the position some other way.\nstatic inline Length length_backtrack(Length a, Length b) {\n if (length_is_undefined(a) || b.extent.row != 0) {\n return LENGTH_UNDEFINED;\n }\n\n Length result;\n result.bytes = a.bytes - b.bytes;\n result.extent.row = a.extent.row;\n result.extent.column = a.extent.column - b.extent.column;\n return result;\n}\n\nstatic inline bool ts_tree_cursor_child_iterator_previous(\n CursorChildIterator *self,\n TreeCursorEntry *result,\n bool *visible\n) {\n // this is mostly a reverse `ts_tree_cursor_child_iterator_next` taking into\n // account unsigned underflow\n if (!self->parent.ptr || (int8_t)self->child_index == -1) return false;\n const Subtree *child = &ts_subtree_children(self->parent)[self->child_index];\n *result = (TreeCursorEntry) {\n .subtree = child,\n .position = self->position,\n .child_index = self->child_index,\n .structural_child_index = self->structural_child_index,\n };\n *visible = ts_subtree_visible(*child);\n bool extra = ts_subtree_extra(*child);\n\n self->position = length_backtrack(self->position, ts_subtree_padding(*child));\n self->child_index--;\n\n if (!extra && self->alias_sequence) {\n *visible |= self->alias_sequence[self->structural_child_index];\n if (self->structural_child_index > 0) {\n self->structural_child_index--;\n }\n }\n\n // unsigned can underflow so compare it to child_count\n if (self->child_index < self->parent.ptr->child_count) {\n Subtree previous_child = ts_subtree_children(self->parent)[self->child_index];\n Length size = ts_subtree_size(previous_child);\n self->position = length_backtrack(self->position, size);\n }\n\n return true;\n}\n\n// TSTreeCursor - lifecycle\n\nTSTreeCursor ts_tree_cursor_new(TSNode node) {\n TSTreeCursor self = {NULL, NULL, {0, 0, 0}};\n ts_tree_cursor_init((TreeCursor *)&self, node);\n return self;\n}\n\nvoid ts_tree_cursor_reset(TSTreeCursor *_self, TSNode node) {\n ts_tree_cursor_init((TreeCursor *)_self, node);\n}\n\nvoid ts_tree_cursor_init(TreeCursor *self, TSNode node) {\n self->tree = node.tree;\n self->root_alias_symbol = node.context[3];\n array_clear(&self->stack);\n array_push(&self->stack, ((TreeCursorEntry) {\n .subtree = (const Subtree *)node.id,\n .position = {\n ts_node_start_byte(node),\n ts_node_start_point(node)\n },\n .child_index = 0,\n .structural_child_index = 0,\n .descendant_index = 0,\n }));\n}\n\nvoid ts_tree_cursor_delete(TSTreeCursor *_self) {\n TreeCursor *self = (TreeCursor *)_self;\n array_delete(&self->stack);\n}\n\n// TSTreeCursor - walking the tree\n\nTreeCursorStep ts_tree_cursor_goto_first_child_internal(TSTreeCursor *_self) {\n TreeCursor *self = (TreeCursor *)_self;\n bool visible;\n TreeCursorEntry entry;\n CursorChildIterator iterator = ts_tree_cursor_iterate_children(self);\n while (ts_tree_cursor_child_iterator_next(&iterator, &entry, &visible)) {\n if (visible) {\n array_push(&self->stack, entry);\n return TreeCursorStepVisible;\n }\n if (ts_subtree_visible_child_count(*entry.subtree) > 0) {\n array_push(&self->stack, entry);\n return TreeCursorStepHidden;\n }\n }\n return TreeCursorStepNone;\n}\n\nbool ts_tree_cursor_goto_first_child(TSTreeCursor *self) {\n for (;;) {\n switch (ts_tree_cursor_goto_first_child_internal(self)) {\n case TreeCursorStepHidden:\n continue;\n case TreeCursorStepVisible:\n return true;\n default:\n return false;\n }\n }\n}\n\nTreeCursorStep ts_tree_cursor_goto_last_child_internal(TSTreeCursor *_self) {\n TreeCursor *self = (TreeCursor *)_self;\n bool visible;\n TreeCursorEntry entry;\n CursorChildIterator iterator = ts_tree_cursor_iterate_children(self);\n if (!iterator.parent.ptr || iterator.parent.ptr->child_count == 0) return TreeCursorStepNone;\n\n TreeCursorEntry last_entry = {0};\n TreeCursorStep last_step = TreeCursorStepNone;\n while (ts_tree_cursor_child_iterator_next(&iterator, &entry, &visible)) {\n if (visible) {\n last_entry = entry;\n last_step = TreeCursorStepVisible;\n }\n else if (ts_subtree_visible_child_count(*entry.subtree) > 0) {\n last_entry = entry;\n last_step = TreeCursorStepHidden;\n }\n }\n if (last_entry.subtree) {\n array_push(&self->stack, last_entry);\n return last_step;\n }\n\n return TreeCursorStepNone;\n}\n\nbool ts_tree_cursor_goto_last_child(TSTreeCursor *self) {\n for (;;) {\n switch (ts_tree_cursor_goto_last_child_internal(self)) {\n case TreeCursorStepHidden:\n continue;\n case TreeCursorStepVisible:\n return true;\n default:\n return false;\n }\n }\n}\n\nstatic inline int64_t ts_tree_cursor_goto_first_child_for_byte_and_point(\n TSTreeCursor *_self,\n uint32_t goal_byte,\n TSPoint goal_point\n) {\n TreeCursor *self = (TreeCursor *)_self;\n uint32_t initial_size = self->stack.size;\n uint32_t visible_child_index = 0;\n\n bool did_descend;\n do {\n did_descend = false;\n\n bool visible;\n TreeCursorEntry entry;\n CursorChildIterator iterator = ts_tree_cursor_iterate_children(self);\n while (ts_tree_cursor_child_iterator_next(&iterator, &entry, &visible)) {\n Length entry_end = length_add(entry.position, ts_subtree_size(*entry.subtree));\n bool at_goal = entry_end.bytes > goal_byte && point_gt(entry_end.extent, goal_point);\n uint32_t visible_child_count = ts_subtree_visible_child_count(*entry.subtree);\n if (at_goal) {\n if (visible) {\n array_push(&self->stack, entry);\n return visible_child_index;\n }\n if (visible_child_count > 0) {\n array_push(&self->stack, entry);\n did_descend = true;\n break;\n }\n } else if (visible) {\n visible_child_index++;\n } else {\n visible_child_index += visible_child_count;\n }\n }\n } while (did_descend);\n\n self->stack.size = initial_size;\n return -1;\n}\n\nint64_t ts_tree_cursor_goto_first_child_for_byte(TSTreeCursor *self, uint32_t goal_byte) {\n return ts_tree_cursor_goto_first_child_for_byte_and_point(self, goal_byte, POINT_ZERO);\n}\n\nint64_t ts_tree_cursor_goto_first_child_for_point(TSTreeCursor *self, TSPoint goal_point) {\n return ts_tree_cursor_goto_first_child_for_byte_and_point(self, 0, goal_point);\n}\n\nTreeCursorStep ts_tree_cursor_goto_sibling_internal(\n TSTreeCursor *_self,\n bool (*advance)(CursorChildIterator *, TreeCursorEntry *, bool *)\n) {\n TreeCursor *self = (TreeCursor *)_self;\n uint32_t initial_size = self->stack.size;\n\n while (self->stack.size > 1) {\n TreeCursorEntry entry = array_pop(&self->stack);\n CursorChildIterator iterator = ts_tree_cursor_iterate_children(self);\n iterator.child_index = entry.child_index;\n iterator.structural_child_index = entry.structural_child_index;\n iterator.position = entry.position;\n iterator.descendant_index = entry.descendant_index;\n\n bool visible = false;\n advance(&iterator, &entry, &visible);\n if (visible && self->stack.size + 1 < initial_size) break;\n\n while (advance(&iterator, &entry, &visible)) {\n if (visible) {\n array_push(&self->stack, entry);\n return TreeCursorStepVisible;\n }\n\n if (ts_subtree_visible_child_count(*entry.subtree)) {\n array_push(&self->stack, entry);\n return TreeCursorStepHidden;\n }\n }\n }\n\n self->stack.size = initial_size;\n return TreeCursorStepNone;\n}\n\nTreeCursorStep ts_tree_cursor_goto_next_sibling_internal(TSTreeCursor *_self) {\n return ts_tree_cursor_goto_sibling_internal(_self, ts_tree_cursor_child_iterator_next);\n}\n\nbool ts_tree_cursor_goto_next_sibling(TSTreeCursor *self) {\n switch (ts_tree_cursor_goto_next_sibling_internal(self)) {\n case TreeCursorStepHidden:\n ts_tree_cursor_goto_first_child(self);\n return true;\n case TreeCursorStepVisible:\n return true;\n default:\n return false;\n }\n}\n\nTreeCursorStep ts_tree_cursor_goto_previous_sibling_internal(TSTreeCursor *_self) {\n // since subtracting across row loses column information, we may have to\n // restore it\n TreeCursor *self = (TreeCursor *)_self;\n\n // for that, save current position before traversing\n TreeCursorStep step = ts_tree_cursor_goto_sibling_internal(\n _self, ts_tree_cursor_child_iterator_previous);\n if (step == TreeCursorStepNone)\n return step;\n\n // if length is already valid, there's no need to recompute it\n if (!length_is_undefined(array_back(&self->stack)->position))\n return step;\n\n // restore position from the parent node\n const TreeCursorEntry *parent = array_get(&self->stack, self->stack.size - 2);\n Length position = parent->position;\n uint32_t child_index = array_back(&self->stack)->child_index;\n const Subtree *children = ts_subtree_children((*(parent->subtree)));\n\n if (child_index > 0) {\n // skip first child padding since its position should match the position of the parent\n position = length_add(position, ts_subtree_size(children[0]));\n for (uint32_t i = 1; i < child_index; ++i) {\n position = length_add(position, ts_subtree_total_size(children[i]));\n }\n position = length_add(position, ts_subtree_padding(children[child_index]));\n }\n\n array_back(&self->stack)->position = position;\n\n return step;\n}\n\nbool ts_tree_cursor_goto_previous_sibling(TSTreeCursor *self) {\n switch (ts_tree_cursor_goto_previous_sibling_internal(self)) {\n case TreeCursorStepHidden:\n ts_tree_cursor_goto_last_child(self);\n return true;\n case TreeCursorStepVisible:\n return true;\n default:\n return false;\n }\n}\n\nbool ts_tree_cursor_goto_parent(TSTreeCursor *_self) {\n TreeCursor *self = (TreeCursor *)_self;\n for (unsigned i = self->stack.size - 2; i + 1 > 0; i--) {\n if (ts_tree_cursor_is_entry_visible(self, i)) {\n self->stack.size = i + 1;\n return true;\n }\n }\n return false;\n}\n\nvoid ts_tree_cursor_goto_descendant(\n TSTreeCursor *_self,\n uint32_t goal_descendant_index\n) {\n TreeCursor *self = (TreeCursor *)_self;\n\n // Ascend to the lowest ancestor that contains the goal node.\n for (;;) {\n uint32_t i = self->stack.size - 1;\n TreeCursorEntry *entry = array_get(&self->stack, i);\n uint32_t next_descendant_index =\n entry->descendant_index +\n (ts_tree_cursor_is_entry_visible(self, i) ? 1 : 0) +\n ts_subtree_visible_descendant_count(*entry->subtree);\n if (\n (entry->descendant_index <= goal_descendant_index) &&\n (next_descendant_index > goal_descendant_index)\n ) {\n break;\n } else if (self->stack.size <= 1) {\n return;\n } else {\n self->stack.size--;\n }\n }\n\n // Descend to the goal node.\n bool did_descend = true;\n do {\n did_descend = false;\n bool visible;\n TreeCursorEntry entry;\n CursorChildIterator iterator = ts_tree_cursor_iterate_children(self);\n if (iterator.descendant_index > goal_descendant_index) {\n return;\n }\n\n while (ts_tree_cursor_child_iterator_next(&iterator, &entry, &visible)) {\n if (iterator.descendant_index > goal_descendant_index) {\n array_push(&self->stack, entry);\n if (visible && entry.descendant_index == goal_descendant_index) {\n return;\n } else {\n did_descend = true;\n break;\n }\n }\n }\n } while (did_descend);\n}\n\nuint32_t ts_tree_cursor_current_descendant_index(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n TreeCursorEntry *last_entry = array_back(&self->stack);\n return last_entry->descendant_index;\n}\n\nTSNode ts_tree_cursor_current_node(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n TreeCursorEntry *last_entry = array_back(&self->stack);\n bool is_extra = ts_subtree_extra(*last_entry->subtree);\n TSSymbol alias_symbol = is_extra ? 0 : self->root_alias_symbol;\n if (self->stack.size > 1 && !is_extra) {\n TreeCursorEntry *parent_entry = array_get(&self->stack, self->stack.size - 2);\n alias_symbol = ts_language_alias_at(\n self->tree->language,\n parent_entry->subtree->ptr->production_id,\n last_entry->structural_child_index\n );\n }\n return ts_node_new(\n self->tree,\n last_entry->subtree,\n last_entry->position,\n alias_symbol\n );\n}\n\n// Private - Get various facts about the current node that are needed\n// when executing tree queries.\nvoid ts_tree_cursor_current_status(\n const TSTreeCursor *_self,\n TSFieldId *field_id,\n bool *has_later_siblings,\n bool *has_later_named_siblings,\n bool *can_have_later_siblings_with_this_field,\n TSSymbol *supertypes,\n unsigned *supertype_count\n) {\n const TreeCursor *self = (const TreeCursor *)_self;\n unsigned max_supertypes = *supertype_count;\n *field_id = 0;\n *supertype_count = 0;\n *has_later_siblings = false;\n *has_later_named_siblings = false;\n *can_have_later_siblings_with_this_field = false;\n\n // Walk up the tree, visiting the current node and its invisible ancestors,\n // because fields can refer to nodes through invisible *wrapper* nodes,\n for (unsigned i = self->stack.size - 1; i > 0; i--) {\n TreeCursorEntry *entry = array_get(&self->stack, i);\n TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1);\n\n const TSSymbol *alias_sequence = ts_language_alias_sequence(\n self->tree->language,\n parent_entry->subtree->ptr->production_id\n );\n\n #define subtree_symbol(subtree, structural_child_index) \\\n (( \\\n !ts_subtree_extra(subtree) && \\\n alias_sequence && \\\n alias_sequence[structural_child_index] \\\n ) ? \\\n alias_sequence[structural_child_index] : \\\n ts_subtree_symbol(subtree))\n\n // Stop walking up when a visible ancestor is found.\n TSSymbol entry_symbol = subtree_symbol(\n *entry->subtree,\n entry->structural_child_index\n );\n TSSymbolMetadata entry_metadata = ts_language_symbol_metadata(\n self->tree->language,\n entry_symbol\n );\n if (i != self->stack.size - 1 && entry_metadata.visible) break;\n\n // Record any supertypes\n if (entry_metadata.supertype && *supertype_count < max_supertypes) {\n supertypes[*supertype_count] = entry_symbol;\n (*supertype_count)++;\n }\n\n // Determine if the current node has later siblings.\n if (!*has_later_siblings) {\n unsigned sibling_count = parent_entry->subtree->ptr->child_count;\n unsigned structural_child_index = entry->structural_child_index;\n if (!ts_subtree_extra(*entry->subtree)) structural_child_index++;\n for (unsigned j = entry->child_index + 1; j < sibling_count; j++) {\n Subtree sibling = ts_subtree_children(*parent_entry->subtree)[j];\n TSSymbolMetadata sibling_metadata = ts_language_symbol_metadata(\n self->tree->language,\n subtree_symbol(sibling, structural_child_index)\n );\n if (sibling_metadata.visible) {\n *has_later_siblings = true;\n if (*has_later_named_siblings) break;\n if (sibling_metadata.named) {\n *has_later_named_siblings = true;\n break;\n }\n } else if (ts_subtree_visible_child_count(sibling) > 0) {\n *has_later_siblings = true;\n if (*has_later_named_siblings) break;\n if (sibling.ptr->named_child_count > 0) {\n *has_later_named_siblings = true;\n break;\n }\n }\n if (!ts_subtree_extra(sibling)) structural_child_index++;\n }\n }\n\n #undef subtree_symbol\n\n if (!ts_subtree_extra(*entry->subtree)) {\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(\n self->tree->language,\n parent_entry->subtree->ptr->production_id,\n &field_map, &field_map_end\n );\n\n // Look for a field name associated with the current node.\n if (!*field_id) {\n for (const TSFieldMapEntry *map = field_map; map < field_map_end; map++) {\n if (!map->inherited && map->child_index == entry->structural_child_index) {\n *field_id = map->field_id;\n break;\n }\n }\n }\n\n // Determine if the current node can have later siblings with the same field name.\n if (*field_id) {\n for (const TSFieldMapEntry *map = field_map; map < field_map_end; map++) {\n if (\n map->field_id == *field_id &&\n map->child_index > entry->structural_child_index\n ) {\n *can_have_later_siblings_with_this_field = true;\n break;\n }\n }\n }\n }\n }\n}\n\nuint32_t ts_tree_cursor_current_depth(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n uint32_t depth = 0;\n for (unsigned i = 1; i < self->stack.size; i++) {\n if (ts_tree_cursor_is_entry_visible(self, i)) {\n depth++;\n }\n }\n return depth;\n}\n\nTSNode ts_tree_cursor_parent_node(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n for (int i = (int)self->stack.size - 2; i >= 0; i--) {\n TreeCursorEntry *entry = array_get(&self->stack, i);\n bool is_visible = true;\n TSSymbol alias_symbol = 0;\n if (i > 0) {\n TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1);\n alias_symbol = ts_language_alias_at(\n self->tree->language,\n parent_entry->subtree->ptr->production_id,\n entry->structural_child_index\n );\n is_visible = (alias_symbol != 0) || ts_subtree_visible(*entry->subtree);\n }\n if (is_visible) {\n return ts_node_new(\n self->tree,\n entry->subtree,\n entry->position,\n alias_symbol\n );\n }\n }\n return ts_node_new(NULL, NULL, length_zero(), 0);\n}\n\nTSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n\n // Walk up the tree, visiting the current node and its invisible ancestors.\n for (unsigned i = self->stack.size - 1; i > 0; i--) {\n TreeCursorEntry *entry = array_get(&self->stack, i);\n TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1);\n\n // Stop walking up when another visible node is found.\n if (\n i != self->stack.size - 1 &&\n ts_tree_cursor_is_entry_visible(self, i)\n ) break;\n\n if (ts_subtree_extra(*entry->subtree)) break;\n\n const TSFieldMapEntry *field_map, *field_map_end;\n ts_language_field_map(\n self->tree->language,\n parent_entry->subtree->ptr->production_id,\n &field_map, &field_map_end\n );\n for (const TSFieldMapEntry *map = field_map; map < field_map_end; map++) {\n if (!map->inherited && map->child_index == entry->structural_child_index) {\n return map->field_id;\n }\n }\n }\n return 0;\n}\n\nconst char *ts_tree_cursor_current_field_name(const TSTreeCursor *_self) {\n TSFieldId id = ts_tree_cursor_current_field_id(_self);\n if (id) {\n const TreeCursor *self = (const TreeCursor *)_self;\n return self->tree->language->field_names[id];\n } else {\n return NULL;\n }\n}\n\nTSTreeCursor ts_tree_cursor_copy(const TSTreeCursor *_cursor) {\n const TreeCursor *cursor = (const TreeCursor *)_cursor;\n TSTreeCursor res = {NULL, NULL, {0, 0}};\n TreeCursor *copy = (TreeCursor *)&res;\n copy->tree = cursor->tree;\n copy->root_alias_symbol = cursor->root_alias_symbol;\n array_init(&copy->stack);\n array_push_all(&copy->stack, &cursor->stack);\n return res;\n}\n\nvoid ts_tree_cursor_reset_to(TSTreeCursor *_dst, const TSTreeCursor *_src) {\n const TreeCursor *cursor = (const TreeCursor *)_src;\n TreeCursor *copy = (TreeCursor *)_dst;\n copy->tree = cursor->tree;\n copy->root_alias_symbol = cursor->root_alias_symbol;\n array_clear(&copy->stack);\n array_push_all(&copy->stack, &cursor->stack);\n}\n",
50
- "#ifndef TREE_SITTER_TREE_CURSOR_H_\n#define TREE_SITTER_TREE_CURSOR_H_\n\n#include \"./subtree.h\"\n\ntypedef struct {\n const Subtree *subtree;\n Length position;\n uint32_t child_index;\n uint32_t structural_child_index;\n uint32_t descendant_index;\n} TreeCursorEntry;\n\ntypedef struct {\n const TSTree *tree;\n Array(TreeCursorEntry) stack;\n TSSymbol root_alias_symbol;\n} TreeCursor;\n\ntypedef enum {\n TreeCursorStepNone,\n TreeCursorStepHidden,\n TreeCursorStepVisible,\n} TreeCursorStep;\n\nvoid ts_tree_cursor_init(TreeCursor *self, TSNode node);\nvoid ts_tree_cursor_current_status(\n const TSTreeCursor *_self,\n TSFieldId *field_id,\n bool *has_later_siblings,\n bool *has_later_named_siblings,\n bool *can_have_later_siblings_with_this_field,\n TSSymbol *supertypes,\n unsigned *supertype_count\n);\n\nTreeCursorStep ts_tree_cursor_goto_first_child_internal(TSTreeCursor *_self);\nTreeCursorStep ts_tree_cursor_goto_next_sibling_internal(TSTreeCursor *_self);\n\nstatic inline Subtree ts_tree_cursor_current_subtree(const TSTreeCursor *_self) {\n const TreeCursor *self = (const TreeCursor *)_self;\n TreeCursorEntry *last_entry = array_back(&self->stack);\n return *last_entry->subtree;\n}\n\nTSNode ts_tree_cursor_parent_node(const TSTreeCursor *_self);\n\n#endif // TREE_SITTER_TREE_CURSOR_H_\n",
51
- "#include \"array.h\"\n#include \"point.h\"\n\n#include <emscripten.h>\n#include <tree_sitter/api.h>\n\n/*****************************/\n/* Section - Data marshaling */\n/*****************************/\n\nstatic const uint32_t INPUT_BUFFER_SIZE = 10 * 1024;\n\nconst void *TRANSFER_BUFFER[12] = {\n NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL,\n};\n\nstatic const int SIZE_OF_CURSOR = 4;\nstatic const int SIZE_OF_NODE = 5;\nstatic const int SIZE_OF_POINT = 2;\nstatic const int SIZE_OF_RANGE = 2 + (2 * SIZE_OF_POINT);\nstatic const int SIZE_OF_CAPTURE = 1 + SIZE_OF_NODE;\n\nvoid *ts_init() {\n TRANSFER_BUFFER[0] = (const void *)TREE_SITTER_LANGUAGE_VERSION;\n TRANSFER_BUFFER[1] = (const void *)TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION;\n return (void*)TRANSFER_BUFFER;\n}\n\nstatic uint32_t code_unit_to_byte(uint32_t unit) {\n return unit << 1;\n}\n\nstatic uint32_t byte_to_code_unit(uint32_t byte) {\n return byte >> 1;\n}\n\nstatic inline void marshal_node(const void **buffer, TSNode node) {\n buffer[0] = node.id;\n buffer[1] = (const void *)byte_to_code_unit(node.context[0]);\n buffer[2] = (const void *)node.context[1];\n buffer[3] = (const void *)byte_to_code_unit(node.context[2]);\n buffer[4] = (const void *)node.context[3];\n}\n\nstatic inline TSNode unmarshal_node_at(const TSTree *tree, uint32_t index) {\n TSNode node;\n const void **buffer = TRANSFER_BUFFER + index * SIZE_OF_NODE;\n node.id = buffer[0];\n node.context[0] = code_unit_to_byte((uint32_t)buffer[1]);\n node.context[1] = (uint32_t)buffer[2];\n node.context[2] = code_unit_to_byte((uint32_t)buffer[3]);\n node.context[3] = (uint32_t)buffer[4];\n node.tree = tree;\n return node;\n}\n\nstatic inline TSNode unmarshal_node(const TSTree *tree) {\n return unmarshal_node_at(tree, 0);\n}\n\nstatic inline void marshal_cursor(const TSTreeCursor *cursor) {\n TRANSFER_BUFFER[0] = cursor->id;\n TRANSFER_BUFFER[1] = (const void *)cursor->context[0];\n TRANSFER_BUFFER[2] = (const void *)cursor->context[1];\n TRANSFER_BUFFER[3] = (const void *)cursor->context[2];\n}\n\nstatic inline TSTreeCursor unmarshal_cursor(const void **buffer, const TSTree *tree) {\n TSTreeCursor cursor;\n cursor.id = buffer[0];\n cursor.context[0] = (uint32_t)buffer[1];\n cursor.context[1] = (uint32_t)buffer[2];\n cursor.context[2] = (uint32_t)buffer[3];\n cursor.tree = tree;\n return cursor;\n}\n\nstatic void marshal_point(TSPoint point) {\n TRANSFER_BUFFER[0] = (const void *)point.row;\n TRANSFER_BUFFER[1] = (const void *)byte_to_code_unit(point.column);\n}\n\nstatic TSPoint unmarshal_point(const void **address) {\n TSPoint point;\n point.row = (uint32_t)address[0];\n point.column = code_unit_to_byte((uint32_t)address[1]);\n return point;\n}\n\nstatic void marshal_range(TSRange *range) {\n range->start_byte = byte_to_code_unit(range->start_byte);\n range->end_byte = byte_to_code_unit(range->end_byte);\n range->start_point.column = byte_to_code_unit(range->start_point.column);\n range->end_point.column = byte_to_code_unit(range->end_point.column);\n}\n\nstatic void unmarshal_range(TSRange *range) {\n range->start_byte = code_unit_to_byte(range->start_byte);\n range->end_byte = code_unit_to_byte(range->end_byte);\n range->start_point.column = code_unit_to_byte(range->start_point.column);\n range->end_point.column = code_unit_to_byte(range->end_point.column);\n}\n\nstatic TSInputEdit unmarshal_edit() {\n TSInputEdit edit;\n const void **address = TRANSFER_BUFFER;\n edit.start_point = unmarshal_point(address); address += SIZE_OF_POINT;\n edit.old_end_point = unmarshal_point(address); address += SIZE_OF_POINT;\n edit.new_end_point = unmarshal_point(address); address += SIZE_OF_POINT;\n edit.start_byte = code_unit_to_byte((uint32_t)*address); address += 1;\n edit.old_end_byte = code_unit_to_byte((uint32_t)*address); address += 1;\n edit.new_end_byte = code_unit_to_byte((uint32_t)*address); address += 1;\n return edit;\n}\n\nstatic void marshal_language_metadata(const TSLanguageMetadata *metadata) {\n if (metadata == NULL) {\n TRANSFER_BUFFER[0] = 0;\n return;\n }\n TRANSFER_BUFFER[0] = (const void*)3;\n TRANSFER_BUFFER[1] = (const void*)(uint32_t)metadata->major_version;\n TRANSFER_BUFFER[2] = (const void*)(uint32_t)metadata->minor_version;\n TRANSFER_BUFFER[3] = (const void*)(uint32_t)metadata->patch_version;\n}\n\n/********************/\n/* Section - Parser */\n/********************/\n\nextern void tree_sitter_parse_callback(\n char *input_buffer,\n uint32_t index,\n uint32_t row,\n uint32_t column,\n uint32_t *length_read\n);\n\nextern void tree_sitter_log_callback(\n bool is_lex_message,\n const char *message\n);\n\nextern bool tree_sitter_progress_callback(\n uint32_t current_offset,\n bool has_error\n);\n\nextern bool tree_sitter_query_progress_callback(\n uint32_t current_offset\n);\n\nstatic const char *call_parse_callback(\n void *payload,\n uint32_t byte,\n TSPoint position,\n uint32_t *bytes_read\n) {\n char *buffer = (char *)payload;\n tree_sitter_parse_callback(\n buffer,\n byte_to_code_unit(byte),\n position.row,\n byte_to_code_unit(position.column),\n bytes_read\n );\n *bytes_read = code_unit_to_byte(*bytes_read);\n if (*bytes_read >= INPUT_BUFFER_SIZE) {\n *bytes_read = INPUT_BUFFER_SIZE - 2;\n }\n return buffer;\n}\n\nstatic void call_log_callback(\n void *payload,\n TSLogType log_type,\n const char *message\n) {\n tree_sitter_log_callback(log_type == TSLogTypeLex, message);\n}\n\nstatic bool progress_callback(\n TSParseState *state\n) {\n return tree_sitter_progress_callback(state->current_byte_offset, state->has_error);\n}\n\nstatic bool query_progress_callback(\n TSQueryCursorState *state\n) {\n return tree_sitter_query_progress_callback(state->current_byte_offset);\n}\n\nvoid ts_parser_new_wasm() {\n TSParser *parser = ts_parser_new();\n char *input_buffer = calloc(INPUT_BUFFER_SIZE, sizeof(char));\n TRANSFER_BUFFER[0] = parser;\n TRANSFER_BUFFER[1] = input_buffer;\n}\n\nvoid ts_parser_enable_logger_wasm(TSParser *self, bool should_log) {\n TSLogger logger = {self, should_log ? call_log_callback : NULL};\n ts_parser_set_logger(self, logger);\n}\n\nTSTree *ts_parser_parse_wasm(\n TSParser *self,\n char *input_buffer,\n const TSTree *old_tree,\n TSRange *ranges,\n uint32_t range_count\n) {\n TSInput input = {\n input_buffer,\n call_parse_callback,\n TSInputEncodingUTF16LE,\n NULL,\n };\n if (range_count) {\n for (unsigned i = 0; i < range_count; i++) {\n unmarshal_range(&ranges[i]);\n }\n ts_parser_set_included_ranges(self, ranges, range_count);\n free(ranges);\n } else {\n ts_parser_set_included_ranges(self, NULL, 0);\n }\n\n TSParseOptions options = {.payload = NULL, .progress_callback = progress_callback};\n\n return ts_parser_parse_with_options(self, old_tree, input, options);\n}\n\nvoid ts_parser_included_ranges_wasm(TSParser *self) {\n uint32_t range_count = 0;\n const TSRange *ranges = ts_parser_included_ranges(self, &range_count);\n TSRange *copied_ranges = malloc(sizeof(TSRange) * range_count);\n memcpy(copied_ranges, ranges, sizeof(TSRange) * range_count);\n for (unsigned i = 0; i < range_count; i++) {\n marshal_range(&copied_ranges[i]);\n }\n TRANSFER_BUFFER[0] = range_count ? (const void *)range_count : NULL;\n TRANSFER_BUFFER[1] = copied_ranges;\n}\n\n/**********************/\n/* Section - Language */\n/**********************/\n\nint ts_language_type_is_named_wasm(const TSLanguage *self, TSSymbol typeId) {\n const TSSymbolType symbolType = ts_language_symbol_type(self, typeId);\n return symbolType == TSSymbolTypeRegular;\n}\n\nint ts_language_type_is_visible_wasm(const TSLanguage *self, TSSymbol typeId) {\n const TSSymbolType symbolType = ts_language_symbol_type(self, typeId);\n return symbolType <= TSSymbolTypeAnonymous;\n}\n\nvoid ts_language_metadata_wasm(const TSLanguage *self) {\n const TSLanguageMetadata *metadata = ts_language_metadata(self);\n marshal_language_metadata(metadata);\n}\n\nvoid ts_language_supertypes_wasm(const TSLanguage *self) {\n uint32_t length;\n const TSSymbol *supertypes = ts_language_supertypes(self, &length);\n TRANSFER_BUFFER[0] = (const void *)length;\n TRANSFER_BUFFER[1] = supertypes;\n}\n\nvoid ts_language_subtypes_wasm(const TSLanguage *self, TSSymbol supertype) {\n uint32_t length;\n const TSSymbol *subtypes = ts_language_subtypes(self, supertype, &length);\n TRANSFER_BUFFER[0] = (const void *)length;\n TRANSFER_BUFFER[1] = subtypes;\n}\n\n/******************/\n/* Section - Tree */\n/******************/\n\nvoid ts_tree_root_node_wasm(const TSTree *tree) {\n marshal_node(TRANSFER_BUFFER, ts_tree_root_node(tree));\n}\n\nvoid ts_tree_root_node_with_offset_wasm(const TSTree *tree) {\n // read int and point from transfer buffer\n const void **address = TRANSFER_BUFFER + SIZE_OF_NODE;\n uint32_t offset = code_unit_to_byte((uint32_t)address[0]);\n TSPoint extent = unmarshal_point(address + 1);\n TSNode node = ts_tree_root_node_with_offset(tree, offset, extent);\n marshal_node(TRANSFER_BUFFER, node);\n}\n\nvoid ts_tree_edit_wasm(TSTree *tree) {\n TSInputEdit edit = unmarshal_edit();\n ts_tree_edit(tree, &edit);\n}\n\nvoid ts_tree_included_ranges_wasm(const TSTree *tree) {\n uint32_t range_count;\n TSRange *ranges = ts_tree_included_ranges(tree, &range_count);\n for (unsigned i = 0; i < range_count; i++) {\n marshal_range(&ranges[i]);\n }\n TRANSFER_BUFFER[0] = (range_count ? (const void *)range_count : NULL);\n TRANSFER_BUFFER[1] = (const void *)ranges;\n}\n\nvoid ts_tree_get_changed_ranges_wasm(TSTree *tree, TSTree *other) {\n unsigned range_count;\n TSRange *ranges = ts_tree_get_changed_ranges(tree, other, &range_count);\n for (unsigned i = 0; i < range_count; i++) {\n marshal_range(&ranges[i]);\n }\n TRANSFER_BUFFER[0] = (const void *)range_count;\n TRANSFER_BUFFER[1] = (const void *)ranges;\n}\n\n/************************/\n/* Section - TreeCursor */\n/************************/\n\nvoid ts_tree_cursor_new_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n TSTreeCursor cursor = ts_tree_cursor_new(node);\n marshal_cursor(&cursor);\n}\n\nvoid ts_tree_cursor_copy_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSTreeCursor copy = ts_tree_cursor_copy(&cursor);\n marshal_cursor(&copy);\n}\n\nvoid ts_tree_cursor_delete_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n ts_tree_cursor_delete(&cursor);\n}\n\nvoid ts_tree_cursor_reset_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n TSTreeCursor cursor = unmarshal_cursor(&TRANSFER_BUFFER[SIZE_OF_NODE], tree);\n ts_tree_cursor_reset(&cursor, node);\n marshal_cursor(&cursor);\n}\n\nvoid ts_tree_cursor_reset_to_wasm(const TSTree *_dst, const TSTree *_src) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, _dst);\n TSTreeCursor src = unmarshal_cursor(&TRANSFER_BUFFER[SIZE_OF_CURSOR], _src);\n ts_tree_cursor_reset_to(&cursor, &src);\n marshal_cursor(&cursor);\n}\n\nbool ts_tree_cursor_goto_first_child_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n bool result = ts_tree_cursor_goto_first_child(&cursor);\n marshal_cursor(&cursor);\n return result;\n}\n\nbool ts_tree_cursor_goto_last_child_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n bool result = ts_tree_cursor_goto_last_child(&cursor);\n marshal_cursor(&cursor);\n return result;\n}\n\nbool ts_tree_cursor_goto_first_child_for_index_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n const void **address = TRANSFER_BUFFER + 3;\n uint32_t index = code_unit_to_byte((uint32_t)address[0]);\n bool result = ts_tree_cursor_goto_first_child_for_byte(&cursor, index);\n marshal_cursor(&cursor);\n return result;\n}\n\nbool ts_tree_cursor_goto_first_child_for_position_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n const void **address = TRANSFER_BUFFER + 3;\n TSPoint point = unmarshal_point(address);\n bool result = ts_tree_cursor_goto_first_child_for_point(&cursor, point);\n marshal_cursor(&cursor);\n return result;\n}\n\nbool ts_tree_cursor_goto_next_sibling_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n bool result = ts_tree_cursor_goto_next_sibling(&cursor);\n marshal_cursor(&cursor);\n return result;\n}\n\nbool ts_tree_cursor_goto_previous_sibling_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n bool result = ts_tree_cursor_goto_previous_sibling(&cursor);\n marshal_cursor(&cursor);\n return result;\n}\n\nvoid ts_tree_cursor_goto_descendant_wasm(const TSTree *tree, uint32_t goal_descendant_index) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n ts_tree_cursor_goto_descendant(&cursor, goal_descendant_index);\n marshal_cursor(&cursor);\n}\n\nbool ts_tree_cursor_goto_parent_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n bool result = ts_tree_cursor_goto_parent(&cursor);\n marshal_cursor(&cursor);\n return result;\n}\n\nuint16_t ts_tree_cursor_current_node_type_id_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return ts_node_symbol(node);\n}\n\nuint16_t ts_tree_cursor_current_node_state_id_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return ts_node_parse_state(node);\n}\n\nbool ts_tree_cursor_current_node_is_named_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return ts_node_is_named(node);\n}\n\nbool ts_tree_cursor_current_node_is_missing_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return ts_node_is_missing(node);\n}\n\nuint32_t ts_tree_cursor_current_node_id_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return (uint32_t)node.id;\n}\n\nvoid ts_tree_cursor_start_position_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n marshal_point(ts_node_start_point(node));\n}\n\nvoid ts_tree_cursor_end_position_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n marshal_point(ts_node_end_point(node));\n}\n\nuint32_t ts_tree_cursor_start_index_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return byte_to_code_unit(ts_node_start_byte(node));\n}\n\nuint32_t ts_tree_cursor_end_index_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n TSNode node = ts_tree_cursor_current_node(&cursor);\n return byte_to_code_unit(ts_node_end_byte(node));\n}\n\nuint32_t ts_tree_cursor_current_field_id_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n return ts_tree_cursor_current_field_id(&cursor);\n}\n\nuint32_t ts_tree_cursor_current_depth_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n return ts_tree_cursor_current_depth(&cursor);\n}\n\nuint32_t ts_tree_cursor_current_descendant_index_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n return ts_tree_cursor_current_descendant_index(&cursor);\n}\n\nvoid ts_tree_cursor_current_node_wasm(const TSTree *tree) {\n TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree);\n marshal_node(TRANSFER_BUFFER, ts_tree_cursor_current_node(&cursor));\n}\n\n/******************/\n/* Section - Node */\n/******************/\n\nstatic TSTreeCursor scratch_cursor = {0};\nstatic TSQueryCursor *scratch_query_cursor = NULL;\n\nuint16_t ts_node_symbol_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_symbol(node);\n}\n\nconst char *ts_node_field_name_for_child_wasm(const TSTree *tree, uint32_t index) {\n TSNode node = unmarshal_node(tree);\n return ts_node_field_name_for_child(node, index);\n}\n\nconst char *ts_node_field_name_for_named_child_wasm(const TSTree *tree, uint32_t index) {\n TSNode node = unmarshal_node(tree);\n return ts_node_field_name_for_named_child(node, index);\n}\n\nvoid ts_node_children_by_field_id_wasm(const TSTree *tree, uint32_t field_id) {\n TSNode node = unmarshal_node(tree);\n TSTreeCursor cursor = ts_tree_cursor_new(node);\n\n bool done = field_id == 0;\n if (!done) {\n ts_tree_cursor_reset(&cursor, node);\n ts_tree_cursor_goto_first_child(&cursor);\n }\n\n Array(const void*) result = array_new();\n\n while (!done) {\n while (ts_tree_cursor_current_field_id(&cursor) != field_id) {\n if (!ts_tree_cursor_goto_next_sibling(&cursor)) {\n done = true;\n break;\n }\n }\n if (done) {\n break;\n }\n TSNode result_node = ts_tree_cursor_current_node(&cursor);\n if (!ts_tree_cursor_goto_next_sibling(&cursor)) {\n done = true;\n }\n array_grow_by(&result, SIZE_OF_NODE);\n marshal_node(result.contents + result.size - SIZE_OF_NODE, result_node);\n }\n ts_tree_cursor_delete(&cursor);\n\n TRANSFER_BUFFER[0] = (const void*)(result.size / SIZE_OF_NODE);\n TRANSFER_BUFFER[1] = (const void*)result.contents;\n}\n\nvoid ts_node_first_child_for_byte_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void** address = TRANSFER_BUFFER + SIZE_OF_NODE;\n uint32_t byte = code_unit_to_byte((uint32_t)address[0]);\n marshal_node(TRANSFER_BUFFER, ts_node_first_child_for_byte(node, byte));\n}\n\nvoid ts_node_first_named_child_for_byte_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void** address = TRANSFER_BUFFER + SIZE_OF_NODE;\n uint32_t byte = code_unit_to_byte((uint32_t)address[0]);\n marshal_node(TRANSFER_BUFFER, ts_node_first_named_child_for_byte(node, byte));\n}\n\nuint16_t ts_node_grammar_symbol_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_grammar_symbol(node);\n}\n\nuint32_t ts_node_child_count_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_child_count(node);\n}\n\nuint32_t ts_node_named_child_count_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_named_child_count(node);\n}\n\nvoid ts_node_child_wasm(const TSTree *tree, uint32_t index) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_child(node, index));\n}\n\nvoid ts_node_named_child_wasm(const TSTree *tree, uint32_t index) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_named_child(node, index));\n}\n\nvoid ts_node_child_by_field_id_wasm(const TSTree *tree, uint32_t field_id) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_child_by_field_id(node, field_id));\n}\n\nvoid ts_node_next_sibling_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_next_sibling(node));\n}\n\nvoid ts_node_prev_sibling_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_prev_sibling(node));\n}\n\nvoid ts_node_next_named_sibling_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_next_named_sibling(node));\n}\n\nvoid ts_node_prev_named_sibling_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_prev_named_sibling(node));\n}\n\nuint32_t ts_node_descendant_count_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_descendant_count(node);\n}\n\nvoid ts_node_parent_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_node(TRANSFER_BUFFER, ts_node_parent(node));\n}\n\nvoid ts_node_child_with_descendant_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n TSNode descendant = unmarshal_node_at(tree, 1);\n marshal_node(TRANSFER_BUFFER, ts_node_child_with_descendant(node, descendant));\n}\n\nvoid ts_node_descendant_for_index_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void **address = TRANSFER_BUFFER + SIZE_OF_NODE;\n uint32_t start = code_unit_to_byte((uint32_t)address[0]);\n uint32_t end = code_unit_to_byte((uint32_t)address[1]);\n marshal_node(TRANSFER_BUFFER, ts_node_descendant_for_byte_range(node, start, end));\n}\n\nvoid ts_node_named_descendant_for_index_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void **address = TRANSFER_BUFFER + SIZE_OF_NODE;\n uint32_t start = code_unit_to_byte((uint32_t)address[0]);\n uint32_t end = code_unit_to_byte((uint32_t)address[1]);\n marshal_node(TRANSFER_BUFFER, ts_node_named_descendant_for_byte_range(node, start, end));\n}\n\nvoid ts_node_descendant_for_position_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void **address = TRANSFER_BUFFER + SIZE_OF_NODE;\n TSPoint start = unmarshal_point(address); address += SIZE_OF_POINT;\n TSPoint end = unmarshal_point(address);\n marshal_node(TRANSFER_BUFFER, ts_node_descendant_for_point_range(node, start, end));\n}\n\nvoid ts_node_named_descendant_for_position_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n const void **address = TRANSFER_BUFFER + SIZE_OF_NODE;\n TSPoint start = unmarshal_point(address); address += SIZE_OF_POINT;\n TSPoint end = unmarshal_point(address);\n marshal_node(TRANSFER_BUFFER, ts_node_named_descendant_for_point_range(node, start, end));\n}\n\nvoid ts_node_start_point_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_point(ts_node_start_point(node));\n}\n\nvoid ts_node_end_point_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n marshal_point(ts_node_end_point(node));\n}\n\nuint32_t ts_node_start_index_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return byte_to_code_unit(ts_node_start_byte(node));\n}\n\nuint32_t ts_node_end_index_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return byte_to_code_unit(ts_node_end_byte(node));\n}\n\nchar *ts_node_to_string_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_string(node);\n}\n\nvoid ts_node_children_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n uint32_t count = ts_node_child_count(node);\n const void **result = NULL;\n if (count > 0) {\n result = (const void**)calloc(sizeof(void *), SIZE_OF_NODE * count);\n const void **address = result;\n ts_tree_cursor_reset(&scratch_cursor, node);\n ts_tree_cursor_goto_first_child(&scratch_cursor);\n marshal_node(address, ts_tree_cursor_current_node(&scratch_cursor));\n for (uint32_t i = 1; i < count; i++) {\n address += SIZE_OF_NODE;\n ts_tree_cursor_goto_next_sibling(&scratch_cursor);\n TSNode child = ts_tree_cursor_current_node(&scratch_cursor);\n marshal_node(address, child);\n }\n }\n TRANSFER_BUFFER[0] = (const void *)count;\n TRANSFER_BUFFER[1] = (const void *)result;\n}\n\nvoid ts_node_named_children_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n uint32_t count = ts_node_named_child_count(node);\n const void **result = NULL;\n if (count > 0) {\n result = (const void**)calloc(sizeof(void *), SIZE_OF_NODE * count);\n const void **address = result;\n ts_tree_cursor_reset(&scratch_cursor, node);\n ts_tree_cursor_goto_first_child(&scratch_cursor);\n uint32_t i = 0;\n for (;;) {\n TSNode child = ts_tree_cursor_current_node(&scratch_cursor);\n if (ts_node_is_named(child)) {\n marshal_node(address, child);\n address += SIZE_OF_NODE;\n i++;\n if (i == count) {\n break;\n }\n }\n if (!ts_tree_cursor_goto_next_sibling(&scratch_cursor)) {\n break;\n }\n }\n }\n TRANSFER_BUFFER[0] = (const void *)count;\n TRANSFER_BUFFER[1] = (const void *)result;\n}\n\nbool symbols_contain(const uint32_t *set, uint32_t length, uint32_t value) {\n for (unsigned i = 0; i < length; i++) {\n if (set[i] == value) {\n return true;\n }\n if (set[i] > value) {\n break;\n }\n }\n return false;\n}\n\nvoid ts_node_descendants_of_type_wasm(\n const TSTree *tree,\n const uint32_t *symbols,\n uint32_t symbol_count,\n uint32_t start_row,\n uint32_t start_column,\n uint32_t end_row,\n uint32_t end_column\n) {\n TSNode node = unmarshal_node(tree);\n TSPoint start_point = {start_row, code_unit_to_byte(start_column)};\n TSPoint end_point = {end_row, code_unit_to_byte(end_column)};\n if (end_point.row == 0 && end_point.column == 0) {\n end_point = (TSPoint) {UINT32_MAX, UINT32_MAX};\n }\n\n Array(const void *) result = array_new();\n\n // Walk the tree depth first looking for matching nodes.\n ts_tree_cursor_reset(&scratch_cursor, node);\n bool already_visited_children = false;\n while (true) {\n TSNode descendant = ts_tree_cursor_current_node(&scratch_cursor);\n\n if (!already_visited_children) {\n // If this node is before the selected range, then avoid\n // descending into it.\n if (point_lte(ts_node_end_point(descendant), start_point)) {\n if (ts_tree_cursor_goto_next_sibling(&scratch_cursor)) {\n already_visited_children = false;\n } else {\n if (!ts_tree_cursor_goto_parent(&scratch_cursor)) {\n break;\n }\n already_visited_children = true;\n }\n continue;\n }\n\n // If this node is after the selected range, then stop walking.\n if (point_lte(end_point, ts_node_start_point(descendant))) {\n break;\n }\n\n // Add the node to the result if its type matches one of the given\n // node types.\n if (symbols_contain(symbols, symbol_count, ts_node_symbol(descendant))) {\n array_grow_by(&result, SIZE_OF_NODE);\n marshal_node(result.contents + result.size - SIZE_OF_NODE, descendant);\n }\n\n // Continue walking.\n if (ts_tree_cursor_goto_first_child(&scratch_cursor)) {\n already_visited_children = false;\n } else if (ts_tree_cursor_goto_next_sibling(&scratch_cursor)) {\n already_visited_children = false;\n } else {\n if (!ts_tree_cursor_goto_parent(&scratch_cursor)) {\n break;\n }\n already_visited_children = true;\n }\n } else {\n if (ts_tree_cursor_goto_next_sibling(&scratch_cursor)) {\n already_visited_children = false;\n } else {\n if (!ts_tree_cursor_goto_parent(&scratch_cursor)) {\n break;\n }\n }\n }\n }\n\n TRANSFER_BUFFER[0] = (const void *)(result.size / SIZE_OF_NODE);\n TRANSFER_BUFFER[1] = (const void *)result.contents;\n}\n\nint ts_node_is_named_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_is_named(node);\n}\n\nint ts_node_has_changes_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_has_changes(node);\n}\n\nint ts_node_has_error_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_has_error(node);\n}\n\nint ts_node_is_error_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_is_error(node);\n}\n\nint ts_node_is_missing_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_is_missing(node);\n}\n\nint ts_node_is_extra_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_is_extra(node);\n}\n\nuint16_t ts_node_parse_state_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_parse_state(node);\n}\n\nuint16_t ts_node_next_parse_state_wasm(const TSTree *tree) {\n TSNode node = unmarshal_node(tree);\n return ts_node_next_parse_state(node);\n}\n\n/******************/\n/* Section - Query */\n/******************/\n\nvoid ts_query_matches_wasm(\n const TSQuery *self,\n const TSTree *tree,\n uint32_t start_row,\n uint32_t start_column,\n uint32_t end_row,\n uint32_t end_column,\n uint32_t start_index,\n uint32_t end_index,\n uint32_t start_containing_row,\n uint32_t start_containing_column,\n uint32_t end_containing_row,\n uint32_t end_containing_column,\n uint32_t start_containing_index,\n uint32_t end_containing_index,\n uint32_t match_limit,\n uint32_t max_start_depth\n) {\n if (!scratch_query_cursor) {\n scratch_query_cursor = ts_query_cursor_new();\n }\n if (match_limit == 0) {\n ts_query_cursor_set_match_limit(scratch_query_cursor, UINT32_MAX);\n } else {\n ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit);\n }\n\n TSNode node = unmarshal_node(tree);\n TSPoint start_point = {start_row, code_unit_to_byte(start_column)};\n TSPoint end_point = {end_row, code_unit_to_byte(end_column)};\n TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)};\n TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)};\n ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point);\n ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index);\n ts_query_cursor_set_containing_point_range(\n scratch_query_cursor,\n start_containing_point,\n end_containing_point\n );\n ts_query_cursor_set_containing_byte_range(\n scratch_query_cursor,\n start_containing_index,\n end_containing_index\n );\n ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit);\n ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth);\n\n TSQueryCursorOptions options = {.payload = NULL, .progress_callback = query_progress_callback};\n\n ts_query_cursor_exec_with_options(scratch_query_cursor, self, node, &options);\n\n uint32_t index = 0;\n uint32_t match_count = 0;\n Array(const void *) result = array_new();\n\n TSQueryMatch match;\n while (ts_query_cursor_next_match(scratch_query_cursor, &match)) {\n match_count++;\n array_grow_by(&result, 2 + (SIZE_OF_CAPTURE * match.capture_count));\n result.contents[index++] = (const void *)(uint32_t)match.pattern_index;\n result.contents[index++] = (const void *)(uint32_t)match.capture_count;\n for (unsigned i = 0; i < match.capture_count; i++) {\n const TSQueryCapture *capture = &match.captures[i];\n result.contents[index++] = (const void *)capture->index;\n marshal_node(result.contents + index, capture->node);\n index += SIZE_OF_NODE;\n }\n }\n\n bool did_exceed_match_limit =\n ts_query_cursor_did_exceed_match_limit(scratch_query_cursor);\n TRANSFER_BUFFER[0] = (const void *)(match_count);\n TRANSFER_BUFFER[1] = (const void *)result.contents;\n TRANSFER_BUFFER[2] = (const void *)(did_exceed_match_limit);\n}\n\nvoid ts_query_captures_wasm(\n const TSQuery *self,\n const TSTree *tree,\n uint32_t start_row,\n uint32_t start_column,\n uint32_t end_row,\n uint32_t end_column,\n uint32_t start_index,\n uint32_t end_index,\n uint32_t start_containing_row,\n uint32_t start_containing_column,\n uint32_t end_containing_row,\n uint32_t end_containing_column,\n uint32_t start_containing_index,\n uint32_t end_containing_index,\n uint32_t match_limit,\n uint32_t max_start_depth\n) {\n if (!scratch_query_cursor) {\n scratch_query_cursor = ts_query_cursor_new();\n }\n\n ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit);\n\n TSNode node = unmarshal_node(tree);\n TSPoint start_point = {start_row, code_unit_to_byte(start_column)};\n TSPoint end_point = {end_row, code_unit_to_byte(end_column)};\n TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)};\n TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)};\n ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point);\n ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index);\n ts_query_cursor_set_containing_point_range(\n scratch_query_cursor,\n start_containing_point,\n end_containing_point\n );\n ts_query_cursor_set_containing_byte_range(\n scratch_query_cursor,\n start_containing_index,\n end_containing_index\n );\n ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit);\n ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth);\n ts_query_cursor_exec(scratch_query_cursor, self, node);\n\n unsigned index = 0;\n unsigned capture_count = 0;\n Array(const void *) result = array_new();\n\n TSQueryMatch match;\n uint32_t capture_index;\n while (ts_query_cursor_next_capture(\n scratch_query_cursor,\n &match,\n &capture_index\n )) {\n capture_count++;\n\n array_grow_by(&result, 3 + (SIZE_OF_CAPTURE * match.capture_count));\n result.contents[index++] = (const void *)(uint32_t)match.pattern_index;\n result.contents[index++] = (const void *)(uint32_t)match.capture_count;\n result.contents[index++] = (const void *)capture_index;\n for (unsigned i = 0; i < match.capture_count; i++) {\n const TSQueryCapture *capture = &match.captures[i];\n result.contents[index++] = (const void *)capture->index;\n marshal_node(result.contents + index, capture->node);\n index += SIZE_OF_NODE;\n }\n }\n\n bool did_exceed_match_limit =\n ts_query_cursor_did_exceed_match_limit(scratch_query_cursor);\n TRANSFER_BUFFER[0] = (const void *)(capture_count);\n TRANSFER_BUFFER[1] = (const void *)result.contents;\n TRANSFER_BUFFER[2] = (const void *)(did_exceed_match_limit);\n}\n"
52
- ],
53
- "names": [],
54
- "mappings": "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jB,GACiB,WAHb,EAKM,OD9LV,W,GAAA,mDA0EiB,OADA,GAFX,QAPA,KAJ6B,EAW7B,SAxC2B,eAAlB,KAAjB,UA+CF,C,KEnEgB,SAAmB,KOgX7B,cA1XF,iBAkaJ,MArCgB,uC,EACa,Q,EAAA,gBA/VT,WLsPD,CAAV,EAAoC,OKrPP,GAKrB,KJgJR,EIhJQ,EADD,KJkJL,KAAsC,KAAR,KAApC,GADI,GIhJQ,EJiJZ,KI7HmB,eLyJmC,Y,CKzJnC,ELyJmC,uBKzJnC,ELyJmC,OKtJrD,WAEe,YLsMf,I,CAAA,IAIe,OFpRT,KEoRS,cFpRT,QEgRI,aFhRJ,GEgRN,EFhRM,OAkBI,SAAS,EAAU,KOqYzB,K,CAAA,EPzXK,KO8XL,K,EP9XK,EAhBoB,KO8YzB,YP1YyB,KO0YzB,kBA9ViB,CAOH,WLyJmC,IKzJnC,QACE,ELwJiC,YKzJnC,ELyJmC,uB,CKtJrD,EACE,UACa,MADb,KACa,IAEW,IAER,I,CAAA,WLyLlB,MAAU,OAC+B,GAD/B,YAEZ,GAEiB,sBF3QT,QCYgB,ODZhB,MO8EY,ELkMlB,MAAU,aAAV,EFhRM,KEoRS,OFpRT,KEoRS,cFpRT,MEgRN,EFhRM,OAkBI,OAAS,EAAU,KOqYzB,K,CAAA,EPzXK,SO8XL,SP1YyB,KO0YzB,YP9YyB,KO8YzB,6BA9ViB,KAOH,MPnDR,KAAS,EAAU,KOgZzB,K,CAAA,EAlUJ,YL4HuD,CK5HvD,EL4HuD,qBK3HzB,aAG5B,W,CAAA,MLwHqD,SKrHvB,OLsHqB,IKwMjD,KAhU0C,KFcnC,OAAN,OAAP,CEkTM,MLzMmD,UKrHvB,OLsHqB,IKwMjD,IACkB,2CA3XR,SLsPD,CAAV,KK6IT,C,KAtFkB,WA5Ud,iBAkXJ,MAnCgB,uC,EACa,Q,EAAA,gBAjTT,WLsPD,CAAV,EAAoC,OKrPP,GAKrB,KJgJR,EIhJQ,EADD,KJkJL,KAAsC,KAAR,KAApC,GADI,GIhJQ,EJiJZ,KI7HmB,eLyJmC,Y,CKzJnC,ELyJmC,uBKzJnC,ELyJmC,OKtJrD,WAEe,YLsMf,I,CAAA,IAIe,OFpRT,KEoRS,cFpRT,QEgRI,aFhRJ,GEgRN,EDpQsB,SM6VT,OAKT,E,CAAA,+BAhTiB,CAOH,WLyJmC,IKzJnC,QACE,ELwJiC,YKzJnC,ELyJmC,uB,CKtJrD,EACE,UACa,MADb,KACa,IAEW,IAER,I,CAAA,WLyLlB,MAAU,OAC+B,GAD/B,YAEZ,GAEiB,sBF3QT,eCYgB,MMkEJ,ELkMlB,MAAU,aAAV,EFhRM,KEoRS,OFpRT,KEoRS,cFpRT,MEgRN,EKyFa,EN7VS,KM6VT,GN7VS,EMkWlB,yBAhTiB,KAOH,MA6SF,OAlRhB,YL4HuD,CK5HvD,EL4HuD,qBK3HzB,aAG5B,W,CAAA,MLwHqD,SKrHvB,OLsHqB,IKwJjD,KAhR0C,KFcnC,OAAN,OAAP,CEkQM,MLzJmD,UKrHvB,OLsHqB,IKwJjD,IACkB,2CA3UR,SLsPD,CAAV,KK6FT,C,EAnFA,0BACgB,YAjQI,oDLsPD,CAAV,E,CAAoC,K,CAAA,EKrPP,KAKrB,KJgJR,EIhJQ,EADD,KJkJL,KAAsC,KAAR,KAApC,oBIvJe,EJuJf,II7HmB,gBAAG,GAPA,GAOH,ILyJmC,IKzJnC,EACE,KADF,QACE,SLwJiC,YKzJnC,ELyJmC,uB,CKtJrD,EACE,UACa,MADb,KACa,IAEW,IAER,I,CAAA,eLyLlB,MAAU,OAC+B,GAD/B,YAEZ,GAEiB,sBF3QT,UCYgB,KDZhB,MO8EY,EAGZ,0CL+LI,2BAAV,EFhRM,KEoRS,OFpRT,KEoRS,cFpRT,MEgRI,EAIK,qBK+Ja,EAAkB,OLnKpC,QKmKoC,ELnK9C,IACyB,EAC3B,GAEiB,MK+Ja,GA1HA,KAzN5B,ML4HuD,6BK3HzB,cAG5B,S,CAAA,ELwHqD,aKrHvB,OLsHqB,IK6F/C,ML9FiD,UKrHvB,OLsHqB,IK6F/C,MArNwC,KFcnC,OAAN,OAAP,CEuMQ,GLzBO,MAAV,EAAoC,KKoeV,KACd,KA1cyB,GACX,OACP,oCAElB,GA3PiB,E,EAAA,GAPA,GAOH,MAmQH,yCA5TjB,kBAoUJ,C,EAjKA,eACyB,YA3IhB,ULkOH,GAAU,UAAV,YACe,CD5PO,ECwQP,KATA,KD/PO,EC2PZ,ED3PY,ICoQZ,CDpQY,ECqQG,IAGV,MDxQO,ECwQP,cAbL,UAaK,EAbL,OAC+B,GAD/B,YA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kBoBlKI,GpBmKiD,MoBnKjD,EpBoKI,WAAY,MoBpKhB,EpBoKF,IAF2D,GAA7D,G,GAusBJ,W,EO9NA,GAIgC,WAAhC,CAAE,8BAC2B,EASI,Kflb0B,Ke8anD,aAAwB,Kf9a2B,KevN9C,EfuN8C,OAFE,EAEF,EAFE,KevN5C,MfyN0C,OAFE,UevN5C,MfyN0C,KevN9C,MACuB,CAGhB,GAAS,GAAK,GdgMzB,KcjMG,KAAM,GdkMR,KAAsC,KAAR,KAApC,EchMS,OdgMT,Kcgc4B,Gf9a2B,6BekbnD,EAII,OAAM,Gd9bN,KAAY,GAMG,gBcybP,GAAS,GAAK,Kdzbb,Oc4bjB,6BACY,S,CAAA,EAAwC,KAAtB,KAAY,CAApB,GAD2B,EAC3B,IAD+C,CAApB,GAAjD,MAEgB,cApBpB,CAAE,MAUM,EAeR,C,OA3oBgC,OAsOM,WAtON,OACU,Gf4QvB,QAAV,MAAoC,Oe5QM,GAIzC,KAAM,KACc,KduKrB,EcvKqB,EdwKnB,KAAsC,KAAR,KAApC,GADI,GcvKqB,EdwKzB,IcrKqC,cACmB,CAzB5C,KfuN4C,UevN5C,MfyN0C,CevN9C,cACuB,CAGhB,GAAS,GAAK,GdgMzB,KACC,OAAsC,KAAR,KAApC,EchMS,OdgMT,KcnMO,GAqBL,mBAoBkB,6BAbI,kEAcF,EfyKmC,YevLjC,EfyL+B,IAFE,YAEF,OAFE,gBAEF,KejKrD,KACE,UACU,KAAH,eAEiB,EAJ1B,EfkPwB,Q,CAAA,EAAa,KAAlC,Oe1OH,Of2MU,ae3MV,EjBrEM,GEiTI,MAFc,EAEd,EA7BK,OFpRT,KiBoEa,KACnB,Kf+Me,cFpRT,ME+SkB,EF/SlB,OCYgB,OgBgEJ,EhBhEI,IgB8DT,CAEK,GhBhEI,EgBgEJ,QACC,Kf0LT,Qe3LQ,Ef2LlB,Ie1LmB,Kf2L8C,GAAd,Ie3LhC,Kf2LJ,GAAkD,Ie3L9C,If2LgC,CACrD,GAEiB,oBe/LG,EjB5EZ,KCYgB,OC+PP,EF3QT,WEgRN,MAAU,ODpQY,WDZhB,KEoRS,OFpRT,KEoRS,KDxQO,KCwQP,OFpRT,MEgRN,EAIe,IedgB,EfchB,EedgB,KAAY,E,CAAA,EjBhPjC,KAAS,E,CAAU,UA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ZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JtB,MG7JY,UH8Jd,KIyGiB,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,MH2JQ,YAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KN,IIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JtB,MG7JY,UH8Jd,KIyGiB,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,MANG,KAArB,iBGyCI,QNkUiC,GA1MV,eAAD,YAAC,CAAD,GI+FV,UAAV,EJ/FoB,EI+FV,OD3PY,GH8JtB,I,CIsGU,ODpQY,CDZhB,GE2QS,KD/PO,KH8JtB,I,CI0Ge,KDxQO,IH4JF,EG5JE,I,EAAA,GHSO,GAAjC,E,EAAA,WAEsB,EAFtB,MACmB,EACN,KAAS,CAFtB,EAAiC,EAEX,IAF0B,CAAf,GAAjC,MAGe,KAAW,GA6ZpB,OA7QkB,gBI+FpB,UAAU,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KN,IIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JtB,MG7JY,mBCuQG,OFpRT,YEoRS,YDxQO,IC2PtB,ED1PY,GDbN,KCaM,YH4bN,qBACE,I,CAlSa,kBAAD,oCAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KA,KAAN,EIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JhB,OAAN,IG7JY,iBCuQG,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,UHicC,IAtSQ,kBAAD,oCAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KA,KAAN,EIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JhB,OAAN,IG7JY,iBCuQG,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,UH2JS,kBAAD,0BAAC,kBAAD,sCAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KA,KAAN,EIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JhB,OAAN,IG7JY,UH8Jd,KIyGiB,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,MH2JQ,YAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GC2PZ,SAC+B,CFxQnC,KEuQI,KFvQJ,UF0KA,KAAN,EIsGU,ODpQY,GDZhB,GE2QS,KF3QT,EE2QS,OF3QT,aE2QS,KD/PO,KH8JhB,OAAN,IG7JY,UH8Jd,KIyGiB,OFpRT,YEoRS,YDxQO,IH4JF,EG3JR,GDbN,KCaM,MANG,KAArB,sBCoNgE,EDpNhE,IH+dO,OAAyB,KA9TL,mBAAD,YAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GH8JhB,KAAN,E,CIsGU,ODpQY,CDZhB,GE2QS,KD/PO,KH8JhB,KAAN,E,CI0Ge,KDxQO,IH2diB,GAFzC,EAGE,OAFC,KAAyB,UAIzB,SAAyB,EAAzB,EAlUoB,eAAD,YAAC,CAAD,GI+FV,UJ/FU,EI+FV,OD3PY,GH8JhB,KAAN,E,CIsGU,ODpQY,CDZhB,GE2QS,KD/PO,KH8JhB,KAAN,E,CI0Ge,KDxQO,IH+diB,GAFzC,EAGE,IAFC,IAAyB,wBAKE,GALF,EAK5B,oBA5TE,IA8CA,QA/CqB,OAAD,GI0CmC,QJKvD,EILuD,oB,CJzCvD,MACwB,OACR,CAA6D,GAA9D,GAGH,GKmBT,KACC,KAAsC,KAAR,KAApC,iBLsBiC,kBAAU,CAAV,OAAyC,YACvC,IAAY,OAC1B,EA2QrB,KAA8B,KAA9B,gCAG8B,OAA9B,oBA/TE,IA8CA,QA/CqB,OAAD,GI0CmC,QJKvD,EILuD,oB,CJzCvD,MACwB,OACR,CAA6D,GAA9D,GAGH,GKmBT,KACC,KAAsC,KAAR,KAApC,iBLsBiC,kBAAU,CAAV,OAAyC,YACvC,IAAY,OAC1B,EA8QrB,KAA8B,KAA9B,yBAII,I,CAAA,MA7eU,GATD,eACS,MACS,MAAf,GACO,WACT,CAAgB,SAKhB,uBC6NS,CACZ,OAGM,EA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"
55
- }