herb 0.10.4 → 0.11.1

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 (789) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +16 -6
  3. data/README.md +36 -119
  4. data/Rakefile +2 -11
  5. data/config/action_view_helpers/actioncable/action_cable_helper/action_cable_meta_tag.yml +12 -8
  6. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy?.yml +9 -6
  7. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy_nonce.yml +9 -6
  8. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_path.yml +20 -12
  9. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_url.yml +30 -18
  10. data/config/action_view_helpers/actionpack/request_forgery_protection/form_authenticity_token.yml +15 -9
  11. data/config/action_view_helpers/actionpack/request_forgery_protection/protect_against_forgery?.yml +9 -6
  12. data/config/action_view_helpers/actiontext/content_helper/render_action_text_content.yml +15 -9
  13. data/config/action_view_helpers/actiontext/content_helper/sanitize_action_text_content.yml +15 -9
  14. data/config/action_view_helpers/actiontext/tag_helper/rich_textarea_tag.yml +34 -22
  15. data/config/action_view_helpers/actionview/active_model_helper/error_message.yml +9 -6
  16. data/config/action_view_helpers/actionview/active_model_helper/error_wrapping.yml +9 -6
  17. data/config/action_view_helpers/actionview/active_model_helper/object.yml +9 -6
  18. data/config/action_view_helpers/actionview/asset_tag_helper/apply_stylesheet_media_default.yml +9 -6
  19. data/config/action_view_helpers/actionview/asset_tag_helper/audio_tag.yml +40 -27
  20. data/config/action_view_helpers/actionview/asset_tag_helper/auto_discovery_link_tag.yml +37 -23
  21. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce.yml +9 -6
  22. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_scripts.yml +9 -6
  23. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_styles.yml +9 -6
  24. data/config/action_view_helpers/actionview/asset_tag_helper/favicon_link_tag.yml +32 -22
  25. data/config/action_view_helpers/actionview/asset_tag_helper/image_decoding.yml +9 -6
  26. data/config/action_view_helpers/actionview/asset_tag_helper/image_loading.yml +9 -6
  27. data/config/action_view_helpers/actionview/asset_tag_helper/image_tag.yml +67 -46
  28. data/config/action_view_helpers/actionview/asset_tag_helper/javascript_include_tag.yml +58 -39
  29. data/config/action_view_helpers/actionview/asset_tag_helper/picture_tag.yml +22 -14
  30. data/config/action_view_helpers/actionview/asset_tag_helper/preload_link_tag.yml +45 -30
  31. data/config/action_view_helpers/actionview/asset_tag_helper/preload_links_header.yml +9 -6
  32. data/config/action_view_helpers/actionview/asset_tag_helper/stylesheet_link_tag.yml +49 -30
  33. data/config/action_view_helpers/actionview/asset_tag_helper/video_tag.yml +53 -35
  34. data/config/action_view_helpers/actionview/asset_url_helper/asset_path.yml +16 -10
  35. data/config/action_view_helpers/actionview/asset_url_helper/asset_url.yml +16 -10
  36. data/config/action_view_helpers/actionview/asset_url_helper/audio_path.yml +16 -10
  37. data/config/action_view_helpers/actionview/asset_url_helper/audio_url.yml +16 -10
  38. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_extname.yml +9 -6
  39. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_host.yml +9 -6
  40. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_path.yml +9 -6
  41. data/config/action_view_helpers/actionview/asset_url_helper/font_path.yml +16 -10
  42. data/config/action_view_helpers/actionview/asset_url_helper/font_url.yml +16 -10
  43. data/config/action_view_helpers/actionview/asset_url_helper/image_path.yml +16 -10
  44. data/config/action_view_helpers/actionview/asset_url_helper/image_url.yml +16 -10
  45. data/config/action_view_helpers/actionview/asset_url_helper/javascript_path.yml +16 -10
  46. data/config/action_view_helpers/actionview/asset_url_helper/javascript_url.yml +16 -10
  47. data/config/action_view_helpers/actionview/asset_url_helper/public_compute_asset_path.yml +9 -6
  48. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_path.yml +16 -10
  49. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_url.yml +16 -10
  50. data/config/action_view_helpers/actionview/asset_url_helper/video_path.yml +16 -10
  51. data/config/action_view_helpers/actionview/asset_url_helper/video_url.yml +16 -10
  52. data/config/action_view_helpers/actionview/atom_feed_helper/atom_feed.yml +52 -27
  53. data/config/action_view_helpers/actionview/cache_helper/cache.yml +25 -15
  54. data/config/action_view_helpers/actionview/cache_helper/cache_fragment_name.yml +9 -6
  55. data/config/action_view_helpers/actionview/cache_helper/cache_if.yml +20 -12
  56. data/config/action_view_helpers/actionview/cache_helper/cache_unless.yml +20 -12
  57. data/config/action_view_helpers/actionview/cache_helper/caching_predicate.yml +9 -6
  58. data/config/action_view_helpers/actionview/cache_helper/digest_path_from_template.yml +9 -6
  59. data/config/action_view_helpers/actionview/cache_helper/fragment_for.yml +9 -6
  60. data/config/action_view_helpers/actionview/cache_helper/fragment_name_with_digest.yml +9 -6
  61. data/config/action_view_helpers/actionview/cache_helper/read_fragment_for.yml +9 -6
  62. data/config/action_view_helpers/actionview/cache_helper/uncacheable.yml +9 -6
  63. data/config/action_view_helpers/actionview/cache_helper/write_fragment_for.yml +9 -6
  64. data/config/action_view_helpers/actionview/capture_helper/capture.yml +9 -6
  65. data/config/action_view_helpers/actionview/capture_helper/content_for.yml +20 -12
  66. data/config/action_view_helpers/actionview/capture_helper/content_for_predicate.yml +15 -9
  67. data/config/action_view_helpers/actionview/capture_helper/provide.yml +15 -9
  68. data/config/action_view_helpers/actionview/capture_helper/with_output_buffer.yml +9 -6
  69. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prepend_content_exfiltration_prevention.yml +9 -6
  70. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prevent_content_exfiltration.yml +9 -6
  71. data/config/action_view_helpers/actionview/controller_helper/action_name.yml +9 -6
  72. data/config/action_view_helpers/actionview/controller_helper/assign_controller.yml +9 -6
  73. data/config/action_view_helpers/actionview/controller_helper/controller.yml +9 -6
  74. data/config/action_view_helpers/actionview/controller_helper/controller_name.yml +9 -6
  75. data/config/action_view_helpers/actionview/controller_helper/controller_path.yml +9 -6
  76. data/config/action_view_helpers/actionview/controller_helper/cookies.yml +9 -6
  77. data/config/action_view_helpers/actionview/controller_helper/flash.yml +9 -6
  78. data/config/action_view_helpers/actionview/controller_helper/headers.yml +9 -6
  79. data/config/action_view_helpers/actionview/controller_helper/logger.yml +9 -6
  80. data/config/action_view_helpers/actionview/controller_helper/params.yml +9 -6
  81. data/config/action_view_helpers/actionview/controller_helper/request.yml +9 -6
  82. data/config/action_view_helpers/actionview/controller_helper/request_forgery_protection_token.yml +9 -6
  83. data/config/action_view_helpers/actionview/controller_helper/response.yml +9 -6
  84. data/config/action_view_helpers/actionview/controller_helper/session.yml +9 -6
  85. data/config/action_view_helpers/actionview/csp_helper/csp_meta_tag.yml +18 -11
  86. data/config/action_view_helpers/actionview/csrf_helper/csrf_meta_tags.yml +16 -10
  87. data/config/action_view_helpers/actionview/date_helper/date_select.yml +85 -51
  88. data/config/action_view_helpers/actionview/date_helper/datetime_select.yml +65 -39
  89. data/config/action_view_helpers/actionview/date_helper/distance_of_time_in_words.yml +30 -18
  90. data/config/action_view_helpers/actionview/date_helper/relative_time_in_words.yml +35 -21
  91. data/config/action_view_helpers/actionview/date_helper/select_date.yml +50 -30
  92. data/config/action_view_helpers/actionview/date_helper/select_datetime.yml +65 -39
  93. data/config/action_view_helpers/actionview/date_helper/select_day.yml +40 -24
  94. data/config/action_view_helpers/actionview/date_helper/select_hour.yml +50 -30
  95. data/config/action_view_helpers/actionview/date_helper/select_minute.yml +40 -24
  96. data/config/action_view_helpers/actionview/date_helper/select_month.yml +60 -36
  97. data/config/action_view_helpers/actionview/date_helper/select_second.yml +35 -21
  98. data/config/action_view_helpers/actionview/date_helper/select_time.yml +55 -33
  99. data/config/action_view_helpers/actionview/date_helper/select_year.yml +45 -27
  100. data/config/action_view_helpers/actionview/date_helper/time_ago_in_words.yml +21 -13
  101. data/config/action_view_helpers/actionview/date_helper/time_select.yml +60 -36
  102. data/config/action_view_helpers/actionview/date_helper/time_tag.yml +32 -20
  103. data/config/action_view_helpers/actionview/debug_helper/debug.yml +15 -9
  104. data/config/action_view_helpers/actionview/form_builder/button.yml +60 -0
  105. data/config/action_view_helpers/actionview/form_builder/submit.yml +48 -0
  106. data/config/action_view_helpers/actionview/form_helper/apply_form_for_options.yml +9 -6
  107. data/config/action_view_helpers/actionview/form_helper/checkbox.yml +41 -25
  108. data/config/action_view_helpers/actionview/form_helper/color_field.yml +25 -15
  109. data/config/action_view_helpers/actionview/form_helper/date_field.yml +35 -21
  110. data/config/action_view_helpers/actionview/form_helper/datetime_field.yml +41 -25
  111. data/config/action_view_helpers/actionview/form_helper/email_field.yml +25 -15
  112. data/config/action_view_helpers/actionview/form_helper/emitted_hidden_id.yml +9 -6
  113. data/config/action_view_helpers/actionview/form_helper/fields.yml +37 -18
  114. data/config/action_view_helpers/actionview/form_helper/fields_for.yml +33 -15
  115. data/config/action_view_helpers/actionview/form_helper/file_field.yml +45 -27
  116. data/config/action_view_helpers/actionview/form_helper/form_for.yml +45 -24
  117. data/config/action_view_helpers/actionview/form_helper/form_with.yml +56 -30
  118. data/config/action_view_helpers/actionview/form_helper/form_with_generates_ids.yml +9 -6
  119. data/config/action_view_helpers/actionview/form_helper/form_with_generates_remote_forms.yml +9 -6
  120. data/config/action_view_helpers/actionview/form_helper/hidden_field.yml +25 -15
  121. data/config/action_view_helpers/actionview/form_helper/label.yml +52 -27
  122. data/config/action_view_helpers/actionview/form_helper/month_field.yml +25 -15
  123. data/config/action_view_helpers/actionview/form_helper/multipart.yml +9 -6
  124. data/config/action_view_helpers/actionview/form_helper/multiple_file_field_include_hidden.yml +9 -6
  125. data/config/action_view_helpers/actionview/form_helper/number_field.yml +45 -27
  126. data/config/action_view_helpers/actionview/form_helper/password_field.yml +25 -15
  127. data/config/action_view_helpers/actionview/form_helper/radio_button.yml +30 -18
  128. data/config/action_view_helpers/actionview/form_helper/range_field.yml +45 -27
  129. data/config/action_view_helpers/actionview/form_helper/search_field.yml +25 -15
  130. data/config/action_view_helpers/actionview/form_helper/telephone_field.yml +26 -16
  131. data/config/action_view_helpers/actionview/form_helper/text_field.yml +25 -15
  132. data/config/action_view_helpers/actionview/form_helper/textarea.yml +31 -19
  133. data/config/action_view_helpers/actionview/form_helper/time_field.yml +40 -24
  134. data/config/action_view_helpers/actionview/form_helper/url_field.yml +25 -15
  135. data/config/action_view_helpers/actionview/form_helper/week_field.yml +25 -15
  136. data/config/action_view_helpers/actionview/form_options_helper/collection_checkboxes.yml +58 -31
  137. data/config/action_view_helpers/actionview/form_options_helper/collection_radio_buttons.yml +57 -30
  138. data/config/action_view_helpers/actionview/form_options_helper/collection_select.yml +65 -39
  139. data/config/action_view_helpers/actionview/form_options_helper/grouped_collection_select.yml +65 -39
  140. data/config/action_view_helpers/actionview/form_options_helper/grouped_options_for_select.yml +35 -21
  141. data/config/action_view_helpers/actionview/form_options_helper/option_groups_from_collection_for_select.yml +40 -24
  142. data/config/action_view_helpers/actionview/form_options_helper/options_for_select.yml +20 -12
  143. data/config/action_view_helpers/actionview/form_options_helper/options_from_collection_for_select.yml +30 -18
  144. data/config/action_view_helpers/actionview/form_options_helper/select.yml +60 -36
  145. data/config/action_view_helpers/actionview/form_options_helper/time_zone_options_for_select.yml +25 -15
  146. data/config/action_view_helpers/actionview/form_options_helper/time_zone_select.yml +50 -30
  147. data/config/action_view_helpers/actionview/form_options_helper/weekday_options_for_select.yml +30 -18
  148. data/config/action_view_helpers/actionview/form_options_helper/weekday_select.yml +30 -18
  149. data/config/action_view_helpers/actionview/form_tag_helper/button_tag.yml +39 -21
  150. data/config/action_view_helpers/actionview/form_tag_helper/checkbox_tag.yml +33 -21
  151. data/config/action_view_helpers/actionview/form_tag_helper/color_field_tag.yml +26 -17
  152. data/config/action_view_helpers/actionview/form_tag_helper/date_field_tag.yml +27 -17
  153. data/config/action_view_helpers/actionview/form_tag_helper/datetime_field_tag.yml +28 -18
  154. data/config/action_view_helpers/actionview/form_tag_helper/default_enforce_utf8.yml +9 -6
  155. data/config/action_view_helpers/actionview/form_tag_helper/email_field_tag.yml +27 -17
  156. data/config/action_view_helpers/actionview/form_tag_helper/embed_authenticity_token_in_remote_forms.yml +9 -6
  157. data/config/action_view_helpers/actionview/form_tag_helper/field_id.yml +30 -18
  158. data/config/action_view_helpers/actionview/form_tag_helper/field_name.yml +30 -18
  159. data/config/action_view_helpers/actionview/form_tag_helper/field_set_tag.yml +23 -15
  160. data/config/action_view_helpers/actionview/form_tag_helper/file_field_tag.yml +35 -22
  161. data/config/action_view_helpers/actionview/form_tag_helper/form_tag.yml +38 -24
  162. data/config/action_view_helpers/actionview/form_tag_helper/hidden_field_tag.yml +27 -17
  163. data/config/action_view_helpers/actionview/form_tag_helper/image_submit_tag.yml +31 -21
  164. data/config/action_view_helpers/actionview/form_tag_helper/label_tag.yml +33 -17
  165. data/config/action_view_helpers/actionview/form_tag_helper/month_field_tag.yml +27 -17
  166. data/config/action_view_helpers/actionview/form_tag_helper/number_field_tag.yml +47 -29
  167. data/config/action_view_helpers/actionview/form_tag_helper/password_field_tag.yml +27 -17
  168. data/config/action_view_helpers/actionview/form_tag_helper/radio_button_tag.yml +32 -20
  169. data/config/action_view_helpers/actionview/form_tag_helper/range_field_tag.yml +47 -29
  170. data/config/action_view_helpers/actionview/form_tag_helper/search_field_tag.yml +27 -17
  171. data/config/action_view_helpers/actionview/form_tag_helper/select_tag.yml +47 -29
  172. data/config/action_view_helpers/actionview/form_tag_helper/submit_tag.yml +33 -21
  173. data/config/action_view_helpers/actionview/form_tag_helper/telephone_field_tag.yml +28 -18
  174. data/config/action_view_helpers/actionview/form_tag_helper/text_field_tag.yml +27 -17
  175. data/config/action_view_helpers/actionview/form_tag_helper/textarea_tag.yml +31 -20
  176. data/config/action_view_helpers/actionview/form_tag_helper/time_field_tag.yml +27 -17
  177. data/config/action_view_helpers/actionview/form_tag_helper/url_field_tag.yml +27 -17
  178. data/config/action_view_helpers/actionview/form_tag_helper/utf8_enforcer_tag.yml +9 -6
  179. data/config/action_view_helpers/actionview/form_tag_helper/week_field_tag.yml +28 -18
  180. data/config/action_view_helpers/actionview/javascript_helper/escape_javascript.yml +16 -10
  181. data/config/action_view_helpers/actionview/javascript_helper/javascript_cdata_section.yml +9 -6
  182. data/config/action_view_helpers/actionview/javascript_helper/javascript_tag.yml +41 -27
  183. data/config/action_view_helpers/actionview/number_helper/number_to_currency.yml +29 -18
  184. data/config/action_view_helpers/actionview/number_helper/number_to_human.yml +25 -15
  185. data/config/action_view_helpers/actionview/number_helper/number_to_human_size.yml +20 -12
  186. data/config/action_view_helpers/actionview/number_helper/number_to_percentage.yml +20 -12
  187. data/config/action_view_helpers/actionview/number_helper/number_to_phone.yml +33 -20
  188. data/config/action_view_helpers/actionview/number_helper/number_with_delimiter.yml +21 -13
  189. data/config/action_view_helpers/actionview/number_helper/number_with_precision.yml +25 -15
  190. data/config/action_view_helpers/actionview/output_safety_helper/raw.yml +15 -9
  191. data/config/action_view_helpers/actionview/output_safety_helper/safe_join.yml +20 -12
  192. data/config/action_view_helpers/actionview/output_safety_helper/to_sentence.yml +24 -15
  193. data/config/action_view_helpers/actionview/record_identifier/dom_class.yml +20 -12
  194. data/config/action_view_helpers/actionview/record_identifier/dom_id.yml +20 -12
  195. data/config/action_view_helpers/actionview/record_identifier/dom_target.yml +15 -9
  196. data/config/action_view_helpers/actionview/record_identifier/model_name_from_record_or_class.yml +9 -6
  197. data/config/action_view_helpers/actionview/rendering_helper/render.yml +108 -22
  198. data/config/action_view_helpers/actionview/sanitize_helper/sanitize.yml +25 -15
  199. data/config/action_view_helpers/actionview/sanitize_helper/sanitize_css.yml +15 -9
  200. data/config/action_view_helpers/actionview/sanitize_helper/sanitizer_vendor.yml +9 -6
  201. data/config/action_view_helpers/actionview/sanitize_helper/strip_links.yml +15 -9
  202. data/config/action_view_helpers/actionview/sanitize_helper/strip_tags.yml +15 -9
  203. data/config/action_view_helpers/actionview/tag_helper/cdata_section.yml +15 -9
  204. data/config/action_view_helpers/actionview/tag_helper/content_tag.yml +59 -38
  205. data/config/action_view_helpers/actionview/tag_helper/escape_once.yml +15 -9
  206. data/config/action_view_helpers/actionview/tag_helper/tag.yml +54 -31
  207. data/config/action_view_helpers/actionview/tag_helper/token_list.yml +16 -10
  208. data/config/action_view_helpers/actionview/text_helper/concat.yml +15 -9
  209. data/config/action_view_helpers/actionview/text_helper/current_cycle.yml +15 -9
  210. data/config/action_view_helpers/actionview/text_helper/cycle.yml +23 -14
  211. data/config/action_view_helpers/actionview/text_helper/excerpt.yml +33 -20
  212. data/config/action_view_helpers/actionview/text_helper/highlight.yml +37 -18
  213. data/config/action_view_helpers/actionview/text_helper/pluralize.yml +30 -18
  214. data/config/action_view_helpers/actionview/text_helper/reset_cycle.yml +15 -9
  215. data/config/action_view_helpers/actionview/text_helper/safe_concat.yml +9 -6
  216. data/config/action_view_helpers/actionview/text_helper/simple_format.yml +33 -20
  217. data/config/action_view_helpers/actionview/text_helper/truncate.yml +38 -23
  218. data/config/action_view_helpers/actionview/text_helper/word_wrap.yml +25 -15
  219. data/config/action_view_helpers/actionview/translation_helper/debug_missing_translation.yml +9 -6
  220. data/config/action_view_helpers/actionview/translation_helper/localize.yml +26 -16
  221. data/config/action_view_helpers/actionview/translation_helper/translate.yml +31 -19
  222. data/config/action_view_helpers/actionview/url_helper/button_to.yml +57 -33
  223. data/config/action_view_helpers/actionview/url_helper/button_to_generates_button_tag.yml +9 -6
  224. data/config/action_view_helpers/actionview/url_helper/current_page?.yml +25 -15
  225. data/config/action_view_helpers/actionview/url_helper/link_to.yml +76 -53
  226. data/config/action_view_helpers/actionview/url_helper/link_to_if.yml +54 -20
  227. data/config/action_view_helpers/actionview/url_helper/link_to_unless.yml +54 -20
  228. data/config/action_view_helpers/actionview/url_helper/link_to_unless_current.yml +49 -17
  229. data/config/action_view_helpers/actionview/url_helper/mail_to.yml +60 -34
  230. data/config/action_view_helpers/actionview/url_helper/phone_to.yml +40 -22
  231. data/config/action_view_helpers/actionview/url_helper/sms_to.yml +45 -25
  232. data/config/action_view_helpers/actionview/url_helper/url_for.yml +15 -9
  233. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_import_module_tag.yml +32 -0
  234. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_module_preload_tags.yml +39 -0
  235. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_tags.yml +35 -0
  236. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_inline_importmap_tag.yml +32 -0
  237. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_module_preload_tag.yml +35 -0
  238. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache.yml +9 -6
  239. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache_tag.yml +12 -8
  240. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview.yml +9 -6
  241. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview_tag.yml +12 -8
  242. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload.yml +9 -6
  243. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload_tag.yml +12 -8
  244. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_method_tag.yml +17 -11
  245. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_scroll_tag.yml +17 -11
  246. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refreshes_with.yml +20 -12
  247. data/config/action_view_helpers/turbo-rails/frames_helper/turbo_frame_tag.yml +54 -33
  248. data/config/action_view_helpers/turbo-rails/includes_helper/turbo_include_tags.yml +9 -6
  249. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_action_tag.yml +32 -20
  250. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_refresh_tag.yml +18 -11
  251. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream.yml +9 -6
  252. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream_from.yml +28 -18
  253. data/config/html_elements.yml +597 -0
  254. data/config/options.yml +1 -0
  255. data/config/slots/components.yml +52 -0
  256. data/config/state/kind.yml +61 -0
  257. data/config/state/operators.yml +27 -0
  258. data/config/state/predicates.yml +39 -0
  259. data/config/state/transforms.yml +18 -0
  260. data/config/view_context_methods/actionview/base/annotate_rendered_view_with_filenames.yml +4 -4
  261. data/config/view_context_methods/actionview/base/assign.yml +4 -4
  262. data/config/view_context_methods/actionview/base/assigns.yml +4 -4
  263. data/config/view_context_methods/actionview/base/automatically_disable_submit_tag.yml +4 -4
  264. data/config/view_context_methods/actionview/base/compiled_method_container.yml +4 -4
  265. data/config/view_context_methods/actionview/base/config.yml +4 -4
  266. data/config/view_context_methods/actionview/base/default_form_builder.yml +4 -4
  267. data/config/view_context_methods/actionview/base/default_formats.yml +4 -4
  268. data/config/view_context_methods/actionview/base/field_error_proc.yml +4 -4
  269. data/config/view_context_methods/actionview/base/formats.yml +4 -4
  270. data/config/view_context_methods/actionview/base/in_rendering_context.yml +4 -4
  271. data/config/view_context_methods/actionview/base/locale.yml +4 -4
  272. data/config/view_context_methods/actionview/base/lookup_context.yml +4 -4
  273. data/config/view_context_methods/actionview/base/output_buffer.yml +4 -4
  274. data/config/view_context_methods/actionview/base/prefix_partial_path_with_controller_namespace.yml +4 -4
  275. data/config/view_context_methods/actionview/base/remove_hidden_field_autocomplete.yml +4 -4
  276. data/config/view_context_methods/actionview/base/streaming_completion_on_exception.yml +4 -4
  277. data/config/view_context_methods/actionview/base/view_flow.yml +4 -4
  278. data/config/view_context_methods/actionview/base/view_paths.yml +4 -4
  279. data/config/view_context_methods/actionview/base/view_renderer.yml +4 -4
  280. data/config/view_context_methods/actionview/template/local_assigns.yml +4 -4
  281. data/config/view_context_methods/activemodel/conversion/convert_to_model.yml +4 -4
  282. data/config/view_context_methods/activesupport/benchmarkable/benchmark.yml +4 -4
  283. data/config.yml +1243 -790
  284. data/exe/herb +2 -0
  285. data/ext/herb/error_helpers.c +355 -17
  286. data/ext/herb/error_helpers.h +1 -1
  287. data/ext/herb/extconf.rb +4 -2
  288. data/ext/herb/extension.c +137 -89
  289. data/ext/herb/extension_helpers.c +81 -42
  290. data/ext/herb/extension_helpers.h +4 -1
  291. data/ext/herb/nodes.c +859 -374
  292. data/ext/herb/nodes.h +3 -2
  293. data/ext/herb/parser_options_helpers.c +151 -0
  294. data/ext/herb/parser_options_helpers.h +14 -0
  295. data/herb.gemspec +2 -2
  296. data/lib/herb/action_view/helper_registry.rb +1358 -62
  297. data/lib/herb/analysis/partial_declaration.rb +140 -0
  298. data/lib/herb/analysis/partial_index.rb +189 -0
  299. data/lib/herb/analysis/partial_resolution.rb +161 -0
  300. data/lib/herb/analysis/partial_resolver.rb +144 -0
  301. data/lib/herb/analysis/project_index.rb +152 -0
  302. data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
  303. data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
  304. data/lib/herb/analysis/render_graph/builder.rb +376 -0
  305. data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
  306. data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
  307. data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
  308. data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
  309. data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
  310. data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
  311. data/lib/herb/analysis/render_graph.rb +285 -0
  312. data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
  313. data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
  314. data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
  315. data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
  316. data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
  317. data/lib/herb/analysis/ruby_locals_index.rb +165 -0
  318. data/lib/herb/analysis/ruby_reference.rb +67 -0
  319. data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
  320. data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
  321. data/lib/herb/analysis/template_dependencies.rb +562 -0
  322. data/lib/herb/ast/erb_render_node.rb +26 -94
  323. data/lib/herb/ast/helpers.rb +90 -10
  324. data/lib/herb/ast/herb_directive_node.rb +18 -0
  325. data/lib/herb/ast/node.rb +32 -2
  326. data/lib/herb/ast/nodes.rb +1368 -105
  327. data/lib/herb/backend.rb +73 -0
  328. data/lib/herb/bootstrap.rb +8 -8
  329. data/lib/herb/cli.rb +550 -32
  330. data/lib/herb/colors.rb +14 -0
  331. data/lib/herb/configuration.rb +71 -35
  332. data/lib/herb/defaults.yml +2 -1
  333. data/lib/herb/dev/assets.rb +57 -0
  334. data/lib/herb/dev/classifier.rb +84 -0
  335. data/lib/herb/dev/embedded.rb +27 -0
  336. data/lib/herb/dev/pipeline.rb +305 -0
  337. data/lib/herb/dev/protocol.rb +221 -0
  338. data/lib/herb/dev/runner.rb +180 -175
  339. data/lib/herb/dev/server.rb +89 -26
  340. data/lib/herb/dev/server_entry.rb +41 -6
  341. data/lib/herb/dev/watcher.rb +181 -0
  342. data/lib/herb/dev.rb +163 -0
  343. data/lib/herb/diagnostic/formatter.rb +88 -0
  344. data/lib/herb/diagnostic.rb +172 -0
  345. data/lib/herb/diff/operation.rb +36 -0
  346. data/lib/herb/diff/result.rb +62 -0
  347. data/lib/herb/diff.rb +10 -0
  348. data/lib/herb/engine/collector.rb +62 -0
  349. data/lib/herb/engine/compiler.rb +387 -113
  350. data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
  351. data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
  352. data/lib/herb/engine/component_tags/resolver.rb +32 -0
  353. data/lib/herb/engine/component_tags/visitor.rb +231 -0
  354. data/lib/herb/engine/css_inliner/inliner.rb +101 -0
  355. data/lib/herb/engine/css_inliner/visitor.rb +174 -0
  356. data/lib/herb/engine/errors.rb +122 -0
  357. data/lib/herb/engine/helpers.rb +82 -0
  358. data/lib/herb/engine/inline_render/inliner.rb +122 -0
  359. data/lib/herb/engine/inline_render/visitor.rb +267 -0
  360. data/lib/herb/engine/runtime/entry.rb +62 -0
  361. data/lib/herb/engine/runtime/error_page.rb +362 -0
  362. data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
  363. data/lib/herb/engine/runtime/journal/summary.rb +227 -0
  364. data/lib/herb/engine/runtime/journal.rb +379 -0
  365. data/lib/herb/engine/runtime/middleware.rb +212 -0
  366. data/lib/herb/engine/runtime/observations.rb +73 -0
  367. data/lib/herb/engine/runtime/report.rb +204 -0
  368. data/lib/herb/engine/runtime/session.rb +437 -0
  369. data/lib/herb/engine/runtime.rb +21 -0
  370. data/lib/herb/engine/scoped_style/channel.rb +66 -0
  371. data/lib/herb/engine/scoped_style/collector.rb +74 -0
  372. data/lib/herb/engine/scoped_style/visitor.rb +533 -0
  373. data/lib/herb/engine/slots/annotation.rb +98 -0
  374. data/lib/herb/engine/slots/bindings.rb +61 -0
  375. data/lib/herb/engine/slots/callee.rb +118 -0
  376. data/lib/herb/engine/slots/component_definitions.rb +67 -0
  377. data/lib/herb/engine/slots/components/async.rb +24 -0
  378. data/lib/herb/engine/slots/components/base.rb +132 -0
  379. data/lib/herb/engine/slots/components/deferred.rb +81 -0
  380. data/lib/herb/engine/slots/components/fallback.rb +27 -0
  381. data/lib/herb/engine/slots/components/fragment.rb +99 -0
  382. data/lib/herb/engine/slots/components/lazy.rb +24 -0
  383. data/lib/herb/engine/slots/components.rb +52 -0
  384. data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
  385. data/lib/herb/engine/slots/dependencies.rb +269 -0
  386. data/lib/herb/engine/slots/dynamics_compiler.rb +864 -0
  387. data/lib/herb/engine/slots/identifier.rb +35 -0
  388. data/lib/herb/engine/slots/manifest/channel.rb +74 -0
  389. data/lib/herb/engine/slots/manifest/collector.rb +75 -0
  390. data/lib/herb/engine/slots/markers.rb +152 -0
  391. data/lib/herb/engine/slots/render_bindings.rb +141 -0
  392. data/lib/herb/engine/slots/schema_compiler.rb +94 -0
  393. data/lib/herb/engine/slots/state_anchor.rb +94 -0
  394. data/lib/herb/engine/slots/state_compiler.rb +1325 -0
  395. data/lib/herb/engine/slots/state_directives.rb +854 -0
  396. data/lib/herb/engine/slots/state_kinds.rb +54 -0
  397. data/lib/herb/engine/slots/state_operators.rb +36 -0
  398. data/lib/herb/engine/slots/state_overrides.rb +79 -0
  399. data/lib/herb/engine/slots/state_predicates.rb +65 -0
  400. data/lib/herb/engine/slots/state_transforms.rb +42 -0
  401. data/lib/herb/engine/slots/statics.rb +185 -0
  402. data/lib/herb/engine/slots/subtree.rb +82 -0
  403. data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
  404. data/lib/herb/engine/slots/types.rb +42 -0
  405. data/lib/herb/engine/slots/visitor.rb +2267 -0
  406. data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
  407. data/lib/herb/engine/validators/base.rb +36 -0
  408. data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
  409. data/lib/herb/engine/validators/nesting_validator.rb +3 -3
  410. data/lib/herb/engine/validators/render_validator.rb +13 -33
  411. data/lib/herb/engine/validators/security_validator.rb +3 -17
  412. data/lib/herb/engine/validators.rb +43 -0
  413. data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
  414. data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
  415. data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
  416. data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
  417. data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
  418. data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
  419. data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
  420. data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
  421. data/lib/herb/engine.rb +218 -259
  422. data/lib/herb/ensure_installed.rb +43 -0
  423. data/lib/herb/errors.rb +646 -157
  424. data/lib/herb/fingerprint.rb +82 -0
  425. data/lib/herb/html/elements.rb +18 -0
  426. data/lib/herb/html/util.rb +21 -2
  427. data/lib/herb/lex_result.rb +0 -10
  428. data/lib/herb/locate.rb +163 -0
  429. data/lib/herb/location.rb +20 -0
  430. data/lib/herb/parse_result.rb +17 -11
  431. data/lib/herb/parser_options.rb +65 -46
  432. data/lib/herb/position.rb +19 -0
  433. data/lib/herb/prism_inspect.rb +1 -4
  434. data/lib/herb/project.rb +28 -15
  435. data/lib/herb/range.rb +5 -0
  436. data/lib/herb/result.rb +2 -2
  437. data/lib/herb/ruby_program.rb +110 -0
  438. data/lib/herb/source_path.rb +232 -0
  439. data/lib/herb/token.rb +14 -3
  440. data/lib/herb/version.rb +1 -1
  441. data/lib/herb/visitor/context/origin.rb +52 -0
  442. data/lib/herb/visitor/context/replacements.rb +59 -0
  443. data/lib/herb/visitor/context.rb +169 -0
  444. data/lib/herb/visitor/context_aware.rb +45 -0
  445. data/lib/herb/visitor/diagnostics.rb +148 -0
  446. data/lib/herb/visitor/experimental.rb +33 -0
  447. data/lib/herb/visitor/parser_option_requirements.rb +151 -0
  448. data/lib/herb/visitor/stack.rb +192 -0
  449. data/lib/herb/visitor.rb +47 -1
  450. data/lib/herb/warnings.rb +25 -0
  451. data/lib/herb.rb +74 -63
  452. data/sig/herb/action_view/helper_registry.rbs +82 -10
  453. data/sig/herb/analysis/partial_declaration.rbs +80 -0
  454. data/sig/herb/analysis/partial_index.rbs +66 -0
  455. data/sig/herb/analysis/partial_resolution.rbs +57 -0
  456. data/sig/herb/analysis/partial_resolver.rbs +76 -0
  457. data/sig/herb/analysis/project_index.rbs +57 -0
  458. data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
  459. data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
  460. data/sig/herb/analysis/render_graph/builder.rbs +180 -0
  461. data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
  462. data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
  463. data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
  464. data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
  465. data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
  466. data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
  467. data/sig/herb/analysis/render_graph.rbs +83 -0
  468. data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
  469. data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
  470. data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
  471. data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
  472. data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
  473. data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
  474. data/sig/herb/analysis/ruby_reference.rbs +28 -0
  475. data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
  476. data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
  477. data/sig/herb/analysis/template_dependencies.rbs +125 -0
  478. data/sig/herb/ast/erb_render_node.rbs +10 -2
  479. data/sig/herb/ast/helpers.rbs +31 -1
  480. data/sig/herb/ast/herb_directive_node.rbs +13 -0
  481. data/sig/herb/ast/node.rbs +9 -0
  482. data/sig/herb/ast/nodes.rbs +668 -89
  483. data/sig/herb/backend.rbs +52 -0
  484. data/sig/herb/bootstrap.rbs +2 -0
  485. data/sig/herb/colors.rbs +3 -0
  486. data/sig/herb/configuration.rbs +27 -3
  487. data/sig/herb/dev/assets.rbs +27 -0
  488. data/sig/herb/dev/classifier.rbs +57 -0
  489. data/sig/herb/dev/embedded.rbs +21 -0
  490. data/sig/herb/dev/pipeline.rbs +118 -0
  491. data/sig/herb/dev/protocol.rbs +78 -0
  492. data/sig/herb/dev/runner.rbs +64 -23
  493. data/sig/herb/dev/server.rbs +49 -22
  494. data/sig/herb/dev/server_entry.rbs +46 -21
  495. data/sig/herb/dev/watcher.rbs +84 -0
  496. data/sig/herb/dev.rbs +58 -0
  497. data/sig/herb/diagnostic/formatter.rbs +28 -0
  498. data/sig/herb/diagnostic.rbs +88 -0
  499. data/sig/herb/diff/operation.rbs +36 -0
  500. data/sig/herb/diff/result.rbs +36 -0
  501. data/sig/herb/diff.rbs +6 -0
  502. data/sig/herb/engine/collector.rbs +48 -0
  503. data/sig/herb/engine/compiler.rbs +74 -24
  504. data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
  505. data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
  506. data/sig/herb/engine/component_tags/resolver.rbs +25 -0
  507. data/sig/herb/engine/component_tags/visitor.rbs +69 -0
  508. data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
  509. data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
  510. data/sig/herb/engine/errors.rbs +68 -0
  511. data/sig/herb/engine/helpers.rbs +28 -0
  512. data/sig/herb/engine/inline_render/inliner.rbs +39 -0
  513. data/sig/herb/engine/inline_render/visitor.rbs +104 -0
  514. data/sig/herb/engine/runtime/entry.rbs +43 -0
  515. data/sig/herb/engine/runtime/error_page.rbs +115 -0
  516. data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
  517. data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
  518. data/sig/herb/engine/runtime/journal.rbs +126 -0
  519. data/sig/herb/engine/runtime/middleware.rbs +96 -0
  520. data/sig/herb/engine/runtime/observations.rbs +38 -0
  521. data/sig/herb/engine/runtime/report.rbs +97 -0
  522. data/sig/herb/engine/runtime/session.rbs +233 -0
  523. data/sig/herb/engine/runtime.rbs +14 -0
  524. data/sig/herb/engine/scoped_style/channel.rbs +45 -0
  525. data/sig/herb/engine/scoped_style/collector.rbs +45 -0
  526. data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
  527. data/sig/herb/engine/slots/annotation.rbs +72 -0
  528. data/sig/herb/engine/slots/bindings.rbs +34 -0
  529. data/sig/herb/engine/slots/callee.rbs +62 -0
  530. data/sig/herb/engine/slots/component_definitions.rbs +19 -0
  531. data/sig/herb/engine/slots/components/async.rbs +20 -0
  532. data/sig/herb/engine/slots/components/base.rbs +60 -0
  533. data/sig/herb/engine/slots/components/deferred.rbs +29 -0
  534. data/sig/herb/engine/slots/components/fallback.rbs +21 -0
  535. data/sig/herb/engine/slots/components/fragment.rbs +34 -0
  536. data/sig/herb/engine/slots/components/lazy.rbs +20 -0
  537. data/sig/herb/engine/slots/components.rbs +30 -0
  538. data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
  539. data/sig/herb/engine/slots/dependencies.rbs +94 -0
  540. data/sig/herb/engine/slots/dynamics_compiler.rbs +352 -0
  541. data/sig/herb/engine/slots/identifier.rbs +19 -0
  542. data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
  543. data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
  544. data/sig/herb/engine/slots/markers.rbs +99 -0
  545. data/sig/herb/engine/slots/render_bindings.rbs +69 -0
  546. data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
  547. data/sig/herb/engine/slots/state_anchor.rbs +41 -0
  548. data/sig/herb/engine/slots/state_compiler.rbs +258 -0
  549. data/sig/herb/engine/slots/state_directives.rbs +278 -0
  550. data/sig/herb/engine/slots/state_kinds.rbs +24 -0
  551. data/sig/herb/engine/slots/state_operators.rbs +19 -0
  552. data/sig/herb/engine/slots/state_overrides.rbs +33 -0
  553. data/sig/herb/engine/slots/state_predicates.rbs +16 -0
  554. data/sig/herb/engine/slots/state_transforms.rbs +15 -0
  555. data/sig/herb/engine/slots/statics.rbs +67 -0
  556. data/sig/herb/engine/slots/subtree.rbs +49 -0
  557. data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
  558. data/sig/herb/engine/slots/types.rbs +46 -0
  559. data/sig/herb/engine/slots/visitor.rbs +603 -0
  560. data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
  561. data/sig/herb/engine/validators/base.rbs +28 -0
  562. data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
  563. data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
  564. data/sig/herb/engine/validators/render_validator.rbs +2 -6
  565. data/sig/herb/engine/validators/security_validator.rbs +1 -3
  566. data/sig/herb/engine/validators.rbs +21 -0
  567. data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
  568. data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
  569. data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
  570. data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
  571. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
  572. data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
  573. data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
  574. data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
  575. data/sig/herb/engine.rbs +47 -41
  576. data/sig/herb/ensure_installed.rbs +9 -0
  577. data/sig/herb/errors.rbs +293 -0
  578. data/sig/herb/fingerprint.rbs +37 -0
  579. data/sig/herb/html/elements.rbs +19 -0
  580. data/sig/herb/html/util.rbs +15 -1
  581. data/sig/herb/lex_result.rbs +0 -6
  582. data/sig/herb/locate.rbs +89 -0
  583. data/sig/herb/location.rbs +12 -0
  584. data/sig/herb/parse_result.rbs +10 -8
  585. data/sig/herb/parser_options.rbs +47 -21
  586. data/sig/herb/position.rbs +11 -0
  587. data/sig/herb/range.rbs +3 -0
  588. data/sig/herb/ruby_program.rbs +51 -0
  589. data/sig/herb/source_path.rbs +132 -0
  590. data/sig/herb/token.rbs +5 -2
  591. data/sig/herb/visitor/context/origin.rbs +51 -0
  592. data/sig/herb/visitor/context/replacements.rbs +39 -0
  593. data/sig/herb/visitor/context.rbs +83 -0
  594. data/sig/herb/visitor/context_aware.rbs +32 -0
  595. data/sig/herb/visitor/diagnostics.rbs +82 -0
  596. data/sig/herb/visitor/experimental.rbs +23 -0
  597. data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
  598. data/sig/herb/visitor/stack.rbs +91 -0
  599. data/sig/herb/visitor.rbs +22 -0
  600. data/sig/herb/warnings.rbs +10 -0
  601. data/sig/herb.rbs +27 -10
  602. data/sig/serialized_ast_errors.rbs +58 -1
  603. data/sig/serialized_ast_nodes.rbs +59 -2
  604. data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
  605. data/src/analyze/action_view/generated_handlers.c +37 -1
  606. data/src/analyze/action_view/generated_handlers.h +2 -1
  607. data/src/analyze/action_view/helper_registry.c +1353 -58
  608. data/src/analyze/action_view/registry.c +10 -17
  609. data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
  610. data/src/analyze/action_view/tag_helper_node_builders.c +63 -3
  611. data/src/analyze/action_view/tag_helpers.c +497 -111
  612. data/src/analyze/analyze.c +306 -89
  613. data/src/analyze/analyze_helpers.c +502 -243
  614. data/src/analyze/analyzed_ruby.c +2 -0
  615. data/src/analyze/builders.c +80 -51
  616. data/src/analyze/conditional_elements.c +13 -8
  617. data/src/analyze/conditional_open_tags.c +11 -5
  618. data/src/analyze/control_type.c +30 -5
  619. data/src/analyze/herb_directives.c +701 -0
  620. data/src/analyze/invalid_structures.c +11 -7
  621. data/src/analyze/iteration_nodes.c +306 -0
  622. data/src/analyze/missing_end.c +116 -32
  623. data/src/analyze/parse_errors.c +8 -3
  624. data/src/analyze/postfix_conditionals.c +98 -63
  625. data/src/analyze/prism_annotate.c +45 -13
  626. data/src/analyze/render_nodes.c +345 -123
  627. data/src/analyze/strict_locals.c +30 -26
  628. data/src/analyze/ternary_conditionals.c +95 -70
  629. data/src/analyze/transform.c +43 -1
  630. data/src/ast/ast_node.c +3 -13
  631. data/src/ast/ast_nodes.c +914 -113
  632. data/src/ast/ast_pretty_print.c +166 -3
  633. data/src/diff/herb_diff.c +8 -0
  634. data/src/diff/herb_diff_attributes.c +1 -0
  635. data/src/diff/herb_diff_children.c +4 -3
  636. data/src/diff/herb_diff_helpers.c +7 -1
  637. data/src/diff/herb_diff_nodes.c +186 -71
  638. data/src/diff/herb_hash_tree.c +99 -1
  639. data/src/errors.c +1096 -128
  640. data/src/extract.c +227 -144
  641. data/src/herb.c +30 -11
  642. data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
  643. data/src/include/analyze/action_view/helper_registry.h +28 -4
  644. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  645. data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
  646. data/src/include/analyze/analyze.h +11 -22
  647. data/src/include/analyze/analyzed_ruby.h +25 -0
  648. data/src/include/analyze/builders.h +16 -0
  649. data/src/include/analyze/helpers.h +25 -24
  650. data/src/include/analyze/herb_directive_kinds.h +41 -0
  651. data/src/include/analyze/herb_directives.h +14 -0
  652. data/src/include/analyze/iteration_nodes.h +11 -0
  653. data/src/include/analyze/prism_annotate.h +3 -3
  654. data/src/include/analyze/ternary_conditionals.h +2 -0
  655. data/src/include/ast/ast_node.h +1 -5
  656. data/src/include/ast/ast_nodes.h +78 -3
  657. data/src/include/ast/ast_pretty_print.h +1 -1
  658. data/src/include/diff/herb_diff.h +11 -0
  659. data/src/include/errors.h +156 -39
  660. data/src/include/extract.h +11 -0
  661. data/src/include/herb.h +6 -0
  662. data/src/include/lexer/erb_openers.h +29 -0
  663. data/src/include/lexer/lexer.h +1 -0
  664. data/src/include/lexer/lexer_peek_helpers.h +8 -1
  665. data/src/include/lexer/lexer_struct.h +4 -0
  666. data/src/include/lexer/token.h +3 -0
  667. data/src/include/lexer/token_struct.h +8 -6
  668. data/src/include/lib/hb_allocator.h +2 -1
  669. data/src/include/lib/hb_array.h +2 -0
  670. data/src/include/lib/hb_foreach.h +1 -1
  671. data/src/include/lib/hb_string.h +7 -0
  672. data/src/include/parser/dot_notation.h +1 -1
  673. data/src/include/parser/foreign_content_elements.h +32 -0
  674. data/src/include/parser/parser.h +16 -30
  675. data/src/include/parser/parser_helpers.h +13 -11
  676. data/src/include/parser/parser_options.h +41 -0
  677. data/src/include/prism/herb_prism_node.h +6 -1
  678. data/src/include/prism/ruby_parser.h +6 -0
  679. data/src/include/util/html_elements.h +85 -0
  680. data/src/include/util/html_util.h +1 -0
  681. data/src/include/version.h +1 -1
  682. data/src/lexer/lexer_peek_helpers.c +15 -1
  683. data/src/lexer/token.c +83 -1
  684. data/src/lexer.c +228 -12
  685. data/src/lib/hb_allocator.c +2 -0
  686. data/src/lib/hb_array.c +26 -0
  687. data/src/lib/hb_string.c +26 -0
  688. data/src/main.c +1 -1
  689. data/src/parser/dot_notation.c +4 -3
  690. data/src/parser/match_tags.c +66 -1
  691. data/src/parser/parser_helpers.c +69 -37
  692. data/src/parser.c +606 -383
  693. data/src/parser_options_defaults.c +30 -0
  694. data/src/prism/prism_helpers.c +94 -0
  695. data/src/prism/ruby_parser.c +49 -0
  696. data/src/util/html_util.c +11 -58
  697. data/src/visitor.c +77 -1
  698. data/templates/ext/herb/error_helpers.c.erb +1 -1
  699. data/templates/ext/herb/nodes.c.erb +19 -14
  700. data/templates/ext/herb/nodes.h.erb +2 -1
  701. data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
  702. data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
  703. data/templates/java/nodes.c.erb +21 -17
  704. data/templates/java/nodes.h.erb +3 -2
  705. data/templates/java/org/herb/ParserOptions.java.erb +24 -0
  706. data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
  707. data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
  708. data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
  709. data/templates/java/parser_options_helpers.c.erb +45 -0
  710. data/templates/java/parser_options_helpers.h.erb +10 -0
  711. data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
  712. data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
  713. data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
  714. data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
  715. data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
  716. data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
  717. data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
  718. data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
  719. data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
  720. data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
  721. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
  722. data/templates/javascript/packages/core/src/nodes.ts.erb +103 -20
  723. data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
  724. data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
  725. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
  726. data/templates/javascript/packages/node/extension/nodes.cpp.erb +18 -13
  727. data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
  728. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
  729. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
  730. data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
  731. data/templates/lib/herb/ast/nodes.rb.erb +16 -6
  732. data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
  733. data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
  734. data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
  735. data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
  736. data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
  737. data/templates/lib/herb/errors.rb.erb +34 -6
  738. data/templates/lib/herb/html/elements.rb.erb +12 -0
  739. data/templates/lib/herb/parser_options.rb.erb +32 -0
  740. data/templates/lib/herb/visitor.rb.erb +7 -1
  741. data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
  742. data/templates/rust/src/action_view_helpers.rs.erb +38 -0
  743. data/templates/rust/src/ast/nodes.rs.erb +21 -31
  744. data/templates/rust/src/errors.rs.erb +1 -1
  745. data/templates/rust/src/nodes.rs.erb +58 -26
  746. data/templates/rust/src/parser_options.rs.erb +16 -0
  747. data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
  748. data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
  749. data/templates/rust/src/union_types.rs.erb +7 -1
  750. data/templates/rust/src/visitor.rs.erb +1 -1
  751. data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
  752. data/templates/src/analyze/missing_end.c.erb +13 -5
  753. data/templates/src/ast/ast_nodes.c.erb +41 -2
  754. data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
  755. data/templates/src/errors.c.erb +8 -3
  756. data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
  757. data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
  758. data/templates/src/include/errors.h.erb +3 -1
  759. data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
  760. data/templates/src/include/parser/parser_options.h.erb +21 -0
  761. data/templates/src/include/util/html_elements.h.erb +28 -0
  762. data/templates/src/parser_options_defaults.c.erb +9 -0
  763. data/templates/template.rb +564 -9
  764. data/templates/wasm/error_helpers.cpp.erb +4 -4
  765. data/templates/wasm/nodes.cpp.erb +17 -27
  766. data/templates/wasm/nodes.h.erb +3 -3
  767. data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
  768. data/templates/wasm/parser_options_helpers.h.erb +12 -0
  769. metadata +306 -27
  770. data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
  771. data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
  772. data/lib/herb/ast.rb +0 -7
  773. data/lib/herb/diff_operation.rb +0 -34
  774. data/lib/herb/diff_result.rb +0 -59
  775. data/lib/herb/engine/error_formatter.rb +0 -432
  776. data/lib/herb/engine/parser_error_overlay.rb +0 -773
  777. data/lib/herb/engine/validation_error_overlay.rb +0 -182
  778. data/lib/herb/engine/validation_errors.rb +0 -65
  779. data/lib/herb/engine/validator.rb +0 -80
  780. data/sig/herb/ast.rbs +0 -6
  781. data/sig/herb/diff_operation.rbs +0 -34
  782. data/sig/herb/diff_result.rbs +0 -34
  783. data/sig/herb/engine/debug.rbs +0 -38
  784. data/sig/herb/engine/error_formatter.rbs +0 -47
  785. data/sig/herb/engine/parser_error_overlay.rbs +0 -41
  786. data/sig/herb/engine/validation_error_overlay.rbs +0 -35
  787. data/sig/herb/engine/validation_errors.rbs +0 -45
  788. data/sig/herb/engine/validator.rbs +0 -41
  789. data/sig/herb_c_extension.rbs +0 -10
