Skip to content

Commit 2bc6ca9

Browse files
Merge pull request dotnet#70 from DustinCampbell/issue-69
Properly highlight throw expressions
2 parents f7d0692 + e7f564b commit 2bc6ca9

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

grammars/csharp.tmLanguage

+26
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@
371371
<key>include</key>
372372
<string>#nameof-expression</string>
373373
</dict>
374+
<dict>
375+
<key>include</key>
376+
<string>#throw-expression</string>
377+
</dict>
374378
<dict>
375379
<key>include</key>
376380
<string>#interpolated-string</string>
@@ -3904,6 +3908,28 @@
39043908
</dict>
39053909
</array>
39063910
</dict>
3911+
<key>throw-expression</key>
3912+
<dict>
3913+
<key>begin</key>
3914+
<string>(?&lt;!\.)\b(throw)\b</string>
3915+
<key>beginCaptures</key>
3916+
<dict>
3917+
<key>1</key>
3918+
<dict>
3919+
<key>name</key>
3920+
<string>keyword.control.flow.throw.cs</string>
3921+
</dict>
3922+
</dict>
3923+
<key>end</key>
3924+
<string>(?=;)</string>
3925+
<key>patterns</key>
3926+
<array>
3927+
<dict>
3928+
<key>include</key>
3929+
<string>#expression</string>
3930+
</dict>
3931+
</array>
3932+
</dict>
39073933
<key>interpolated-string</key>
39083934
<dict>
39093935
<key>name</key>

grammars/csharp.tmLanguage.cson

+14
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,9 @@ repository:
261261
{
262262
include: "#nameof-expression"
263263
}
264+
{
265+
include: "#throw-expression"
266+
}
264267
{
265268
include: "#interpolated-string"
266269
}
@@ -2383,6 +2386,17 @@ repository:
23832386
include: "#expression"
23842387
}
23852388
]
2389+
"throw-expression":
2390+
begin: "(?<!\\.)\\b(throw)\\b"
2391+
beginCaptures:
2392+
"1":
2393+
name: "keyword.control.flow.throw.cs"
2394+
end: "(?=;)"
2395+
patterns: [
2396+
{
2397+
include: "#expression"
2398+
}
2399+
]
23862400
"interpolated-string":
23872401
name: "string.quoted.double.cs"
23882402
begin: "\\$\""

src/csharp.tmLanguage.yml

+9
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ repository:
108108
- include: '#checked-unchecked-expression'
109109
- include: '#typeof-or-default-expression'
110110
- include: '#nameof-expression'
111+
- include: '#throw-expression'
111112
- include: '#interpolated-string'
112113
- include: '#verbatim-interpolated-string'
113114
- include: '#this-or-base-expression'
@@ -1488,6 +1489,14 @@ repository:
14881489
patterns:
14891490
- include: '#expression'
14901491

1492+
throw-expression:
1493+
begin: (?<!\.)\b(throw)\b
1494+
beginCaptures:
1495+
'1': { name: keyword.control.flow.throw.cs }
1496+
end: (?=;)
1497+
patterns:
1498+
- include: '#expression'
1499+
14911500
interpolated-string:
14921501
name: string.quoted.double.cs
14931502
begin: '\$"'

test/expressions.tests.ts

+47
Original file line numberDiff line numberDiff line change
@@ -3027,7 +3027,54 @@ private static readonly Parser<Node> NodeParser =
30273027
Token.Punctuation.Semicolon
30283028
]);
30293029
});
3030+
});
3031+
3032+
describe("Throw expressions", () => {
3033+
it("throw expression in expression-bodied member (issue #69)", () => {
3034+
const input = Input.InClass(`public static void A(string str) => throw new Exception(str);`);
3035+
const tokens = tokenize(input);
30303036

3037+
tokens.should.deep.equal([
3038+
Token.Keywords.Modifiers.Public,
3039+
Token.Keywords.Modifiers.Static,
3040+
Token.PrimitiveType.Void,
3041+
Token.Identifiers.MethodName("A"),
3042+
Token.Punctuation.OpenParen,
3043+
Token.PrimitiveType.String,
3044+
Token.Identifiers.ParameterName("str"),
3045+
Token.Punctuation.CloseParen,
3046+
Token.Operators.Arrow,
3047+
Token.Keywords.Control.Throw,
3048+
Token.Keywords.New,
3049+
Token.Type("Exception"),
3050+
Token.Punctuation.OpenParen,
3051+
Token.Variables.ReadWrite("str"),
3052+
Token.Punctuation.CloseParen,
3053+
Token.Punctuation.Semicolon
3054+
]);
3055+
});
3056+
3057+
it("throw expression in assignment", () => {
3058+
const input = Input.InMethod(`_field = field ?? throw new ArgumentNullException(nameof(field));`);
3059+
const tokens = tokenize(input);
3060+
3061+
tokens.should.deep.equal([
3062+
Token.Variables.ReadWrite("_field"),
3063+
Token.Operators.Assignment,
3064+
Token.Variables.ReadWrite("field"),
3065+
Token.Operators.NullCoalescing,
3066+
Token.Keywords.Control.Throw,
3067+
Token.Keywords.New,
3068+
Token.Type("ArgumentNullException"),
3069+
Token.Punctuation.OpenParen,
3070+
Token.Keywords.NameOf,
3071+
Token.Punctuation.OpenParen,
3072+
Token.Variables.ReadWrite("field"),
3073+
Token.Punctuation.CloseParen,
3074+
Token.Punctuation.CloseParen,
3075+
Token.Punctuation.Semicolon
3076+
]);
3077+
});
30313078
});
30323079
});
30333080
});

0 commit comments

Comments
 (0)