Skip to content

Commit

Permalink
[C#] Add required modifier (#3928)
Browse files Browse the repository at this point in the history
* [C#] Add 'required' keyword

Resolves #3926

This commit adds `required` modifier which has been added by C#11.

see: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/required

* [C#] Less strict readonly keyword matching

This commit scopes `readonly` modifier more lazily to improve
interoperability with `required` keyword.
  • Loading branch information
deathaxe authored Feb 18, 2024
1 parent 44489d0 commit f4092be
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 16 deletions.
25 changes: 11 additions & 14 deletions C#/C#.sublime-syntax
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ variables:
brackets_capture: '((\[)(,*)(\]))'
type_suffix_capture: '(\?)?{{brackets_capture}}?(?:\s*(\*))?'

reserved: '(?:abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|nameof|namespace|new|not|null|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|string|struct|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while)'
reserved: '(?:abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|nameof|namespace|new|not|null|operator|out|override|params|private|protected|public|readonly|ref|required|return|sealed|sizeof|stackalloc|static|string|struct|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while)'
name: '(?:@{{reserved}}|@{{base_type}}|@var|@?{{name_normal}})'
namespaced_name: (?:(?:{{name}}{{generic_declaration}}\s*\.\s*)*{{name}}{{generic_declaration}})

Expand Down Expand Up @@ -225,7 +225,7 @@ contexts:
# allows coloration of code outside a class
- match: (?=\S)
push:
- match: (?={{visibility}}|\b(?:class|delegate|interface|namespace|readonly|record|static)\b)
- match: (?={{visibility}}|\b(?:class|delegate|interface|namespace|readonly|record|required|static)\b)
pop: true
- include: line_of_code

Expand Down Expand Up @@ -334,7 +334,7 @@ contexts:
- include: main

class_declaration:
- match: '\b(static|unsafe|abstract|partial|sealed)\b'
- match: \b(static|unsafe|abstract|partial|readonly|required|sealed)\b
scope: storage.modifier.cs
- match: '{{visibility}}'
scope: storage.modifier.access.cs
Expand All @@ -343,22 +343,19 @@ contexts:
1: keyword.declaration.class.cs
2: entity.name.class.cs
push: [class_signature, data_type_signature]
- match: (?:\b(readonly)\s+)?\b(record)\s+(?:(struct)\s+)?({{name}})
- match: \b(record)\s+(?:(struct)\s+)?({{name}})
captures:
1: storage.modifier.cs
2: keyword.declaration.class.record.cs
3: keyword.declaration.struct.record.cs
4: entity.name.class.cs
1: keyword.declaration.class.record.cs
2: keyword.declaration.struct.record.cs
3: entity.name.class.cs
push: [record_signature, data_type_constraint, record_parameters, data_type_signature]
- match: (?:\b(readonly)\s+)?(?:\b(partial)\s+)?(?:\b(ref)\s+)?\b(struct)\s+({{name}})
- match: (?:\b(ref)\s+)?\b(struct)\s+({{name}})
captures:
1: storage.modifier.cs
2: storage.modifier.cs
3: storage.modifier.cs
4: keyword.declaration.struct.cs
5: entity.name.struct.cs
2: keyword.declaration.struct.cs
3: entity.name.struct.cs
push: [struct_signature, data_type_signature]
- match: '\b(enum)\s+({{name}})\s*(?:(:)\s*(byte|sbyte|short|ushort|int|uint|long|ulong))?'
- match: \b(enum)\s+({{name}})\s*(?:(:)\s*(byte|sbyte|short|ushort|int|uint|long|ulong))?
scope: meta.enum.cs
captures:
1: keyword.declaration.enum.cs
Expand Down
2 changes: 1 addition & 1 deletion C#/tests/syntax_test_C#10.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public record struct Person(string Name);

public readonly record struct Person(string Name);
///^^^ storage.modifier.access
/// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class.record - meta.class.record meta.class.record
/// ^^^^^^^^^^^^^^^^^^^^ meta.class.record - meta.class.record meta.class.record
/// ^^^^^^^^^^^^^ meta.class.record.parameters - meta.class.record meta.class.record
/// ^^^^^^^^ storage.modifier
/// ^^^^^^ keyword.declaration.class.record
Expand Down
24 changes: 24 additions & 0 deletions C#/tests/syntax_test_C#11.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,27 @@ The following example shows how newlines can improve the readability of an expre
/// ^^^^^^ punctuation.definition.string.begin
/// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - constant
/// ^^^ punctuation.definition.string.end

public class C2 {
/// <- storage.modifier.access
/// ^^^^^ keyword.declaration.class
/// ^^ entity.name.class

public required string FirstName { get; init; }
/// ^^^^^^ storage.modifier.access
/// ^^^^^^^^ storage.modifier
/// ^^^^^^ storage.type
}

public readonly required struct S2 {
/// <- storage.modifier.access
/// ^^^^^^^^ storage.modifier
/// ^^^^^^^^ storage.modifier
/// ^^^^^^ keyword.declaration.struct
/// ^^ entity.name.struct

public required string FirstName { get; init; }
/// ^^^^^^ storage.modifier.access
/// ^^^^^^^^ storage.modifier
/// ^^^^^^ storage.type
}
8 changes: 7 additions & 1 deletion C#/tests/syntax_test_C#7.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ class Foo {
///^^^^^^^^ meta.class
/// ^ meta.class.body

public readonly double value;
/// ^^^^^^ storage.modifier.access
/// ^^^^^^^^ storage.modifier
/// ^^^^^^ storage.type
/// ^^^^^ variable.other.member

void Main(string[] args) {
/// ^^^^ storage.type
/// ^^^^^^^^^^^^^^^^^^^^^ meta.method
Expand Down Expand Up @@ -721,7 +727,7 @@ void Foo (in string s, in int x, in Point point)
bytes[2] = 44; // throws IndexOutOfRangeException

public readonly ref struct Span<T>
/// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.struct
/// ^^^^^^^^^^^^^^^^^^^ meta.struct
/// ^ storage.modifier.access
/// ^^^^^^^^ storage.modifier
/// ^^^ storage.modifier
Expand Down

0 comments on commit f4092be

Please sign in to comment.