herb 0.11.0-x86-linux-gnu → 0.11.2-x86-linux-gnu

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 (273) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -2
  3. data/config.yml +9 -0
  4. data/ext/herb/extconf.rb +8 -31
  5. data/ext/herb/nodes.c +90 -73
  6. data/ext/herb/parser_options_helpers.c +26 -0
  7. data/lib/herb/3.2/herb.so +0 -0
  8. data/lib/herb/3.3/herb.so +0 -0
  9. data/lib/herb/3.4/herb.so +0 -0
  10. data/lib/herb/4.0/herb.so +0 -0
  11. data/lib/herb/analysis/partial_index.rb +1 -1
  12. data/lib/herb/analysis/partial_resolution.rb +27 -0
  13. data/lib/herb/ast/helpers.rb +1 -1
  14. data/lib/herb/ast/nodes.rb +32 -6
  15. data/lib/herb/bootstrap.rb +6 -2
  16. data/lib/herb/configuration.rb +11 -1
  17. data/lib/herb/dev/classifier.rb +1 -1
  18. data/lib/herb/dev/runner.rb +6 -1
  19. data/lib/herb/engine/compiler.rb +52 -19
  20. data/lib/herb/engine/slots/dynamics_compiler.rb +63 -14
  21. data/lib/herb/engine/slots/markers.rb +24 -0
  22. data/lib/herb/engine/slots/state_compiler.rb +1 -2
  23. data/lib/herb/engine/slots/subtree_compiler.rb +1 -1
  24. data/lib/herb/engine/slots/visitor.rb +71 -32
  25. data/lib/herb/engine/visitors/instrumentation_visitor.rb +18 -6
  26. data/lib/herb/engine.rb +0 -2
  27. data/lib/herb/parser_options.rb +6 -3
  28. data/lib/herb/project.rb +19 -8
  29. data/lib/herb/version.rb +1 -1
  30. data/lib/herb.rb +1 -1
  31. data/sig/herb/analysis/partial_resolution.rbs +8 -0
  32. data/sig/herb/ast/nodes.rbs +10 -4
  33. data/sig/herb/bootstrap.rbs +2 -0
  34. data/sig/herb/configuration.rbs +3 -0
  35. data/sig/herb/dev/runner.rbs +3 -0
  36. data/sig/herb/engine/compiler.rbs +14 -3
  37. data/sig/herb/engine/slots/dynamics_compiler.rbs +27 -7
  38. data/sig/herb/engine/slots/markers.rbs +14 -0
  39. data/sig/herb/engine/slots/visitor.rbs +31 -13
  40. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +5 -1
  41. data/sig/herb/parser_options.rbs +6 -4
  42. data/sig/herb.rbs +2 -2
  43. data/sig/serialized_ast_nodes.rbs +1 -0
  44. data/src/analyze/action_view/attribute_extraction_helpers.c +40 -21
  45. data/src/analyze/action_view/generated_handlers.c +36 -36
  46. data/src/analyze/action_view/image_tag.c +7 -3
  47. data/src/analyze/action_view/javascript_include_tag.c +6 -3
  48. data/src/analyze/action_view/link_to.c +23 -23
  49. data/src/analyze/action_view/registry.c +7 -3
  50. data/src/analyze/action_view/tag_helper_node_builders.c +12 -16
  51. data/src/analyze/action_view/tag_helpers.c +215 -110
  52. data/src/analyze/action_view/turbo_frame_tag.c +5 -4
  53. data/src/analyze/analyze.c +41 -45
  54. data/src/analyze/analyze_helpers.c +240 -405
  55. data/src/analyze/analyzed_ruby.c +10 -7
  56. data/src/analyze/builders.c +1 -0
  57. data/src/analyze/control_type.c +46 -29
  58. data/src/analyze/herb_directives.c +16 -20
  59. data/src/analyze/iteration_nodes.c +69 -24
  60. data/src/analyze/parse_errors.c +32 -22
  61. data/src/analyze/postfix_conditionals.c +23 -13
  62. data/src/analyze/prism_annotate.c +56 -32
  63. data/src/analyze/render_nodes.c +51 -41
  64. data/src/analyze/strict_locals.c +14 -15
  65. data/src/analyze/ternary_conditionals.c +14 -10
  66. data/src/ast/ast_nodes.c +3 -1
  67. data/src/ast/ast_pretty_print.c +5 -1
  68. data/src/extract.c +204 -143
  69. data/src/herb.c +10 -8
  70. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  71. data/src/include/analyze/action_view/tag_helper_node_builders.h +1 -0
  72. data/src/include/analyze/action_view/tag_helpers.h +1 -1
  73. data/src/include/analyze/analyze.h +3 -24
  74. data/src/include/analyze/analyzed_ruby.h +29 -2
  75. data/src/include/analyze/helpers.h +7 -27
  76. data/src/include/ast/ast_nodes.h +2 -1
  77. data/src/include/herb.h +3 -2
  78. data/src/include/lexer/lexer.h +1 -0
  79. data/src/include/parser/parser_options.h +5 -0
  80. data/src/include/prism/herb_prism_node.h +6 -1
  81. data/src/include/prism/prism_context.h +12 -12
  82. data/src/include/prism/prism_helpers.h +30 -0
  83. data/src/include/prism_version.h +11 -0
  84. data/src/include/version.h +1 -1
  85. data/src/lexer.c +32 -0
  86. data/src/parser/parser_helpers.c +1 -2
  87. data/src/parser.c +6 -7
  88. data/src/parser_options_defaults.c +1 -0
  89. data/src/prism/prism_helpers.c +167 -42
  90. data/src/prism/ruby_parser.c +20 -20
  91. data/templates/ext/herb/nodes.c.erb +5 -5
  92. data/templates/ext/herb/parser_options_helpers.c.erb +33 -0
  93. data/templates/java/nodes.c.erb +6 -6
  94. data/templates/java/parser_options_helpers.c.erb +41 -2
  95. data/templates/java/parser_options_helpers.h.erb +2 -1
  96. data/templates/javascript/packages/core/src/nodes.ts.erb +21 -1
  97. data/templates/javascript/packages/node/extension/nodes.cpp.erb +5 -5
  98. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +34 -2
  99. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +1 -1
  100. data/templates/lib/herb/parser_options.rb.erb +1 -1
  101. data/templates/rust/src/ast/nodes.rs.erb +1 -4
  102. data/templates/rust/src/prism/generated_deserialize.rs.erb +90 -44
  103. data/templates/rust/src/prism/generated_prettyprint.rs.erb +18 -27
  104. data/templates/src/analyze/action_view/generated_handlers.c.erb +23 -22
  105. data/templates/src/include/parser/parser_options.h.erb +10 -0
  106. data/templates/src/include/prism_version.h.erb +17 -0
  107. data/templates/src/parser_options_defaults.c.erb +1 -1
  108. data/templates/template.rb +17 -2
  109. data/templates/wasm/nodes.cpp.erb +8 -18
  110. data/templates/wasm/parser_options_helpers.cpp.erb +24 -0
  111. data/vendor/prism/Rakefile +76 -7
  112. data/vendor/prism/config.yml +174 -161
  113. data/vendor/prism/include/prism/arena.h +45 -0
  114. data/vendor/prism/include/prism/arena.hpp +42 -0
  115. data/vendor/prism/include/prism/ast.h +2738 -611
  116. data/vendor/prism/include/prism/ast.hpp +641 -0
  117. data/vendor/prism/include/prism/buffer.h +60 -0
  118. data/vendor/prism/include/prism/buffer.hpp +55 -0
  119. data/vendor/prism/include/prism/comments.h +72 -0
  120. data/vendor/prism/include/prism/compiler/accel.h +26 -0
  121. data/vendor/prism/include/prism/compiler/align.h +36 -0
  122. data/vendor/prism/include/prism/compiler/assume.h +25 -0
  123. data/vendor/prism/include/prism/compiler/branch.h +26 -0
  124. data/vendor/prism/include/prism/compiler/bswap.h +46 -0
  125. data/vendor/prism/include/prism/compiler/cplusplus.hpp +16 -0
  126. data/vendor/prism/include/prism/compiler/endianness.h +34 -0
  127. data/vendor/prism/include/prism/compiler/exceptions.hpp +17 -0
  128. data/vendor/prism/include/prism/compiler/exported.h +24 -0
  129. data/vendor/prism/include/prism/compiler/fallthrough.h +22 -0
  130. data/vendor/prism/include/prism/compiler/filesystem.h +32 -0
  131. data/vendor/prism/include/prism/compiler/flex_array.h +19 -0
  132. data/vendor/prism/include/prism/compiler/force_inline.h +21 -0
  133. data/vendor/prism/include/prism/compiler/format.h +27 -0
  134. data/vendor/prism/include/prism/compiler/inline.h +17 -0
  135. data/vendor/prism/include/prism/compiler/lifetimebound.hpp +25 -0
  136. data/vendor/prism/include/prism/compiler/nodiscard.h +22 -0
  137. data/vendor/prism/include/prism/compiler/nonnull.h +18 -0
  138. data/vendor/prism/include/prism/compiler/unused.h +18 -0
  139. data/vendor/prism/include/prism/constant_pool.h +106 -0
  140. data/vendor/prism/include/prism/diagnostic.h +55 -402
  141. data/vendor/prism/include/prism/errors_format.h +61 -0
  142. data/vendor/prism/include/prism/excludes.h +29 -0
  143. data/vendor/prism/include/prism/integer.h +41 -0
  144. data/vendor/prism/include/prism/internal/allocator.h +68 -0
  145. data/vendor/prism/include/prism/internal/allocator_debug.h +88 -0
  146. data/vendor/prism/include/prism/internal/arena.h +108 -0
  147. data/vendor/prism/include/prism/internal/bit.h +42 -0
  148. data/vendor/prism/include/prism/internal/buffer.h +94 -0
  149. data/vendor/prism/include/prism/internal/char.h +145 -0
  150. data/vendor/prism/include/prism/internal/comments.h +54 -0
  151. data/vendor/prism/include/prism/internal/constant_pool.h +152 -0
  152. data/vendor/prism/include/prism/internal/diagnostic.h +389 -0
  153. data/vendor/prism/include/prism/{encoding.h → internal/encoding.h} +27 -68
  154. data/vendor/prism/include/prism/internal/integer.h +68 -0
  155. data/vendor/prism/include/prism/internal/isinf.h +16 -0
  156. data/vendor/prism/include/prism/internal/line_offset_list.h +34 -0
  157. data/vendor/prism/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  158. data/vendor/prism/include/prism/internal/magic_comments.h +23 -0
  159. data/vendor/prism/include/prism/internal/memchr.h +15 -0
  160. data/vendor/prism/include/prism/internal/node.h +42 -0
  161. data/vendor/prism/include/prism/internal/options.h +232 -0
  162. data/vendor/prism/include/prism/internal/parser.h +1015 -0
  163. data/vendor/prism/include/prism/internal/regexp.h +26 -0
  164. data/vendor/prism/include/prism/internal/serialize.h +39 -0
  165. data/vendor/prism/include/prism/internal/source.h +72 -0
  166. data/vendor/prism/include/prism/internal/static_literals.h +60 -0
  167. data/vendor/prism/include/prism/internal/stringy.h +30 -0
  168. data/vendor/prism/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  169. data/vendor/prism/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  170. data/vendor/prism/include/prism/internal/tokens.h +11 -0
  171. data/vendor/prism/include/prism/internal/xxh3.h +16 -0
  172. data/vendor/prism/include/prism/json.h +40 -0
  173. data/vendor/prism/include/prism/line_offset_list.h +69 -0
  174. data/vendor/prism/include/prism/magic_comments.h +53 -0
  175. data/vendor/prism/include/prism/node.h +59 -49
  176. data/vendor/prism/include/prism/node.hpp +272 -0
  177. data/vendor/prism/include/prism/node_type.hpp +38 -0
  178. data/vendor/prism/include/prism/options.h +154 -279
  179. data/vendor/prism/include/prism/options.hpp +43 -0
  180. data/vendor/prism/include/prism/parser.h +367 -870
  181. data/vendor/prism/include/prism/parser.hpp +274 -0
  182. data/vendor/prism/include/prism/prettyprint.h +14 -9
  183. data/vendor/prism/include/prism/serialize.h +123 -0
  184. data/vendor/prism/include/prism/source.h +163 -0
  185. data/vendor/prism/include/prism/stream.h +36 -0
  186. data/vendor/prism/include/prism/string_query.h +82 -0
  187. data/vendor/prism/include/prism/stringy.h +61 -0
  188. data/vendor/prism/include/prism/stringy.hpp +31 -0
  189. data/vendor/prism/include/prism/version.h +20 -3
  190. data/vendor/prism/include/prism.h +35 -320
  191. data/vendor/prism/include/prism.hpp +24 -0
  192. data/vendor/prism/src/arena.c +122 -0
  193. data/vendor/prism/src/{util/pm_buffer.c → buffer.c} +53 -21
  194. data/vendor/prism/src/{util/pm_char.c → char.c} +28 -57
  195. data/vendor/prism/src/comments.c +455 -0
  196. data/vendor/prism/src/constant_pool.c +406 -0
  197. data/vendor/prism/src/diagnostic.c +120 -68
  198. data/vendor/prism/src/encoding.c +8 -3
  199. data/vendor/prism/src/errors_format.c +519 -0
  200. data/vendor/prism/src/{util/pm_integer.c → integer.c} +38 -22
  201. data/vendor/prism/src/json.c +5733 -0
  202. data/vendor/prism/src/line_offset_list.c +100 -0
  203. data/vendor/prism/src/list.c +24 -0
  204. data/vendor/prism/src/{util/pm_memchr.c → memchr.c} +8 -6
  205. data/vendor/prism/src/node.c +3465 -7787
  206. data/vendor/prism/src/options.c +161 -54
  207. data/vendor/prism/src/parser.c +371 -0
  208. data/vendor/prism/src/prettyprint.c +421 -354
  209. data/vendor/prism/src/prism.c +8522 -7280
  210. data/vendor/prism/src/regexp.c +960 -45
  211. data/vendor/prism/src/serialize.c +2434 -2048
  212. data/vendor/prism/src/source.c +524 -0
  213. data/vendor/prism/src/static_literals.c +303 -360
  214. data/vendor/prism/src/string_query.c +180 -0
  215. data/vendor/prism/src/stringy.c +61 -0
  216. data/vendor/prism/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  217. data/vendor/prism/src/strpbrk.c +447 -0
  218. data/vendor/prism/src/{token_type.c → tokens.c} +39 -18
  219. data/vendor/prism/src/xxh3.c +292 -0
  220. data/vendor/prism/templates/ext/prism/api_node.c.erb +58 -44
  221. data/vendor/prism/templates/include/prism/ast.h.erb +67 -17
  222. data/vendor/prism/templates/include/prism/ast.hpp.erb +31 -0
  223. data/vendor/prism/templates/include/prism/internal/diagnostic.h.erb +60 -0
  224. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/AbstractNodeVisitor.java.erb +1 -1
  225. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/Loader.java.erb +232 -133
  226. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/Nodes.java.erb +62 -23
  227. data/vendor/prism/templates/javascript/src/deserialize.js.erb +153 -146
  228. data/vendor/prism/templates/javascript/src/nodes.js.erb +4 -9
  229. data/vendor/prism/templates/lib/prism/compiler.rb.erb +14 -5
  230. data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +20 -12
  231. data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +37 -11
  232. data/vendor/prism/templates/lib/prism/dsl.rb.erb +43 -4
  233. data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +26 -10
  234. data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +5 -2
  235. data/vendor/prism/templates/lib/prism/node.rb.erb +283 -105
  236. data/vendor/prism/templates/lib/prism/reflection.rb.erb +11 -2
  237. data/vendor/prism/templates/lib/prism/serialize.rb.erb +291 -134
  238. data/vendor/prism/templates/lib/prism/visitor.rb.erb +18 -0
  239. data/vendor/prism/templates/src/diagnostic.c.erb +114 -63
  240. data/vendor/prism/templates/src/json.c.erb +130 -0
  241. data/vendor/prism/templates/src/node.c.erb +79 -236
  242. data/vendor/prism/templates/src/prettyprint.c.erb +24 -13
  243. data/vendor/prism/templates/src/serialize.c.erb +369 -183
  244. data/vendor/prism/templates/src/{token_type.c.erb → tokens.c.erb} +22 -11
  245. data/vendor/prism/templates/template.rb +193 -91
  246. metadata +100 -42
  247. data/vendor/prism/include/prism/defines.h +0 -260
  248. data/vendor/prism/include/prism/pack.h +0 -163
  249. data/vendor/prism/include/prism/regexp.h +0 -43
  250. data/vendor/prism/include/prism/static_literals.h +0 -121
  251. data/vendor/prism/include/prism/util/pm_buffer.h +0 -236
  252. data/vendor/prism/include/prism/util/pm_char.h +0 -204
  253. data/vendor/prism/include/prism/util/pm_constant_pool.h +0 -218
  254. data/vendor/prism/include/prism/util/pm_integer.h +0 -130
  255. data/vendor/prism/include/prism/util/pm_memchr.h +0 -29
  256. data/vendor/prism/include/prism/util/pm_newline_list.h +0 -113
  257. data/vendor/prism/include/prism/util/pm_string.h +0 -200
  258. data/vendor/prism/src/pack.c +0 -509
  259. data/vendor/prism/src/util/pm_constant_pool.c +0 -342
  260. data/vendor/prism/src/util/pm_list.c +0 -49
  261. data/vendor/prism/src/util/pm_newline_list.c +0 -125
  262. data/vendor/prism/src/util/pm_string.c +0 -381
  263. data/vendor/prism/src/util/pm_strpbrk.c +0 -206
  264. data/vendor/prism/templates/include/prism/diagnostic.h.erb +0 -130
  265. data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +0 -68
  266. data/vendor/prism/templates/rbi/prism/node.rbi.erb +0 -167
  267. data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +0 -18
  268. data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +0 -45
  269. data/vendor/prism/templates/sig/prism/dsl.rbs.erb +0 -31
  270. data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +0 -7
  271. data/vendor/prism/templates/sig/prism/node.rbs.erb +0 -136
  272. data/vendor/prism/templates/sig/prism/visitor.rbs.erb +0 -17
  273. data/vendor/prism/templates/sig/prism.rbs.erb +0 -92
