Skip to content

Commit 07f27d5

Browse files
committed
Expose brackets and template tag name
Some editor features requires the abillity to capture the brackets independent from the tag name. e.g. Zed captures `<` as brackets and highlight them different from the tag name. It uses it to highlight the opposite opening/closing pair when the cursor is on one of the brackets.
1 parent 7eb9046 commit 07f27d5

File tree

6 files changed

+43404
-43615
lines changed

6 files changed

+43404
-43615
lines changed

grammar.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ function noJSX(obj) {
1010
return;
1111
}
1212

13-
if (typeof obj === 'object') {
13+
if (typeof obj === "object") {
1414
if (obj === null) return;
1515

16-
if (obj.type === 'CHOICE' && Array.isArray(obj.members)) {
17-
obj.members = obj.members.filter(member => {
16+
if (obj.type === "CHOICE" && Array.isArray(obj.members)) {
17+
obj.members = obj.members.filter((member) => {
1818
if (!member.name) return true;
1919

20-
return !member.name.includes('jsx');
20+
return !member.name.includes("jsx");
2121
});
2222

2323
noJSX(obj.members);
2424
return;
2525
}
2626

2727
for (let [key, value] of Object.entries(obj)) {
28-
if (key.includes('jsx')) {
28+
if (key.includes("jsx")) {
2929
delete obj[key];
3030
} else {
3131
noJSX(value);
@@ -62,15 +62,15 @@ module.exports = grammar(JavaScript, {
6262
* https://github.com/emberjs/rfcs/
6363
*/
6464
glimmer_template: ($) =>
65-
seq(
66-
field("open_tag", $.glimmer_opening_tag),
67-
optional(alias(repeat($._glimmer_template_content), $.raw_text)),
68-
field("close_tag", $.glimmer_closing_tag),
69-
),
65+
seq(
66+
field("open_tag", $.glimmer_opening_tag),
67+
optional($.raw_text),
68+
field("close_tag", $.glimmer_closing_tag),
69+
),
7070

71-
_glimmer_template_content: (_) => /.{1,}/,
72-
glimmer_opening_tag: (_) => "<template>",
73-
glimmer_closing_tag: (_) => "</template>",
71+
glimmer_opening_tag: ($) => seq("<", $.glimmer_template_tag_name, ">"),
72+
glimmer_closing_tag: ($) => seq("</", $.glimmer_template_tag_name, ">"),
73+
glimmer_template_tag_name: (_) => "template",
7474

7575
/**
7676
* 2. Any Expression.

src/grammar.json

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,16 +2409,8 @@
24092409
"type": "CHOICE",
24102410
"members": [
24112411
{
2412-
"type": "ALIAS",
2413-
"content": {
2414-
"type": "REPEAT",
2415-
"content": {
2416-
"type": "SYMBOL",
2417-
"name": "_glimmer_template_content"
2418-
}
2419-
},
2420-
"named": true,
2421-
"value": "raw_text"
2412+
"type": "SYMBOL",
2413+
"name": "raw_text"
24222414
},
24232415
{
24242416
"type": "BLANK"
@@ -2440,12 +2432,38 @@
24402432
"value": ".{1,}"
24412433
},
24422434
"glimmer_opening_tag": {
2443-
"type": "STRING",
2444-
"value": "<template>"
2435+
"type": "SEQ",
2436+
"members": [
2437+
{
2438+
"type": "STRING",
2439+
"value": "<"
2440+
},
2441+
{
2442+
"type": "SYMBOL",
2443+
"name": "glimmer_template_tag_name"
2444+
},
2445+
{
2446+
"type": "STRING",
2447+
"value": ">"
2448+
}
2449+
]
24452450
},
24462451
"glimmer_closing_tag": {
2447-
"type": "STRING",
2448-
"value": "</template>"
2452+
"type": "SEQ",
2453+
"members": [
2454+
{
2455+
"type": "STRING",
2456+
"value": "</"
2457+
},
2458+
{
2459+
"type": "SYMBOL",
2460+
"name": "glimmer_template_tag_name"
2461+
},
2462+
{
2463+
"type": "STRING",
2464+
"value": ">"
2465+
}
2466+
]
24492467
},
24502468
"html_character_reference": {
24512469
"type": "PATTERN",
@@ -6221,6 +6239,10 @@
62216239
"value": ";"
62226240
}
62236241
]
6242+
},
6243+
"glimmer_template_tag_name": {
6244+
"type": "STRING",
6245+
"value": "template"
62246246
}
62256247
},
62266248
"extras": [

src/node-types.json

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,6 +1616,36 @@
16161616
}
16171617
}
16181618
},
1619+
{
1620+
"type": "glimmer_closing_tag",
1621+
"named": true,
1622+
"fields": {},
1623+
"children": {
1624+
"multiple": false,
1625+
"required": true,
1626+
"types": [
1627+
{
1628+
"type": "glimmer_template_tag_name",
1629+
"named": true
1630+
}
1631+
]
1632+
}
1633+
},
1634+
{
1635+
"type": "glimmer_opening_tag",
1636+
"named": true,
1637+
"fields": {},
1638+
"children": {
1639+
"multiple": false,
1640+
"required": true,
1641+
"types": [
1642+
{
1643+
"type": "glimmer_template_tag_name",
1644+
"named": true
1645+
}
1646+
]
1647+
}
1648+
},
16191649
{
16201650
"type": "glimmer_template",
16211651
"named": true,
@@ -2252,11 +2282,6 @@
22522282
]
22532283
}
22542284
},
2255-
{
2256-
"type": "raw_text",
2257-
"named": true,
2258-
"fields": {}
2259-
},
22602285
{
22612286
"type": "regex",
22622287
"named": true,
@@ -2989,6 +3014,10 @@
29893014
"type": "<",
29903015
"named": false
29913016
},
3017+
{
3018+
"type": "</",
3019+
"named": false
3020+
},
29923021
{
29933022
"type": "<<",
29943023
"named": false
@@ -3174,11 +3203,7 @@
31743203
"named": false
31753204
},
31763205
{
3177-
"type": "glimmer_closing_tag",
3178-
"named": true
3179-
},
3180-
{
3181-
"type": "glimmer_opening_tag",
3206+
"type": "glimmer_template_tag_name",
31823207
"named": true
31833208
},
31843209
{
@@ -3245,6 +3270,10 @@
32453270
"type": "property_identifier",
32463271
"named": true
32473272
},
3273+
{
3274+
"type": "raw_text",
3275+
"named": true
3276+
},
32483277
{
32493278
"type": "regex_flags",
32503279
"named": true

0 commit comments

Comments
 (0)