Skip to content

Commit 4407e8d

Browse files
committed
Allow _ in jsx attribute names
Fixes #648
1 parent e2db601 commit 4407e8d

File tree

4 files changed

+121
-13
lines changed

4 files changed

+121
-13
lines changed

TypeScriptReact.YAML-tmLanguage

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ uuid: 805375ec-d614-41f5-8993-5843fe63ea82
1111
variables:
1212
#possiblyMultilineArrowExpressionBeforeEndOfLine: ({{typeParameters}})?\(
1313
possiblyMultilineArrow: ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) # during lookup treat ( followed by line end as arrow
14-
jsxTagOrAtrributeIdentifier: '[_$[:alpha:]][-$[:alnum:].]*'
14+
jsxTagOrAtrributeIdentifier: '[_$[:alpha:]][-_$[:alnum:].]*'
1515
jsxTagNamespace: (?:({{jsxTagOrAtrributeIdentifier}})(?<!\.|-)(:))?
1616
jsxTagName: \s*{{jsxTagNamespace}}((?:[a-z][a-z0-9]*|({{jsxTagOrAtrributeIdentifier}}))(?<!\.|-))
1717
jsxOpeningTagWithoutAttributes: (<){{jsxTagName}}?\s*(>)
@@ -164,7 +164,7 @@ repository:
164164
(?x)
165165
\s*
166166
(?:({{jsxTagOrAtrributeIdentifier}})(:))?
167-
([_$[:alpha:]][-$[:alnum:]]*)
167+
([_$[:alpha:]][-_$[:alnum:]]*)
168168
(?=\s|=|/?>|/\*|//)
169169
captures:
170170
'1': {name: entity.other.attribute-name.namespace.tsx}

TypeScriptReact.tmLanguage

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8317,9 +8317,9 @@
83178317
<key>jsx-tag-without-attributes-in-expression</key>
83188318
<dict>
83198319
<key>begin</key>
8320-
<string>(?&lt;!\+\+|--)(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
8320+
<string>(?&lt;!\+\+|--)(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
83218321
<key>end</key>
8322-
<string>(?!(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
8322+
<string>(?!(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
83238323
<key>patterns</key>
83248324
<array>
83258325
<dict>
@@ -8333,9 +8333,9 @@
83338333
<key>name</key>
83348334
<string>meta.tag.without-attributes.tsx</string>
83358335
<key>begin</key>
8336-
<string>(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;)</string>
8336+
<string>(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;)</string>
83378337
<key>end</key>
8338-
<string>(&lt;/)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;)</string>
8338+
<string>(&lt;/)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;)</string>
83398339
<key>beginCaptures</key>
83408340
<dict>
83418341
<key>1</key>
@@ -8418,9 +8418,9 @@
84188418
<string>(?x)
84198419
(?&lt;!\+\+|--)(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*
84208420
(?!&lt;\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=&gt;])|,)) # look ahead is not type parameter of arrow
8421-
(?=(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
8421+
(?=(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
84228422
<key>end</key>
8423-
<string>(?!(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
8423+
<string>(?!(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
84248424
<key>patterns</key>
84258425
<array>
84268426
<dict>
@@ -8434,9 +8434,9 @@
84348434
<key>name</key>
84358435
<string>meta.tag.tsx</string>
84368436
<key>begin</key>
8437-
<string>(?=(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
8437+
<string>(?=(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;))</string>
84388438
<key>end</key>
8439-
<string>(/&gt;)|(?:(&lt;/)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
8439+
<string>(/&gt;)|(?:(&lt;/)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))?\s*(&gt;))</string>
84408440
<key>endCaptures</key>
84418441
<dict>
84428442
<key>1</key>
@@ -8479,7 +8479,7 @@
84798479
<array>
84808480
<dict>
84818481
<key>begin</key>
8482-
<string>(&lt;)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;)</string>
8482+
<string>(&lt;)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?&lt;!\.|-))(?=((&lt;\s*)|(\s+))(?!\?)|\/?&gt;)</string>
84838483
<key>beginCaptures</key>
84848484
<dict>
84858485
<key>1</key>
@@ -8681,8 +8681,8 @@
86818681
<key>match</key>
86828682
<string>(?x)
86838683
\s*
8684-
(?:([_$[:alpha:]][-$[:alnum:].]*)(:))?
8685-
([_$[:alpha:]][-$[:alnum:]]*)
8684+
(?:([_$[:alpha:]][-_$[:alnum:].]*)(:))?
8685+
([_$[:alpha:]][-_$[:alnum:]]*)
86868686
(?=\s|=|/?&gt;|/\*|//)</string>
86878687
<key>captures</key>
86888688
<dict>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
original file
2+
-----------------------------------
3+
<Test
4+
a=''
5+
b_c='111'
6+
d=''
7+
/>
8+
-----------------------------------
9+
10+
Grammar: TypeScriptReact.tmLanguage
11+
-----------------------------------
12+
><Test
13+
^
14+
source.tsx meta.tag.tsx punctuation.definition.tag.begin.tsx
15+
^^^^
16+
source.tsx meta.tag.tsx entity.name.tag.tsx support.class.component.tsx
17+
> a=''
18+
^^^^
19+
source.tsx meta.tag.tsx meta.tag.attributes.tsx
20+
^
21+
source.tsx meta.tag.tsx meta.tag.attributes.tsx entity.other.attribute-name.tsx
22+
^
23+
source.tsx meta.tag.tsx meta.tag.attributes.tsx keyword.operator.assignment.tsx
24+
^
25+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.begin.tsx
26+
^
27+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.end.tsx
28+
> b_c='111'
29+
^^^^
30+
source.tsx meta.tag.tsx meta.tag.attributes.tsx
31+
^^^
32+
source.tsx meta.tag.tsx meta.tag.attributes.tsx entity.other.attribute-name.tsx
33+
^
34+
source.tsx meta.tag.tsx meta.tag.attributes.tsx keyword.operator.assignment.tsx
35+
^
36+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.begin.tsx
37+
^^^
38+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx
39+
^
40+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.end.tsx
41+
> d=''
42+
^^^^
43+
source.tsx meta.tag.tsx meta.tag.attributes.tsx
44+
^
45+
source.tsx meta.tag.tsx meta.tag.attributes.tsx entity.other.attribute-name.tsx
46+
^
47+
source.tsx meta.tag.tsx meta.tag.attributes.tsx keyword.operator.assignment.tsx
48+
^
49+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.begin.tsx
50+
^
51+
source.tsx meta.tag.tsx meta.tag.attributes.tsx string.quoted.single.tsx punctuation.definition.string.end.tsx
52+
>/>
53+
^^
54+
source.tsx meta.tag.tsx punctuation.definition.tag.end.tsx
55+
56+
57+
Grammar: TypeScript.tmLanguage
58+
-----------------------------------
59+
><Test
60+
^
61+
source.ts keyword.operator.relational.ts
62+
^^^^
63+
source.ts variable.other.readwrite.ts
64+
> a=''
65+
^^^^
66+
source.ts
67+
^
68+
source.ts variable.other.readwrite.ts
69+
^
70+
source.ts keyword.operator.assignment.ts
71+
^
72+
source.ts string.quoted.single.ts punctuation.definition.string.begin.ts
73+
^
74+
source.ts string.quoted.single.ts punctuation.definition.string.end.ts
75+
> b_c='111'
76+
^^^^
77+
source.ts
78+
^^^
79+
source.ts variable.other.readwrite.ts
80+
^
81+
source.ts keyword.operator.assignment.ts
82+
^
83+
source.ts string.quoted.single.ts punctuation.definition.string.begin.ts
84+
^^^
85+
source.ts string.quoted.single.ts
86+
^
87+
source.ts string.quoted.single.ts punctuation.definition.string.end.ts
88+
> d=''
89+
^^^^
90+
source.ts
91+
^
92+
source.ts variable.other.readwrite.ts
93+
^
94+
source.ts keyword.operator.assignment.ts
95+
^
96+
source.ts string.quoted.single.ts punctuation.definition.string.begin.ts
97+
^
98+
source.ts string.quoted.single.ts punctuation.definition.string.end.ts
99+
>/>
100+
^
101+
source.ts keyword.operator.arithmetic.ts
102+
^
103+
source.ts keyword.operator.relational.ts

tests/cases/Issues648.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<Test
2+
a=''
3+
b_c='111'
4+
d=''
5+
/>

0 commit comments

Comments
 (0)