@@ -4,44 +4,33 @@
4
4
  #include "../ast/ast_nodes.h"
5
5
  #include "../lib/hb_allocator.h"
6
6
  #include "../lib/hb_array.h"
7
+ #include "../lib/hb_buffer.h"
7
8
  #include "../parser/parser.h"
8
9
  #include "analyzed_ruby.h"
9
10
 
11
+ typedef struct TAG_HELPER_SCOPE_STRUCT {
12
+ hb_buffer_T buffer;
13
+ pm_options_t options;
14
+ pm_parser_t parser;
15
+ pm_node_t* root;
16
+ } tag_helper_scope_T;
17
+
10
18
  typedef struct ANALYZE_RUBY_CONTEXT_STRUCT {
11
19
  AST_DOCUMENT_NODE_T* document;
12
20
  AST_NODE_T* parent;
13
21
  hb_array_T* ruby_context_stack;
22
+ tag_helper_scope_T* tag_helper_scope;
14
23
  hb_allocator_T* allocator;
15
24
  const char* source;
16
25
  bool found_strict_locals;
26
+ const parser_options_T* options;
17
27
  } analyze_ruby_context_T;
18
28
 
19
- typedef enum {
20
- CONTROL_TYPE_IF,
21
- CONTROL_TYPE_ELSIF,
22
- CONTROL_TYPE_ELSE,
23
- CONTROL_TYPE_END,
24
- CONTROL_TYPE_CASE,
25
- CONTROL_TYPE_CASE_MATCH,
26
- CONTROL_TYPE_WHEN,
27
- CONTROL_TYPE_IN,
28
- CONTROL_TYPE_BEGIN,
29
- CONTROL_TYPE_RESCUE,
30
- CONTROL_TYPE_ENSURE,
31
- CONTROL_TYPE_UNLESS,
32
- CONTROL_TYPE_WHILE,
33
- CONTROL_TYPE_UNTIL,
34
- CONTROL_TYPE_FOR,
35
- CONTROL_TYPE_BLOCK,
36
- CONTROL_TYPE_BLOCK_CLOSE,
37
- CONTROL_TYPE_YIELD,
38
- CONTROL_TYPE_UNKNOWN
39
- } control_type_t;
40
-
41
29
  typedef struct {
42
30
  int loop_depth;
43
31
  int rescue_depth;
44
32
  hb_allocator_T* allocator;
33
+ const parser_options_T* options;
45
34
  } invalid_erb_context_T;
