Skip to content

Commit 486979e

Browse files
authored
[C#] Support C#14 extension members (#4343)
1 parent a9cf097 commit 486979e

File tree

2 files changed

+142
-11
lines changed

2 files changed

+142
-11
lines changed

C#/C#.sublime-syntax

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,21 @@ contexts:
441441
2: entity.name.interface.cs
442442
push: [interface_signature, data_type_constraint, data_type_parameter]
443443

444+
extension_declaration:
445+
- match: \bextension\b
446+
scope: keyword.declaration.trait.cs
447+
push: extension_declaration_maybe_generic
448+
449+
extension_declaration_maybe_generic:
450+
- match: '<'
451+
scope: meta.generic.cs punctuation.definition.generic.begin.cs
452+
push: type_argument
453+
- match: \(
454+
scope: punctuation.section.parameters.begin.cs
455+
set: [method_body, method_params]
456+
- match: (?=\S)
457+
pop: true
458+
444459
delegate_declaration:
445460
- match: \b(delegate)\b\s+
446461
captures:
@@ -575,6 +590,7 @@ contexts:
575590
- include: class_declaration
576591
- include: interface_declaration
577592
- include: delegate_declaration
593+
- include: extension_declaration
578594
- include: method_declaration
579595
- include: stray_close_bracket
580596

@@ -926,24 +942,28 @@ contexts:
926942
set:
927943
- meta_content_scope: meta.method.cs
928944
- include: line_of_code_in
929-
- match: '(?=\{)'
930-
set:
931-
- match: \{
932-
scope: punctuation.section.block.begin.cs
933-
set:
934-
- meta_scope: meta.method.body.cs meta.block.cs
935-
- match: \}
936-
scope: punctuation.section.block.end.cs
937-
pop: true
938-
- include: stray_close_bracket
939-
- include: code_block_in
945+
- match: (?=\{)
946+
set: method_body_brace_begin
940947
- match: ;
941948
scope: punctuation.terminator.statement.cs
942949
pop: true
943950
- match: \S+
944951
scope: invalid.illegal.cs
945952
pop: true
946953

954+
method_body_brace_begin:
955+
- match: \{
956+
scope: punctuation.section.block.begin.cs
957+
set: method_body_braces_inside
958+
959+
method_body_braces_inside:
960+
- meta_scope: meta.method.body.cs meta.block.cs
961+
- match: \}
962+
scope: punctuation.section.block.end.cs
963+
pop: true
964+
- include: stray_close_bracket
965+
- include: code_block_in
966+
947967
method_accessor:
948968
- meta_scope: meta.property.cs
949969
- match: \{

C#/tests/syntax_test_C#14.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// SYNTAX TEST "Packages/C#/C#.sublime-syntax"
2+
3+
namespace CustomExtensionMembers;
4+
5+
public static class MyExtensions
6+
{
7+
extension(string str)
8+
//^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs
9+
// ^^^^^^^^^ keyword.declaration.trait.cs
10+
// ^ punctuation.section.parameters.begin.cs
11+
// ^^^^^^^^^^^ meta.method.parameters.cs
12+
// ^^^^^^ storage.type.cs
13+
// ^^^ variable.parameter.cs
14+
// ^ punctuation.section.parameters.end.cs
15+
{
16+
// ^ meta.block.cs punctuation.section.block.begin.cs
17+
public int WordCount() =>
18+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs meta.method.body.cs meta.block.cs
19+
// ^^^^^^ storage.modifier.access.cs
20+
// ^^^ storage.type.cs
21+
// ^^^^^^^^^ meta.method.cs entity.name.function.cs
22+
// ^^ meta.method.parameters.cs
23+
// ^ punctuation.section.parameters.begin.cs
24+
// ^ punctuation.section.parameters.end.cs
25+
// ^^^ meta.method.cs
26+
// ^^ keyword.declaration.function.arrow.cs
27+
str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;
28+
}
29+
}
30+
31+
32+
public static class IntExtensions
33+
{
34+
extension(int number)
35+
{
36+
public void Increment()
37+
=> number++;
38+
}
39+
40+
// Take note of the extra ref keyword here
41+
extension(ref int number)
42+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs
43+
// ^^^^^^^^^ keyword.declaration.trait.cs
44+
// ^^^^^^^^^^^^^^^^ meta.method.cs
45+
// ^ punctuation.section.parameters.begin.cs
46+
// ^^^^^^^^^^^^^^^ meta.method.parameters.cs
47+
// ^^^ storage.modifier.parameter.cs
48+
// ^^^ storage.type.cs
49+
// ^^^^^^ variable.parameter.cs
50+
// ^ punctuation.section.parameters.end.cs
51+
{
52+
public void RefIncrement()
53+
=> number++;
54+
//^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs meta.method.body.cs meta.block.cs
55+
//^^^^^^^^^^^^^^^^^^^^^ meta.method.cs
56+
// ^^ keyword.declaration.function.arrow.cs
57+
// ^^^^^^ variable.other.cs
58+
// ^^ keyword.operator.cs
59+
// ^ punctuation.terminator.statement.cs
60+
}
61+
}
62+
63+
public static class EnumerableExtensions
64+
{
65+
extension<T>(IEnumerable<T> target)
66+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs
67+
// ^^^^^^^^^ keyword.declaration.trait.cs
68+
// ^^^ meta.generic.cs
69+
// ^ punctuation.definition.generic.begin.cs
70+
// ^ support.type.cs
71+
// ^ punctuation.definition.generic.end.cs
72+
// ^^^^^^^^^^^^^^^^^^^^^^^ meta.method.cs
73+
// ^ punctuation.section.parameters.begin.cs
74+
// ^^^^^^^^^^^^^^^^^^^^^^ meta.method.parameters.cs
75+
// ^^^^^^^^^^^ support.type.cs
76+
// ^^^ meta.generic.cs
77+
// ^ punctuation.definition.generic.begin.cs
78+
// ^ support.type.cs
79+
// ^ punctuation.definition.generic.end.cs
80+
// ^^^^^^ variable.parameter.cs
81+
// ^ punctuation.section.parameters.end.cs
82+
{
83+
// ^^ meta.class.body.cs meta.block.cs
84+
// ^ meta.method.cs
85+
// ^ meta.method.body.cs meta.block.cs punctuation.section.block.begin.cs
86+
public bool IsEmpty() => !target.Any();
87+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.body.cs meta.block.cs meta.method.body.cs meta.block.cs
88+
// ^^^^^^ storage.modifier.access.cs
89+
// ^^^^ storage.type.cs
90+
// ^^^^^^^ meta.method.cs entity.name.function.cs
91+
// ^^ meta.method.parameters.cs
92+
// ^ punctuation.section.parameters.begin.cs
93+
// ^ punctuation.section.parameters.end.cs
94+
// ^^^^^^^^^^^^^^^^^ meta.method.cs
95+
// ^^ keyword.declaration.function.arrow.cs
96+
// ^ keyword.operator.cs
97+
// ^^^^^^ variable.other.cs
98+
// ^ punctuation.accessor.dot.cs
99+
// ^^^^^ meta.function-call.cs
100+
// ^^^ variable.function.cs
101+
// ^^ meta.group.cs
102+
// ^ punctuation.section.group.begin.cs
103+
// ^ punctuation.section.group.end.cs
104+
// ^ punctuation.terminator.statement.cs
105+
}
106+
// ^^ meta.class.body.cs meta.block.cs meta.method.body.cs meta.block.cs
107+
// ^ punctuation.section.block.end.cs
108+
}
109+
// <- meta.class.body.cs meta.block.cs punctuation.section.block.end.cs
110+
111+
// <- - meta.block

0 commit comments

Comments
 (0)