Skip to content

Commit 9c46bf0

Browse files
committed
fix: Fix the parser's errors in detecting control flow siblings of texts
1 parent 4184900 commit 9c46bf0

File tree

9 files changed

+14097
-11836
lines changed

9 files changed

+14097
-11836
lines changed

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"files.associations": {
3+
"parser.h": "c"
4+
}
5+
}

grammar.js

Lines changed: 52 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,21 @@ module.exports = grammar(HTML, {
2121
original.concat([
2222
$._interpolation_start,
2323
$._interpolation_end,
24-
$._control_flow_start,
24+
// $._control_flow_start,
25+
$.if_start,
26+
$.else_start,
27+
$.for_start,
28+
$.switch_start,
29+
$.case_start,
30+
$.default_start,
31+
$.defer_start,
32+
$.let_start,
33+
$.empty_start,
34+
$.placeholder_start,
35+
$.loading_start,
36+
$.error_start,
37+
$.else_if_start,
38+
$.at_sign,
2539
]),
2640

2741
rules: {
@@ -31,12 +45,13 @@ module.exports = grammar(HTML, {
3145
prec(1, $.icu_expression),
3246
prec(1, $.interpolation),
3347
prec(1, $._any_statement),
48+
$.at_sign,
3449
original,
3550
),
3651

3752
// ---------- Overrides ----------
3853
attribute_name: (_) => /[^<>\*.\[\]\(\)"'=\s]+/,
39-
text: (_) => /[^<>{}&\s]([^<>{}&]*[^<>{}&\s])?/,
54+
text: (_) => /[^<>{}&@\s]([^<>{}&@]*[^<>{}&@\s])?/,
4055

4156
// ----------- Statement block --------
4257
statement_block: ($) => prec.right(seq('{', repeat($._node), '}')),
@@ -63,24 +78,15 @@ module.exports = grammar(HTML, {
6378
),
6479

6580
// ---------- Let Statement ----------
66-
6781
let_statement: ($) =>
68-
prec.left(
69-
seq(
70-
alias($._control_flow_start, '@'),
71-
alias('let', $.control_keyword),
72-
$.assignment_expression,
73-
';',
74-
),
75-
),
82+
prec.left(seq(alias($.let_start, $.control_keyword), $.assignment_expression, ';')),
7683

7784
// ---------- Switch Statement ----------
7885

7986
switch_statement: ($) =>
8087
prec.right(
8188
seq(
82-
alias($._control_flow_start, '@'),
83-
alias('switch', $.control_keyword),
89+
alias($.switch_start, $.control_keyword),
8490
'(',
8591
field('value', $.expression),
8692
')',
@@ -93,28 +99,22 @@ module.exports = grammar(HTML, {
9399

94100
case_statement: ($) =>
95101
seq(
96-
alias($._control_flow_start, '@'),
97-
alias('case', $.control_keyword),
102+
alias($.case_start, $.control_keyword),
98103
'(',
99104
field('value', $._primitive),
100105
')',
101106
field('body', $.statement_block),
102107
),
103108

104109
default_statement: ($) =>
105-
seq(
106-
alias($._control_flow_start, '@'),
107-
alias('default', $.control_keyword),
108-
field('body', $.statement_block),
109-
),
110+
seq(alias($.default_start, $.control_keyword), field('body', $.statement_block)),
110111

111112
// ---------- Defer Statement ----------
112113

113114
defer_statement: ($) =>
114115
prec.left(
115116
seq(
116-
alias($._control_flow_start, '@'),
117-
alias('defer', $.control_keyword),
117+
alias($.defer_start, $.control_keyword),
118118
optional($.defer_trigger),
119119
field('body', $.statement_block),
120120
),
@@ -123,8 +123,7 @@ module.exports = grammar(HTML, {
123123
placeholder_statement: ($) =>
124124
prec.left(
125125
seq(
126-
alias($._control_flow_start, '@'),
127-
alias('placeholder', $.control_keyword),
126+
alias($.placeholder_start, $.control_keyword),
128127
optional($.placeholder_minimum),
129128
field('body', $.statement_block),
130129
),
@@ -133,19 +132,14 @@ module.exports = grammar(HTML, {
133132
loading_statement: ($) =>
134133
prec.left(
135134
seq(
136-
alias($._control_flow_start, '@'),
137-
alias('loading', $.control_keyword),
135+
alias($.loading_start, $.control_keyword),
138136
optional($.loading_condition),
139137
field('body', $.statement_block),
140138
),
141139
),
142140

143141
error_statement: ($) =>
144-
seq(
145-
alias($._control_flow_start, '@'),
146-
alias('error', $.control_keyword),
147-
field('body', $.statement_block),
148-
),
142+
seq(alias($.error_start, $.control_keyword), field('body', $.statement_block)),
149143

150144
defer_trigger: ($) =>
151145
seq(
@@ -185,8 +179,7 @@ module.exports = grammar(HTML, {
185179
for_statement: ($) =>
186180
prec.left(
187181
seq(
188-
alias($._control_flow_start, '@'),
189-
alias('for', $.control_keyword),
182+
alias($.for_start, $.control_keyword),
190183
'(',
191184
field('declaration', $.for_declaration),
192185
optional(seq(';', field('reference', $.for_reference))),
@@ -196,11 +189,7 @@ module.exports = grammar(HTML, {
196189
),
197190

198191
empty_statement: ($) =>
199-
seq(
200-
alias($._control_flow_start, '@'),
201-
alias('empty', $.control_keyword),
202-
field('body', $.statement_block),
203-
),
192+
seq(alias($.empty_start, $.control_keyword), field('body', $.statement_block)),
204193

205194
for_declaration: ($) =>
206195
seq(
@@ -220,33 +209,23 @@ module.exports = grammar(HTML, {
220209
),
221210

222211
// ---------- If Statement ----------
223-
if_statement: ($) => prec.right(seq($._if_start_expression, $._if_body_expression)),
224-
225-
else_if_statement: ($) =>
226-
prec.right(seq($._else_if_start_expression, $._if_body_expression)),
227-
228-
else_statement: ($) =>
212+
if_statement: ($) =>
229213
prec.right(
230214
seq(
231-
alias($._control_flow_start, '@'),
232-
alias('else', $.control_keyword),
233-
$.statement_block,
215+
alias($.if_start, $.control_keyword),
216+
'(',
217+
field('condition', $.if_condition),
218+
optional(field('reference', $.if_reference)),
219+
')',
220+
field('consequence', $.statement_block),
221+
optional(repeat($._alternative_statement)),
234222
),
235223
),
236224

237-
_if_start_expression: ($) =>
238-
seq(alias($._control_flow_start, '@'), alias('if', $.control_keyword)),
239-
240-
_else_if_start_expression: ($) =>
241-
seq(
242-
alias($._control_flow_start, '@'),
243-
alias('else', $.control_keyword),
244-
alias('if', $.control_keyword),
245-
),
246-
247-
_if_body_expression: ($) =>
248-
prec.left(
225+
else_if_statement: ($) =>
226+
prec.right(
249227
seq(
228+
alias($.else_if_start, $.control_keyword),
250229
'(',
251230
field('condition', $.if_condition),
252231
optional(field('reference', $.if_reference)),
@@ -255,6 +234,11 @@ module.exports = grammar(HTML, {
255234
),
256235
),
257236

237+
else_statement: ($) =>
238+
prec.right(
239+
seq(alias($.else_start, $.control_keyword), field('body', $.statement_block)),
240+
),
241+
258242
if_condition: ($) => prec.right(PREC.CALL, $._any_expression),
259243
if_reference: ($) => seq(';', alias('as', $.special_keyword), $.identifier),
260244

@@ -573,7 +557,15 @@ module.exports = grammar(HTML, {
573557
seq(
574558
field('object', $._primitive),
575559
'[',
576-
field('property', choice($.identifier, $.static_member_expression, $.bracket_expression, $.member_expression)),
560+
field(
561+
'property',
562+
choice(
563+
$.identifier,
564+
$.static_member_expression,
565+
$.bracket_expression,
566+
$.member_expression,
567+
),
568+
),
577569
']',
578570
),
579571
),

0 commit comments

Comments
 (0)