46
35
 
47
36
  void herb_analyze_parse_errors(
@@ -5,6 +5,29 @@
5
5
  #include "../lib/hb_string.h"
6
6
 
7
7
  #include <prism.h>
8
+ #include <stdbool.h>
9
+
10
+ typedef enum {
11
+ CONTROL_TYPE_IF,
12
+ CONTROL_TYPE_ELSIF,
13
+ CONTROL_TYPE_ELSE,
14
+ CONTROL_TYPE_END,
15
+ CONTROL_TYPE_CASE,
16
+ CONTROL_TYPE_CASE_MATCH,
17
+ CONTROL_TYPE_WHEN,
18
+ CONTROL_TYPE_IN,
19
+ CONTROL_TYPE_BEGIN,
20
+ CONTROL_TYPE_RESCUE,
21
+ CONTROL_TYPE_ENSURE,
22
+ CONTROL_TYPE_UNLESS,
23
+ CONTROL_TYPE_WHILE,
24
+ CONTROL_TYPE_UNTIL,
25
+ CONTROL_TYPE_FOR,
26
+ CONTROL_TYPE_BLOCK,
27
+ CONTROL_TYPE_BLOCK_CLOSE,
28
+ CONTROL_TYPE_YIELD,
29
+ CONTROL_TYPE_UNKNOWN
30
+ } control_type_t;
8
31
 
9
32
  typedef struct ANALYZED_RUBY_STRUCT {
10
33
  pm_parser_t parser;
@@ -31,6 +54,8 @@ typedef struct ANALYZED_RUBY_STRUCT {
31
54
  int yield_node_count;
32
55
  int then_keyword_count;
33
56
  int unclosed_control_flow_count;
57
+ control_type_t control_type;
58
+ bool control_type_detected;
34
59
  } analyzed_ruby_T;
35
60
 
36
61
  analyzed_ruby_T* init_analyzed_ruby(hb_string_T source);
@@ -7,8 +7,24 @@
7
7
  #include "../location/position.h"
8
8
  #include "analyze.h"
9
9
 
10
+ position_T erb_tag_start_position(const token_T* tag_opening, const token_T* content, location_T location);
11
+ position_T erb_tag_end_position(
12
+ const token_T* tag_closing,
13
+ const token_T* content,
14
+ const token_T* tag_opening,
15
+ location_T location
16
+ );
17
+
18
+ position_T erb_content_start_position(const AST_ERB_CONTENT_NODE_T* erb_node);
10
19
  position_T erb_content_end_position(const AST_ERB_CONTENT_NODE_T* erb_node);
11
20
 
21
+ location_T* compute_then_keyword_for_content(
22
+ token_T* content,
23
+ analyzed_ruby_T* analyzed_ruby,
24
+ control_type_t control_type,
25
+ hb_allocator_T* allocator
26
+ );
27
+
12
28
  location_T* compute_then_keyword(
13
29
  AST_ERB_CONTENT_NODE_T* erb_node,
14
30
  control_type_t control_type,
@@ -8,6 +8,7 @@
8
8
  #include "../ast/ast_nodes.h"
9
9
  #include "../lib/hb_allocator.h"
10
10
  #include "../lib/hb_array.h"
11
+ #include "../parser/parser.h"
11
12
  #include "analyzed_ruby.h"
12
13
 
13
14
  bool has_if_node(analyzed_ruby_T* analyzed);
@@ -30,6 +31,9 @@ bool has_unless_node(analyzed_ruby_T* analyzed);
30
31
  bool has_yield_node(analyzed_ruby_T* analyzed);
31
32
  bool has_then_keyword(analyzed_ruby_T* analyzed);
32
33
  bool has_inline_case_condition(analyzed_ruby_T* analyzed);
34
+ bool has_inline_pattern_match(analyzed_ruby_T* analyzed, hb_string_T content);
35
+ bool inline_condition_keyword_offset(const analyzed_ruby_T* analyzed, uint32_t* offset);
36
+ bool control_role_split_offset(const analyzed_ruby_T* analyzed, uint32_t* offset);
33
37
 
34
38
  bool has_error_message(analyzed_ruby_T* anlayzed, const char* message);
35
39
 
@@ -38,31 +42,11 @@ bool is_brace_block(pm_location_t opening_location);
38
42
  bool is_closing_brace(pm_location_t location);
39
43
  bool has_valid_block_closing(pm_location_t opening_loc, pm_location_t closing_loc);
40
44
 
41
- bool search_begin_nodes(const pm_node_t* node, void* data);
42
- bool search_block_nodes(const pm_node_t* node, void* data);
43
- bool search_case_match_nodes(const pm_node_t* node, void* data);
44
- bool search_case_nodes(const pm_node_t* node, void* data);
45
- bool search_for_nodes(const pm_node_t* node, void* data);
46
- bool search_if_nodes(const pm_node_t* node, void* data);
47
- bool search_in_nodes(const pm_node_t* node, void* data);
48
- bool search_then_keywords(const pm_node_t* node, void* data);
45
+ bool search_control_flow_nodes(const pm_node_t* node, void* data);
49
46
  bool search_unclosed_control_flows(const pm_node_t* node, void* data);
50
- bool search_unless_nodes(const pm_node_t* node, void* data);
51
- bool search_until_nodes(const pm_node_t* node, void* data);
52
- bool search_when_nodes(const pm_node_t* node, void* data);
53
- bool search_while_nodes(const pm_node_t* node, void* data);
54
- bool search_yield_nodes(const pm_node_t* node, void* data);
47
+ void search_unexpected_keyword_errors(analyzed_ruby_T* analyzed);
55
48
 
56
- bool search_unexpected_block_closing_nodes(analyzed_ruby_T* analyzed);
57
- bool search_unexpected_else_nodes(analyzed_ruby_T* analyzed);
58
- bool search_unexpected_elsif_nodes(analyzed_ruby_T* analyzed);
59
- bool search_unexpected_end_nodes(analyzed_ruby_T* analyzed);
60
- bool search_unexpected_ensure_nodes(analyzed_ruby_T* analyzed);
61
- bool search_unexpected_in_nodes(analyzed_ruby_T* analyzed);
62
- bool search_unexpected_rescue_nodes(analyzed_ruby_T* analyzed);
63
- bool search_unexpected_when_nodes(analyzed_ruby_T* analyzed);
64
-
65
- void check_erb_node_for_missing_end(const AST_NODE_T* node, hb_allocator_T* allocator);
49
+ void check_erb_node_for_missing_end(const AST_NODE_T* node, hb_allocator_T* allocator, const parser_options_T* options);
66
50
 
67
51
  hb_array_T* extract_parameters_from_prism(
68
52
  pm_parameters_node_t* parameters,
@@ -73,10 +57,27 @@ hb_array_T* extract_parameters_from_prism(
73
57
  hb_allocator_T* allocator
74
58
  );
75
59
 
60
+ bool is_erb_output_tag(const AST_ERB_CONTENT_NODE_T* erb_node);
61
+
62
+ typedef enum {
63
+ STATIC_OUTPUT_NODE_NONE,
64
+ STATIC_OUTPUT_NODE_HTML_TEXT,
65
+ STATIC_OUTPUT_NODE_LITERAL,
66
+ } static_output_node_type_T;
67
+
68
+ bool append_static_output_node(
69
+ hb_array_T* statements,
70
+ const pm_statements_node_t* body,
71
+ const analyzed_ruby_T* analyzed,
72
+ position_T content_start,
73
+ static_output_node_type_T node_type,
74
+ hb_allocator_T* allocator
75
+ );
76
+
76
77
  hb_array_T* extract_block_arguments_from_erb_node(
77
78
  const AST_ERB_CONTENT_NODE_T* erb_node,
78
79
  const char* source,
79
- hb_array_T* errors,
80
+ hb_array_T** errors,
80
81
  hb_allocator_T* allocator
81
82
  );
82
83
 
@@ -0,0 +1,41 @@
1
+ // NOTE: This file is generated by the templates/template.rb script and should not
2
+ // be modified manually. See templates/src/include/analyze/herb_directive_kinds.h.erb
3
+
4
+ #ifndef HERB_DIRECTIVE_KINDS_H
5
+ #define HERB_DIRECTIVE_KINDS_H
6
+
7
+ #include <prism.h>
8
+
9
+ /**
10
+ * The kind a `herb:state` default gets from the Prism node it parsed into.
11
+ *
12
+ * Returns NULL for a node type that has no plain mapping. The caller decides what those become,
13
+ * since a call node is a bare read or a seed depending on its shape.
14
+ */
15
+ static inline const char* herb_directive_kind_for_prism_type(pm_node_type_t type) {
16
+ switch (type) {
17
+ case PM_TRUE_NODE:
18
+ case PM_FALSE_NODE: return "boolean";
19
+
20
+ case PM_INTEGER_NODE: return "integer";
21
+
22
+ case PM_FLOAT_NODE: return "float";
23
+
24
+ case PM_STRING_NODE: return "string";
25
+
26
+ case PM_SYMBOL_NODE: return "symbol";
27
+
28
+ case PM_NIL_NODE: return "nil";
29
+
30
+ case PM_ARRAY_NODE: return "array";
31
+
32
+ case PM_HASH_NODE:
33
+ case PM_KEYWORD_HASH_NODE: return "hash";
34
+
35
+ case PM_LOCAL_VARIABLE_READ_NODE: return "bare";
36
+
37
+ default: return NULL;
38
+ }
39
+ }
40
+
41
+ #endif
@@ -0,0 +1,14 @@
1
+ #ifndef HERB_ANALYZE_HERB_DIRECTIVES_H
2
+ #define HERB_ANALYZE_HERB_DIRECTIVES_H
3
+
4
+ #include "../ast/ast_nodes.h"
5
+ #include "../lib/hb_string.h"
6
+ #include "analyze.h"
7
+
8
+ #include <prism.h>
9
+ #include <stdbool.h>
10
+
11
+ bool transform_herb_directive_nodes(const AST_NODE_T* node, void* data);
12
+ hb_string_T herb_directive_kind_for_prism_node(const pm_node_t* node);
13
+
14
+ #endif
@@ -0,0 +1,11 @@
1
+ #ifndef HERB_ANALYZE_ITERATION_NODES_H
2
+ #define HERB_ANALYZE_ITERATION_NODES_H
3
+
4
+ #include "../ast/ast_nodes.h"
5
+ #include "analyze.h"
6
+
7
+ #include <stdbool.h>
8
+
9
+ bool transform_iteration_nodes(const AST_NODE_T* node, void* data);
10
+
11
+ #endif
@@ -4,12 +4,12 @@
4
4
  #include "../ast/ast_nodes.h"
5
5
  #include "../lib/hb_allocator.h"
6
6
 
7
+ struct PARSER_OPTIONS_STRUCT;
8
+
7
9
  void herb_annotate_prism_nodes(
8
10
  AST_DOCUMENT_NODE_T* document,
9
11
  const char* source,
10
- bool prism_nodes,
11
- bool prism_nodes_deep,
12
- bool prism_program,
12
+ const struct PARSER_OPTIONS_STRUCT* options,
13
13
  hb_allocator_T* allocator
14
14
  );
15
15
 
@@ -3,10 +3,12 @@
3
3
 
4
4
  #include "../ast/ast_nodes.h"
5
5
  #include "analyze.h"
6
+ #include "helpers.h"
6
7
 
7
8
  AST_NODE_T* transform_ternary_expression(
8
9
  AST_ERB_CONTENT_NODE_T* erb_node,
9
10
  pm_if_node_t* if_node,
11
+ static_output_node_type_T static_node_type,
10
12
  hb_allocator_T* allocator
11
13
  );
12
14
 
@@ -16,21 +16,17 @@ void ast_node_init(
16
16
  hb_allocator_T* allocator
17
17
  );
18
18
  void ast_node_free(AST_NODE_T* node, hb_allocator_T* allocator);
19
+ void ast_node_rebase_tokens(AST_NODE_T* node, const char* from, const char* to, size_t length);
19
20
 
20
21
  AST_LITERAL_NODE_T* ast_literal_node_init_from_token(const token_T* token, hb_allocator_T* allocator);
21
22
 
22
23
  size_t ast_node_sizeof(void);
23
- size_t ast_node_child_count(AST_NODE_T* node);
24
24
 
25
25
  ast_node_type_T ast_node_type(const AST_NODE_T* node);
26
26
 
27
27
  void ast_node_set_start(AST_NODE_T* node, position_T position);
28
28
  void ast_node_set_end(AST_NODE_T* node, position_T position);
29
29
 
30
- size_t ast_node_errors_count(const AST_NODE_T* node);
31
- hb_array_T* ast_node_errors(const AST_NODE_T* node);
32
- void ast_node_append_error(const AST_NODE_T* node, ERROR_T* error);
33
-
34
30
  void ast_node_set_start_from_token(AST_NODE_T* node, const token_T* token);
35
31
  void ast_node_set_end_from_token(AST_NODE_T* node, const token_T* token);
36
32
 
@@ -1,5 +1,5 @@
1
1
  // NOTE: This file is generated by the templates/template.rb script and should not
2
- // be modified manually. See /home/runner/work/herb/herb/templates/src/include/ast/ast_nodes.h.erb
2
+ // be modified manually. See templates/src/include/ast/ast_nodes.h.erb
3
3
 
4
4
  #ifndef HERB_AST_NODES_H
5
5
  #define HERB_AST_NODES_H
@@ -39,6 +39,7 @@ typedef enum {
39
39
  AST_HTML_COMMENT_NODE,
40
40
  AST_HTML_DOCTYPE_NODE,
41
41
  AST_XML_DECLARATION_NODE,
42
+ AST_XML_PROCESSING_INSTRUCTION_NODE,
42
43
  AST_CDATA_NODE,
43
44
  AST_WHITESPACE_NODE,
44
45
  AST_ERB_CONTENT_NODE,
@@ -46,6 +47,7 @@ typedef enum {
46
47
  AST_ERB_ELSE_NODE,
47
48
  AST_ERB_IF_NODE,
48
49
  AST_ERB_BLOCK_NODE,
50
+ AST_ERB_ITERATION_BLOCK_NODE,
49
51
  AST_ERB_WHEN_NODE,
50
52
  AST_ERB_CASE_NODE,
51
53
  AST_ERB_CASE_MATCH_NODE,
@@ -63,6 +65,10 @@ typedef enum {
63
65
  AST_ERB_STRICT_LOCALS_NODE,
64
66
  AST_ERB_YIELD_NODE,
65
67
  AST_ERB_IN_NODE,
68
+ AST_HERB_DIRECTIVE_NODE,
69
+ AST_HERB_STATE_DECLARATION_NODE,
70
+ AST_HERB_STATE_DIRECTIVE_NODE,
71
+ AST_ERB_COMMENT_NODE,
66
72
  } ast_node_type_T;
67
73
 
68
74
  typedef struct AST_NODE_STRUCT {
@@ -207,6 +213,14 @@ typedef struct AST_XML_DECLARATION_NODE_STRUCT {
207
213
  token_T* tag_closing;
208
214
  } AST_XML_DECLARATION_NODE_T;
209
215
 
216
+ typedef struct AST_XML_PROCESSING_INSTRUCTION_NODE_STRUCT {
217
+ AST_NODE_T base;
218
+ token_T* tag_opening;
219
+ token_T* target;
220
+ hb_array_T* children;
221
+ token_T* tag_closing;
222
+ } AST_XML_PROCESSING_INSTRUCTION_NODE_T;
223
+
210
224
  typedef struct AST_CDATA_NODE_STRUCT {
211
225
  AST_NODE_T base;
212
226
  token_T* tag_opening;
@@ -271,6 +285,25 @@ typedef struct AST_ERB_BLOCK_NODE_STRUCT {
271
285
  struct AST_ERB_END_NODE_STRUCT* end_node;
272
286
  } AST_ERB_BLOCK_NODE_T;
273
287
 
288
+ typedef struct AST_ERB_ITERATION_BLOCK_NODE_STRUCT {
289
+ AST_NODE_T base;
290
+ token_T* tag_opening;
291
+ token_T* content;
292
+ token_T* tag_closing;
293
+ herb_prism_node_T prism_node;
294
+ token_T* receiver;
295
+ token_T* call_operator;
296
+ token_T* message;
297
+ hb_array_T* arguments;
298
+ token_T* block_opening;
299
+ hb_array_T* body;
300
+ hb_array_T* block_arguments;
301
+ struct AST_ERB_RESCUE_NODE_STRUCT* rescue_clause;
302
+ struct AST_ERB_ELSE_NODE_STRUCT* else_clause;
303
+ struct AST_ERB_ENSURE_NODE_STRUCT* ensure_clause;
304
+ struct AST_ERB_END_NODE_STRUCT* end_node;
305
+ } AST_ERB_ITERATION_BLOCK_NODE_T;
306
+
274
307
  typedef struct AST_ERB_WHEN_NODE_STRUCT {
275
308
  AST_NODE_T base;
276
309
  token_T* tag_opening;
@@ -402,6 +435,8 @@ typedef struct AST_RUBY_RENDER_KEYWORDS_NODE_STRUCT {
402
435
  token_T* handlers;
403
436
  token_T* content_type;
404
437
  hb_array_T* locals;
438
+ hb_array_T* state;
439
+ location_T* state_location;
405
440
  } AST_RUBY_RENDER_KEYWORDS_NODE_T;
406
441
 
407
442
  typedef struct AST_ERB_RENDER_NODE_STRUCT {
@@ -443,6 +478,7 @@ typedef struct AST_ERB_YIELD_NODE_STRUCT {
443
478
  token_T* tag_opening;
444
479
  token_T* content;
445
480
  token_T* tag_closing;
481
+ herb_prism_node_T prism_node;
446
482
  } AST_ERB_YIELD_NODE_T;
447
483
 
448
484
  typedef struct AST_ERB_IN_NODE_STRUCT {
@@ -454,6 +490,39 @@ typedef struct AST_ERB_IN_NODE_STRUCT {
454
490
  hb_array_T* statements;
455
491
  } AST_ERB_IN_NODE_T;
456
492
 
493
+ typedef struct AST_HERB_DIRECTIVE_NODE_STRUCT {
494
+ AST_NODE_T base;
495
+ token_T* tag_opening;
496
+ token_T* content;
497
+ token_T* tag_closing;
498
+ token_T* key;
499
+ token_T* arguments;
500
+ } AST_HERB_DIRECTIVE_NODE_T;
501
+
502
+ typedef struct AST_HERB_STATE_DECLARATION_NODE_STRUCT {
503
+ AST_NODE_T base;
504
+ token_T* name;
505
+ struct AST_RUBY_LITERAL_NODE_STRUCT* default_value;
506
+ hb_string_T kind;
507
+ } AST_HERB_STATE_DECLARATION_NODE_T;
508
+
509
+ typedef struct AST_HERB_STATE_DIRECTIVE_NODE_STRUCT {
510
+ AST_NODE_T base;
511
+ token_T* tag_opening;
512
+ token_T* content;
513
+ token_T* tag_closing;
514
+ token_T* key;
515
+ token_T* signature;
516
+ hb_array_T* states;
517
+ } AST_HERB_STATE_DIRECTIVE_NODE_T;
518
+
519
+ typedef struct AST_ERB_COMMENT_NODE_STRUCT {
520
+ AST_NODE_T base;
521
+ token_T* tag_opening;
522
+ token_T* content;
523
+ token_T* tag_closing;
524
+ } AST_ERB_COMMENT_NODE_T;
525
+
457
526
  AST_DOCUMENT_NODE_T* ast_document_node_init(hb_array_T* children, herb_prism_context_T* prism_context, herb_prism_node_T prism_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
458
527
  AST_LITERAL_NODE_T* ast_literal_node_init(hb_string_T content, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
459
528
  AST_HTML_OPEN_TAG_NODE_T* ast_html_open_tag_node_init(token_T* tag_opening, token_T* tag_name, token_T* tag_closing, hb_array_T* children, bool is_void, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
@@ -473,6 +542,7 @@ AST_HTML_TEXT_NODE_T* ast_html_text_node_init(hb_string_T content, position_T st
473
542
  AST_HTML_COMMENT_NODE_T* ast_html_comment_node_init(token_T* comment_start, hb_array_T* children, token_T* comment_end, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
474
543
  AST_HTML_DOCTYPE_NODE_T* ast_html_doctype_node_init(token_T* tag_opening, hb_array_T* children, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
475
544
  AST_XML_DECLARATION_NODE_T* ast_xml_declaration_node_init(token_T* tag_opening, hb_array_T* children, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
545
+ AST_XML_PROCESSING_INSTRUCTION_NODE_T* ast_xml_processing_instruction_node_init(token_T* tag_opening, token_T* target, hb_array_T* children, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
476
546
  AST_CDATA_NODE_T* ast_cdata_node_init(token_T* tag_opening, hb_array_T* children, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
477
547
  AST_WHITESPACE_NODE_T* ast_whitespace_node_init(token_T* value, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
478
548
  AST_ERB_CONTENT_NODE_T* ast_erb_content_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, analyzed_ruby_T* analyzed_ruby, bool parsed, bool valid, herb_prism_node_T prism_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
@@ -480,6 +550,7 @@ AST_ERB_END_NODE_T* ast_erb_end_node_init(token_T* tag_opening, token_T* content
480
550
  AST_ERB_ELSE_NODE_T* ast_erb_else_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, hb_array_T* statements, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
481
551
  AST_ERB_IF_NODE_T* ast_erb_if_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, location_T* then_keyword, herb_prism_node_T prism_node, hb_array_T* statements, AST_NODE_T* subsequent, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
482
552
  AST_ERB_BLOCK_NODE_T* ast_erb_block_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, herb_prism_node_T prism_node, hb_array_T* body, hb_array_T* block_arguments, struct AST_ERB_RESCUE_NODE_STRUCT* rescue_clause, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_ENSURE_NODE_STRUCT* ensure_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
553
+ AST_ERB_ITERATION_BLOCK_NODE_T* ast_erb_iteration_block_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, herb_prism_node_T prism_node, token_T* receiver, token_T* call_operator, token_T* message, hb_array_T* arguments, token_T* block_opening, hb_array_T* body, hb_array_T* block_arguments, struct AST_ERB_RESCUE_NODE_STRUCT* rescue_clause, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_ENSURE_NODE_STRUCT* ensure_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
483
554
  AST_ERB_WHEN_NODE_T* ast_erb_when_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, location_T* then_keyword, hb_array_T* statements, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
484
555
  AST_ERB_CASE_NODE_T* ast_erb_case_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, hb_array_T* children, herb_prism_node_T prism_node, hb_array_T* conditions, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
485
556
  AST_ERB_CASE_MATCH_NODE_T* ast_erb_case_match_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, hb_array_T* children, herb_prism_node_T prism_node, hb_array_T* conditions, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
@@ -491,12 +562,16 @@ AST_ERB_ENSURE_NODE_T* ast_erb_ensure_node_init(token_T* tag_opening, token_T* c
491
562
  AST_ERB_BEGIN_NODE_T* ast_erb_begin_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, herb_prism_node_T prism_node, hb_array_T* statements, struct AST_ERB_RESCUE_NODE_STRUCT* rescue_clause, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_ENSURE_NODE_STRUCT* ensure_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
492
563
  AST_ERB_UNLESS_NODE_T* ast_erb_unless_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, location_T* then_keyword, herb_prism_node_T prism_node, hb_array_T* statements, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
493
564
  AST_RUBY_RENDER_LOCAL_NODE_T* ast_ruby_render_local_node_init(token_T* name, struct AST_RUBY_LITERAL_NODE_STRUCT* value, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
494
- AST_RUBY_RENDER_KEYWORDS_NODE_T* ast_ruby_render_keywords_node_init(token_T* partial, token_T* template_path, token_T* layout, token_T* file, token_T* inline_template, token_T* body, token_T* plain, token_T* html, token_T* renderable, token_T* collection, token_T* object, token_T* as_name, token_T* spacer_template, token_T* formats, token_T* variants, token_T* handlers, token_T* content_type, hb_array_T* locals, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
565
+ AST_RUBY_RENDER_KEYWORDS_NODE_T* ast_ruby_render_keywords_node_init(token_T* partial, token_T* template_path, token_T* layout, token_T* file, token_T* inline_template, token_T* body, token_T* plain, token_T* html, token_T* renderable, token_T* collection, token_T* object, token_T* as_name, token_T* spacer_template, token_T* formats, token_T* variants, token_T* handlers, token_T* content_type, hb_array_T* locals, hb_array_T* state, location_T* state_location, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
495
566
  AST_ERB_RENDER_NODE_T* ast_erb_render_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, analyzed_ruby_T* analyzed_ruby, herb_prism_node_T prism_node, struct AST_RUBY_RENDER_KEYWORDS_NODE_STRUCT* keywords, hb_array_T* body, hb_array_T* block_arguments, struct AST_ERB_RESCUE_NODE_STRUCT* rescue_clause, struct AST_ERB_ELSE_NODE_STRUCT* else_clause, struct AST_ERB_ENSURE_NODE_STRUCT* ensure_clause, struct AST_ERB_END_NODE_STRUCT* end_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
496
567
  AST_RUBY_PARAMETER_NODE_T* ast_ruby_parameter_node_init(token_T* name, struct AST_RUBY_LITERAL_NODE_STRUCT* default_value, hb_string_T kind, bool required, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
497
568
  AST_ERB_STRICT_LOCALS_NODE_T* ast_erb_strict_locals_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, analyzed_ruby_T* analyzed_ruby, herb_prism_node_T prism_node, hb_array_T* locals, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
498
- AST_ERB_YIELD_NODE_T* ast_erb_yield_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
569
+ AST_ERB_YIELD_NODE_T* ast_erb_yield_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, herb_prism_node_T prism_node, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
499
570
  AST_ERB_IN_NODE_T* ast_erb_in_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, location_T* then_keyword, hb_array_T* statements, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
571
+ AST_HERB_DIRECTIVE_NODE_T* ast_herb_directive_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, token_T* key, token_T* arguments, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
572
+ AST_HERB_STATE_DECLARATION_NODE_T* ast_herb_state_declaration_node_init(token_T* name, struct AST_RUBY_LITERAL_NODE_STRUCT* default_value, hb_string_T kind, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
573
+ AST_HERB_STATE_DIRECTIVE_NODE_T* ast_herb_state_directive_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, token_T* key, token_T* signature, hb_array_T* states, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
574
+ AST_ERB_COMMENT_NODE_T* ast_erb_comment_node_init(token_T* tag_opening, token_T* content, token_T* tag_closing, position_T start_position, position_T end_position, hb_array_T* errors, hb_allocator_T* allocator);
500
575
 
501
576
  hb_string_T ast_node_type_to_string(AST_NODE_T* node);
502
577
  hb_string_T ast_node_human_type(AST_NODE_T* node);
@@ -1,5 +1,5 @@
1
1
  // NOTE: This file is generated by the templates/template.rb script and should not
2
- // be modified manually. See /home/runner/work/herb/herb/templates/src/include/ast/ast_pretty_print.h.erb
2
+ // be modified manually. See templates/src/include/ast/ast_pretty_print.h.erb
3
3
 
4
4
  #ifndef HERB_AST_PRETTY_PRINT_H
5
5
  #define HERB_AST_PRETTY_PRINT_H
@@ -20,6 +20,7 @@ typedef enum {
20
20
  HERB_DIFF_NODE_MOVED,
21
21
 
22
22
  HERB_DIFF_TEXT_CHANGED,
23
+ HERB_DIFF_WHITESPACE_CHANGED,
23
24
  HERB_DIFF_ERB_CONTENT_CHANGED,
24
25
 
25
26
  HERB_DIFF_ATTRIBUTE_ADDED,
@@ -46,10 +47,17 @@ typedef struct {
46
47
  uint32_t new_index;
47
48
  } herb_diff_operation_T;
48
49
 
50
+ typedef struct {
51
+ bool track_whitespace_changes;
52
+ } herb_diff_options_T;
53
+
54
+ extern const herb_diff_options_T HERB_DEFAULT_DIFF_OPTIONS;
55
+
49
56
  typedef struct {
50
57
  hb_array_T* operations;
51
58
  hb_allocator_T* allocator;
52
59
  bool trees_identical;
60
+ herb_diff_options_T options;
53
61
  } herb_diff_result_T;
54
62
 
55
63
  herb_diff_path_T herb_diff_path_empty(void);
@@ -58,6 +66,7 @@ herb_diff_path_T herb_diff_path_append(herb_diff_path_T path, uint32_t index);
58
66
  herb_diff_result_T* herb_diff(
59
67
  const AST_DOCUMENT_NODE_T* old_document,
60
68
  const AST_DOCUMENT_NODE_T* new_document,
69
+ const herb_diff_options_T* options,
61
70
  hb_allocator_T* allocator
62
71
  );
63
72
 
@@ -72,6 +81,7 @@ void herb_diff_node(
72
81
  herb_diff_path_T path,
73
82
  const herb_hash_map_T* old_hashes,
74
83
  const herb_hash_map_T* new_hashes,
84
+ bool preserve_whitespace,
75
85
  herb_diff_result_T* result
76
86
  );
77
87
 
@@ -81,6 +91,7 @@ void herb_diff_children(
81
91
  herb_diff_path_T parent_path,
82
92
  const herb_hash_map_T* old_hashes,
83
93
  const herb_hash_map_T* new_hashes,
94
+ bool preserve_whitespace,
84
95
  herb_diff_result_T* result
85
96
  );
86
97