@@ -6,7 +6,6 @@
6
6
  #include <string.h>
7
7
 
8
8
  char* extract_javascript_include_tag_src(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
9
- (void) parser;
10
9
 
11
10
  if (!call_node || !call_node->arguments) { return NULL; }
12
11
 
@@ -22,8 +21,12 @@ char* extract_javascript_include_tag_src(pm_call_node_t* call_node, pm_parser_t*
22
21
  return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
23
22
  }
24
23
 
25
- size_t source_length = first_argument->location.end - first_argument->location.start;
26
- return hb_allocator_strndup(allocator, (const char*) first_argument->location.start, source_length);
24
+ const uint8_t* source = pm_parser_start(parser);
25
+ return hb_allocator_strndup(
26
+ allocator,
27
+ (const char*) (source + first_argument->location.start),
28
+ first_argument->location.length
29
+ );
27
30
  }
28
31
 
29
32
  bool javascript_include_tag_source_is_url(const char* source, size_t length) {
@@ -25,9 +25,10 @@ char* wrap_in_url_for(const char* source, size_t source_length, hb_allocator_T*
25
25
  bool detect_link_to(pm_call_node_t* call_node, pm_parser_t* parser) {
26
26
  if (!call_node || !call_node->name) { return false; }
27
27
 
28
- pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call_node->name);
28
+ const pm_constant_t* constant = pm_parser_constant(parser, call_node->name);
29
29
 
30
- return constant && constant->length == 7 && strncmp((const char*) constant->start, "link_to", 7) == 0;
30
+ return constant && pm_constant_length(constant) == 7
31
+ && strncmp((const char*) pm_constant_start(constant), "link_to", 7) == 0;
31
32
  }
32
33
 
33
34
  bool is_route_helper_node(pm_node_t* node, pm_parser_t* parser) {
@@ -36,11 +37,11 @@ bool is_route_helper_node(pm_node_t* node, pm_parser_t* parser) {
36
37
  pm_call_node_t* call = (pm_call_node_t*) node;
37
38
  if (!call->name) { return false; }
38
39
 
39
- pm_constant_t* constant = pm_constant_pool_id_to_constant(&parser->constant_pool, call->name);
40
- if (!constant || constant->length < 5) { return false; }
40
+ const pm_constant_t* constant = pm_parser_constant(parser, call->name);
41
+ if (!constant || pm_constant_length(constant) < 5) { return false; }
41
42
 
42
- const char* name = (const char*) constant->start;
43
- size_t length = constant->length;
43
+ const char* name = (const char*) pm_constant_start(constant);
44
+ size_t length = pm_constant_length(constant);
44
45
 
45
46
  return (length >= 5 && strncmp(name + length - 5, "_path", 5) == 0)
46
47
  || (length >= 4 && strncmp(name + length - 4, "_url", 4) == 0);
@@ -54,11 +55,9 @@ char* extract_link_to_tag_name(pm_call_node_t* call_node, pm_parser_t* parser, h
54
55
  }
55
56
 
56
57
  char* extract_link_to_content(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
57
- (void) parser;
58
-
59
58
  if (!call_node) { return NULL; }
60
59
 
61
- char* block_content = extract_inline_block_content(call_node, allocator);
60
+ char* block_content = extract_inline_block_content(call_node, parser, allocator);
62
61
  if (block_content) { return block_content; }
63
62
 
64
63
  if (!call_node->arguments) { return NULL; }
@@ -76,7 +75,8 @@ char* extract_link_to_content(pm_call_node_t* call_node, pm_parser_t* parser, hb
76
75
  return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
77
76
  }
78
77
 
79
- size_t source_length = first_argument->location.end - first_argument->location.start;
78
+ const uint8_t* source = pm_parser_start(parser);
79
+ size_t source_length = first_argument->location.length;
80
80
 
81
81
  // Format: "<expression>.to_s"
82
82
  if (arguments->arguments.size == 1) {
@@ -85,21 +85,21 @@ char* extract_link_to_content(pm_call_node_t* call_node, pm_parser_t* parser, hb
85
85
  size_t total_length = source_length + suffix_len;
86
86
  char* ruby_expression = hb_allocator_alloc(allocator, total_length + 1);
87
87
 
88
- memcpy(ruby_expression, (const char*) first_argument->location.start, source_length);
88
+ memcpy(ruby_expression, (const char*) (source + first_argument->location.start), source_length);
89
89
  memcpy(ruby_expression + source_length, suffix, suffix_len);
90
90
  ruby_expression[total_length] = '\0';
91
91
 
92
92
  return ruby_expression;
93
93
  }
94
94
 
95
- return hb_allocator_strndup(allocator, (const char*) first_argument->location.start, source_length);
95
+ return hb_allocator_strndup(allocator, (const char*) (source + first_argument->location.start), source_length);
96
96
  }
97
97
 
98
98
  char* extract_link_to_href(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
99
- (void) parser;
100
-
101
99
  if (!call_node || !call_node->arguments) { return NULL; }
102
100
 
101
+ const uint8_t* source = pm_parser_start(parser);
102
+
103
103
  pm_arguments_node_t* arguments = call_node->arguments;
104
104
  bool has_inline_block = call_node->block && call_node->block->type == PM_BLOCK_NODE;
105
105
 
@@ -112,13 +112,13 @@ char* extract_link_to_href(pm_call_node_t* call_node, pm_parser_t* parser, hb_al
112
112
  return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
113
113
  }
114
114
 
115
- size_t source_length = first_argument->location.end - first_argument->location.start;
115
+ size_t source_length = first_argument->location.length;
116
116
 
117
117
  if (is_route_helper_node(first_argument, parser)) {
118
- return hb_allocator_strndup(allocator, (const char*) first_argument->location.start, source_length);
118
+ return hb_allocator_strndup(allocator, (const char*) (source + first_argument->location.start), source_length);
119
119
  }
120
120
 
121
- return wrap_in_url_for((const char*) first_argument->location.start, source_length, allocator);
121
+ return wrap_in_url_for((const char*) (source + first_argument->location.start), source_length, allocator);
122
122
  }
123
123
 
124
124
  // Format: "url_for(<expression>)"
@@ -127,13 +127,13 @@ char* extract_link_to_href(pm_call_node_t* call_node, pm_parser_t* parser, hb_al
127
127
 
128
128
  if (first_argument->type == PM_STRING_NODE || first_argument->type == PM_NIL_NODE) { return NULL; }
129
129
 
130
- size_t source_length = first_argument->location.end - first_argument->location.start;
130
+ size_t source_length = first_argument->location.length;
131
131
 
132
132
  if (is_route_helper_node(first_argument, parser)) {
133
- return hb_allocator_strndup(allocator, (const char*) first_argument->location.start, source_length);
133
+ return hb_allocator_strndup(allocator, (const char*) (source + first_argument->location.start), source_length);
134
134
  }
135
135
 
136
- return wrap_in_url_for((const char*) first_argument->location.start, source_length, allocator);
136
+ return wrap_in_url_for((const char*) (source + first_argument->location.start), source_length, allocator);
137
137
  }
138
138
 
139
139
  if (arguments->arguments.size < 2) { return NULL; }
@@ -146,13 +146,13 @@ char* extract_link_to_href(pm_call_node_t* call_node, pm_parser_t* parser, hb_al
146
146
  return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
147
147
  }
148
148
 
149
- size_t source_length = second_argument->location.end - second_argument->location.start;
149
+ size_t source_length = second_argument->location.length;
150
150
 
151
151
  if (!is_route_helper_node(second_argument, parser)) {
152
- return wrap_in_url_for((const char*) second_argument->location.start, source_length, allocator);
152
+ return wrap_in_url_for((const char*) (source + second_argument->location.start), source_length, allocator);
153
153
  }
154
154
 
155
- return hb_allocator_strndup(allocator, (const char*) second_argument->location.start, source_length);
155
+ return hb_allocator_strndup(allocator, (const char*) (source + second_argument->location.start), source_length);
156
156
  }
157
157
 
158
158
  bool link_to_supports_block(void) {
@@ -59,7 +59,7 @@ size_t get_tag_helper_handlers_count(void) {
59
59
  return handlers_count;
60
60
  }
61
61
 
62
- char* extract_inline_block_content(pm_call_node_t* call_node, hb_allocator_T* allocator) {
62
+ char* extract_inline_block_content(pm_call_node_t* call_node, pm_parser_t* parser, hb_allocator_T* allocator) {
63
63
  if (!call_node || !call_node->block || call_node->block->type != PM_BLOCK_NODE) { return NULL; }
64
64
 
65
65
  pm_block_node_t* block_node = (pm_block_node_t*) call_node->block;
@@ -78,6 +78,10 @@ char* extract_inline_block_content(pm_call_node_t* call_node, hb_allocator_T* al
78
78
  return hb_allocator_strndup(allocator, (const char*) pm_string_source(&string_node->unescaped), length);
79
79
  }
80
80
 
81
- size_t source_length = statement->location.end - statement->location.start;
82
- return hb_allocator_strndup(allocator, (const char*) statement->location.start, source_length);
81
+ const uint8_t* source = pm_parser_start(parser);
82
+ return hb_allocator_strndup(
83
+ allocator,
84
+ (const char*) (source + statement->location.start),
85
+ statement->location.length
86
+ );
83
87
  }
@@ -304,6 +304,7 @@ AST_HTML_ATTRIBUTE_NODE_T* create_html_attribute_with_ruby_literal(
304
304
 
305
305
  static AST_HTML_ATTRIBUTE_VALUE_NODE_T* create_interpolated_attribute_value(
306
306
  pm_interpolated_string_node_t* interpolated_node,
307
+ const uint8_t* source,
307
308
  position_T start_position,
308
309
  position_T end_position,
309
310
  hb_allocator_T* allocator
@@ -338,19 +339,10 @@ static AST_HTML_ATTRIBUTE_VALUE_NODE_T* create_interpolated_attribute_value(
338
339
  }
339
340
  } else if (part->type == PM_EMBEDDED_STATEMENTS_NODE) {
340
341
  pm_embedded_statements_node_t* embedded = (pm_embedded_statements_node_t*) part;
341
- const uint8_t* content_start;
342
- const uint8_t* content_end;
343
-
344
- if (embedded->statements) {
345
- content_start = embedded->statements->base.location.start;
346
- content_end = embedded->statements->base.location.end;
347
- } else {
348
- content_start = part->location.start;
349
- content_end = part->location.end;
350
- }
342
+ pm_location_t content_location = embedded->statements ? embedded->statements->base.location : part->location;
351
343
 
352
- size_t ruby_length = content_end - content_start;
353
- char* ruby_content = hb_allocator_strndup(allocator, (const char*) content_start, ruby_length);
344
+ char* ruby_content =
345
+ hb_allocator_strndup(allocator, (const char*) (source + content_location.start), content_location.length);
354
346
 
355
347
  if (ruby_content) {
356
348
  AST_RUBY_LITERAL_NODE_T* ruby_node = ast_ruby_literal_node_init(
@@ -368,11 +360,14 @@ static AST_HTML_ATTRIBUTE_VALUE_NODE_T* create_interpolated_attribute_value(
368
360
  }
369
361
  }
370
362
 
363
+ token_T* open_quote = create_synthetic_token(allocator, "\"", TOKEN_QUOTE, start_position, start_position);
364
+ token_T* close_quote = create_synthetic_token(allocator, "\"", TOKEN_QUOTE, end_position, end_position);
365
+
371
366
  return ast_html_attribute_value_node_init(
372
- NULL,
367
+ open_quote,
373
368
  value_children,
374
- NULL,
375
- false,
369
+ close_quote,
370
+ true,
376
371
  start_position,
377
372
  end_position,
378
373
  hb_array_init(0, allocator),
@@ -383,6 +378,7 @@ static AST_HTML_ATTRIBUTE_VALUE_NODE_T* create_interpolated_attribute_value(
383
378
  AST_HTML_ATTRIBUTE_NODE_T* create_html_attribute_with_interpolated_value(
384
379
  const char* name_string,
385
380
  pm_interpolated_string_node_t* interpolated_node,
381
+ const uint8_t* source,
386
382
  position_T start_position,
387
383
  position_T end_position,
388
384
  hb_allocator_T* allocator
@@ -393,7 +389,7 @@ AST_HTML_ATTRIBUTE_NODE_T* create_html_attribute_with_interpolated_value(
393
389
  create_attribute_name_node(name_string, start_position, end_position, allocator);
394
390
 
395
391
  AST_HTML_ATTRIBUTE_VALUE_NODE_T* value_node =
396
- create_interpolated_attribute_value(interpolated_node, start_position, end_position, allocator);
392
+ create_interpolated_attribute_value(interpolated_node, source, start_position, end_position, allocator);
397
393
 
398
394
  token_T* equals_token = create_synthetic_token(allocator, "=", TOKEN_EQUALS, start_position, end_position);
399
395