Skip to content

Commit 53d555b

Browse files
committed
Fix the incorrect look behinds of cast expression when property name is yield
Fixes #562
1 parent 74789e0 commit 53d555b

File tree

7 files changed

+320
-39
lines changed

7 files changed

+320
-39
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ variables:
1616
nonIdentifierPropertyName: '{{quotedStrings}}|(\[([^\[\]]|\[[^\[\]]*\])+\])'
1717
propertyName: (({{identifier}})|{{nonIdentifierPropertyName}})
1818
constantVar: ({{constantIdentifier}})(?![_$[:alnum:]])
19+
nonPropertyLookBehind: '[^\._$[:alnum:]]'
20+
lookBehindReturn: '^return|{{nonPropertyLookBehind}}return'
21+
lookBehindThrow: '^throw|{{nonPropertyLookBehind}}throw'
22+
lookBehindYield: '^yield|{{nonPropertyLookBehind}}yield'
23+
lookBehindAwait: '^await|{{nonPropertyLookBehind}}await'
24+
lookBehindDefault: '^default|{{nonPropertyLookBehind}}default'
25+
lookBehindIn: '^in|{{nonPropertyLookBehind}}in'
26+
lookBehindOf: '^of|{{nonPropertyLookBehind}}of'
27+
lookBehindTypeof: '^typeof|{{nonPropertyLookBehind}}typeof'
28+
lookBehindCase: '^case|{{nonPropertyLookBehind}}case'
1929
matchingParenthesis: (\([^\(\)]*\))
2030
# Identifier start | matching braces | matching parenthesis | matching square brackets
2131
typeParamersStart: ([_$[:alpha:]]|(\{[^\{\}]*\})|{{matchingParenthesis}}|(\[[^\[\]]*\]))
@@ -226,14 +236,14 @@ repository:
226236
destructuring-variable:
227237
patterns:
228238
- name: meta.object-binding-pattern-variable.ts
229-
begin: (?<!=|:|of|in)\s*(?=\{)
239+
begin: (?<!=|:|{{lookBehindOf}}|{{lookBehindIn}})\s*(?=\{)
230240
end: (?=$|^|[;,=}]|(\s+(of|in)\s+))
231241
patterns:
232242
- include: '#object-binding-pattern'
233243
- include: '#type-annotation'
234244
- include: '#comment'
235245
- name: meta.array-binding-pattern-variable.ts
236-
begin: (?<!=|:|of|in)\s*(?=\[)
246+
begin: (?<!=|:|{{lookBehindOf}}|{{lookBehindIn}})\s*(?=\[)
237247
end: (?=$|^|[;,=}]|(\s+(of|in)\s+))
238248
patterns:
239249
- include: '#array-binding-pattern'
@@ -965,7 +975,7 @@ repository:
965975
#object literals
966976
after-operator-block-as-object-literal:
967977
name: meta.objectliteral.ts
968-
begin: (?<=[=(,\[?+!]|await|return|yield|throw|in|of|typeof|&&|\|\||\*)\s*(\{)
978+
begin: (?<=[=(,\[?+!]|{{lookBehindAwait}}|{{lookBehindReturn}}|{{lookBehindYield}}|{{lookBehindThrow}}|{{lookBehindIn}}|{{lookBehindOf}}|{{lookBehindTypeof}}|&&|\|\||\*)\s*(\{)
969979
beginCaptures:
970980
'1': { name: punctuation.definition.block.ts }
971981
end: \}
@@ -1113,7 +1123,7 @@ repository:
11131123
# If '<' is preceeded by 'return', 'throw', 'yield', or 'await', it's most likely a type assertion
11141124
# If '=', '(', ',', ':', or '>' are followed by a '<', it is also likely a type assertion as otherwise it would be a syntax error
11151125
# '<=' and '<<=' are cannot be type assertions, as they are assignment operators.
1116-
begin: (?:(?<=return|throw|yield|await|default|[=(,:>*?\&\|\^]|[^_$[:alnum:]](?:\+\+|\-\-)|[^\+]\+|[^\-]\-))\s*(<)(?!<?\=)
1126+
begin: (?:(?<={{lookBehindReturn}}|{{lookBehindThrow}}|{{lookBehindYield}}|{{lookBehindAwait}}|{{lookBehindDefault}}|[=(,:>*?\&\|\^]|[^_$[:alnum:]](?:\+\+|\-\-)|[^\+]\+|[^\-]\-))\s*(<)(?!<?\=)
11171127
beginCaptures:
11181128
'1': { name: meta.brace.angle.ts }
11191129
end: (\>)\s*
@@ -1951,7 +1961,7 @@ repository:
19511961
regex:
19521962
patterns:
19531963
- name: string.regexp.ts
1954-
begin: (?<=[=(:,\[?+!]|return|case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))
1964+
begin: (?<=[=(:,\[?+!]|{{lookBehindReturn}}|{{lookBehindCase}}|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))
19551965
beginCaptures:
19561966
'1': {name: punctuation.definition.string.begin.ts}
19571967
end: (/)([gimuy]*)

TypeScript.tmLanguage

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@
538538
<key>name</key>
539539
<string>meta.object-binding-pattern-variable.ts</string>
540540
<key>begin</key>
541-
<string>(?&lt;!=|:|of|in)\s*(?=\{)</string>
541+
<string>(?&lt;!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)</string>
542542
<key>end</key>
543543
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
544544
<key>patterns</key>
@@ -561,7 +561,7 @@
561561
<key>name</key>
562562
<string>meta.array-binding-pattern-variable.ts</string>
563563
<key>begin</key>
564-
<string>(?&lt;!=|:|of|in)\s*(?=\[)</string>
564+
<string>(?&lt;!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)</string>
565565
<key>end</key>
566566
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
567567
<key>patterns</key>
@@ -2979,7 +2979,7 @@
29792979
<key>name</key>
29802980
<string>meta.objectliteral.ts</string>
29812981
<key>begin</key>
2982-
<string>(?&lt;=[=(,\[?+!]|await|return|yield|throw|in|of|typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
2982+
<string>(?&lt;=[=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
29832983
<key>beginCaptures</key>
29842984
<dict>
29852985
<key>1</key>
@@ -3441,7 +3441,7 @@
34413441
<key>name</key>
34423442
<string>cast.expr.ts</string>
34433443
<key>begin</key>
3444-
<string>(?:(?&lt;=return|throw|yield|await|default|[=(,:&gt;*?\&amp;\|\^]|[^_$[:alnum:]](?:\+\+|\-\-)|[^\+]\+|[^\-]\-))\s*(&lt;)(?!&lt;?\=)</string>
3444+
<string>(?:(?&lt;=^return|[^\._$[:alnum:]]return|^throw|[^\._$[:alnum:]]throw|^yield|[^\._$[:alnum:]]yield|^await|[^\._$[:alnum:]]await|^default|[^\._$[:alnum:]]default|[=(,:&gt;*?\&amp;\|\^]|[^_$[:alnum:]](?:\+\+|\-\-)|[^\+]\+|[^\-]\-))\s*(&lt;)(?!&lt;?\=)</string>
34453445
<key>beginCaptures</key>
34463446
<dict>
34473447
<key>1</key>
@@ -5463,7 +5463,7 @@
54635463
<key>name</key>
54645464
<string>string.regexp.ts</string>
54655465
<key>begin</key>
5466-
<string>(?&lt;=[=(:,\[?+!]|return|case|=&gt;|&amp;&amp;|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))</string>
5466+
<string>(?&lt;=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=&gt;|&amp;&amp;|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))</string>
54675467
<key>beginCaptures</key>
54685468
<dict>
54695469
<key>1</key>

TypeScriptReact.YAML-tmLanguage

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ repository:
3333
jsx-tag-without-attributes-in-expression:
3434
begin: |-
3535
(?x)
36-
(?<=[({\[,?=>:*]|&&|\|\||\?|\Wreturn|^return|\Wdefault|^)\s*
36+
(?<=[({\[,?=>:*]|&&|\|\||\?|{{lookBehindReturn}}|{{lookBehindDefault}}|^)\s*
3737
(?=(<)\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?<!\.|-))?\s*(>))
3838
end: (?!\s*(<)\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?<!\.|-))?\s*(>))
3939
patterns:
@@ -61,7 +61,7 @@ repository:
6161
# We need to differentiate between the relational '<' operator and the beginning of a tag using the surrounding context.
6262
begin: |-
6363
(?x)
64-
(?<=[({\[,?=>:*]|&&|\|\||\?|\Wreturn|^return|\Wdefault|^)\s*
64+
(?<=[({\[,?=>:*]|&&|\|\||\?|{{lookBehindReturn}}|{{lookBehindDefault}}|^)\s*
6565
(?!<\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=>])|,)) # look ahead is not type parameter of arrow
6666
(?=(<)\s*
6767
([_$a-zA-Z][-$\w.]*(?<!\.|-))

TypeScriptReact.tmLanguage

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@
542542
<key>name</key>
543543
<string>meta.object-binding-pattern-variable.tsx</string>
544544
<key>begin</key>
545-
<string>(?&lt;!=|:|of|in)\s*(?=\{)</string>
545+
<string>(?&lt;!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)</string>
546546
<key>end</key>
547547
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
548548
<key>patterns</key>
@@ -565,7 +565,7 @@
565565
<key>name</key>
566566
<string>meta.array-binding-pattern-variable.tsx</string>
567567
<key>begin</key>
568-
<string>(?&lt;!=|:|of|in)\s*(?=\[)</string>
568+
<string>(?&lt;!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)</string>
569569
<key>end</key>
570570
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
571571
<key>patterns</key>
@@ -2983,7 +2983,7 @@
29832983
<key>name</key>
29842984
<string>meta.objectliteral.tsx</string>
29852985
<key>begin</key>
2986-
<string>(?&lt;=[=(,\[?+!]|await|return|yield|throw|in|of|typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
2986+
<string>(?&lt;=[=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
29872987
<key>beginCaptures</key>
29882988
<dict>
29892989
<key>1</key>
@@ -5409,7 +5409,7 @@
54095409
<key>name</key>
54105410
<string>string.regexp.tsx</string>
54115411
<key>begin</key>
5412-
<string>(?&lt;=[=(:,\[?+!]|return|case|=&gt;|&amp;&amp;|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))</string>
5412+
<string>(?&lt;=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=&gt;|&amp;&amp;|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/(?![\/*])[gimuy]*(?!\s*[a-zA-Z0-9_$]))</string>
54135413
<key>beginCaptures</key>
54145414
<dict>
54155415
<key>1</key>
@@ -6683,7 +6683,7 @@
66836683
<dict>
66846684
<key>begin</key>
66856685
<string>(?x)
6686-
(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|\Wreturn|^return|\Wdefault|^)\s*
6686+
(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^)\s*
66876687
(?=(&lt;)\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))?\s*(&gt;))</string>
66886688
<key>end</key>
66896689
<string>(?!\s*(&lt;)\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))?\s*(&gt;))</string>
@@ -6763,7 +6763,7 @@
67636763
<dict>
67646764
<key>begin</key>
67656765
<string>(?x)
6766-
(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|\Wreturn|^return|\Wdefault|^)\s*
6766+
(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^)\s*
67676767
(?!&lt;\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=&gt;])|,)) # look ahead is not type parameter of arrow
67686768
(?=(&lt;)\s*
67696769
([_$a-zA-Z][-$\w.]*(?&lt;!\.|-))

build/build.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import fs = require('fs');
22
import path = require('path');
3-
import yaml = require('js-yaml');
3+
import yaml = require('js-yaml');
44
import plist = require('plist');
55

66
function writePlistFile(grammar: any, fileName: string) {
@@ -39,8 +39,8 @@ function transformGrammarRepository(grammar: any, propertyNames: string[], trans
3939
}
4040
}
4141

42-
function changeTsToTsxGrammar(grammar: any) {
43-
const tsxUpdates = readYaml("../TypeScriptReact.YAML-tmLanguage");
42+
function changeTsToTsxGrammar(grammar: any, variables: any) {
43+
const tsxUpdates = updateGrammarVariables(readYaml("../TypeScriptReact.YAML-tmLanguage"), variables);
4444

4545
// Update name, file types, scope name and uuid
4646
for (let key in tsxUpdates) {
@@ -62,7 +62,7 @@ function changeTsToTsxGrammar(grammar: any) {
6262
repository[key].patterns.unshift(updatesRepository[key].patterns[0]);
6363
break;
6464
default:
65-
// Add jsx
65+
// Add jsx
6666
repository[key] = updatesRepository[key];
6767
}
6868
}
@@ -79,33 +79,33 @@ function replacePatternVariables(pattern: string, variableReplacers: VariableRep
7979
}
8080

8181
type VariableReplacer = [RegExp, string];
82-
function updateGrammarVariables(grammar: any) {
83-
if (grammar.variables !== undefined) {
84-
const variables = grammar.variables;
85-
delete grammar.variables;
86-
const variableReplacers: VariableReplacer[] = [];
87-
for (const variableName in variables) {
88-
// Replace the pattern with earlier variables
89-
const pattern = replacePatternVariables(variables[variableName], variableReplacers);
90-
variableReplacers.push([new RegExp(`{{${variableName}}}`, "gim"), pattern]);
91-
}
92-
transformGrammarRepository(
93-
grammar,
94-
["begin", "end", "match"],
95-
pattern => replacePatternVariables(pattern, variableReplacers)
96-
);
82+
function updateGrammarVariables(grammar: any, variables: any) {
83+
delete grammar.variables;
84+
const variableReplacers: VariableReplacer[] = [];
85+
for (const variableName in variables) {
86+
// Replace the pattern with earlier variables
87+
const pattern = replacePatternVariables(variables[variableName], variableReplacers);
88+
variableReplacers.push([new RegExp(`{{${variableName}}}`, "gim"), pattern]);
9789
}
90+
transformGrammarRepository(
91+
grammar,
92+
["begin", "end", "match"],
93+
pattern => replacePatternVariables(pattern, variableReplacers)
94+
);
9895
return grammar;
9996
}
10097

10198
function buildGrammar() {
102-
const tsGrammar = updateGrammarVariables(readYaml("../TypeScript.YAML-tmLanguage"));
99+
const tsGrammarBeforeTransformation = readYaml("../TypeScript.YAML-tmLanguage");
100+
const variables = tsGrammarBeforeTransformation.variables;
101+
102+
const tsGrammar = updateGrammarVariables(tsGrammarBeforeTransformation, variables);
103103

104104
// Write TypeScript.tmLanguage
105105
writePlistFile(tsGrammar, "../TypeScript.tmLanguage");
106106

107107
// Write TypeScriptReact.tmLangauge
108-
const tsxGrammar = changeTsToTsxGrammar(tsGrammar);
108+
const tsxGrammar = changeTsToTsxGrammar(tsGrammar, variables);
109109
writePlistFile(tsxGrammar, "../TypeScriptReact.tmLanguage");
110110
}
111111

0 commit comments

Comments
 (0)