Parser: Introduce two-pass algorithm for matching HTML Elements #795
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pull request introduces a two-pass algorithm for HTML tag matching to better handle ERB control flow boundaries and provide more accurate and actionable error messages.
Previously, HTML tags were matched during parsing (single-pass), which caused issues when tags appeared across ERB control flow boundaries. This would incorrectly report errors or miss mismatched tags because the parser couldn't understand that the
<% if %>creates a scope boundary.Now with this pull request:
In the first pass during parsing, the parser collects
HTMLOpenTagNodeandHTMLCloseTagNodenodes separately without attempting to match them or perform any validation, so it doesn't built anyHTMLElementNodeanymore during this pass.In the second pass after the ERB structure has been fully analyzed, the new
herb_parser_match_html_tags_post_analyze()function matches tags while respecting ERB control flow scope boundaries.This function recursively processes all ERB control structures including
if/elsif/else,case/when,begin/rescue/ensure, and others, attaching any mismatch errors directly to the relevant stray open or close tag nodes.Improved HTML Element Matching
Before

After
ERB Control Error Improvements
Before
After