Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions grammars/csharp.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@
<key>include</key>
<string>#property-declaration</string>
</dict>
<dict>
<key>include</key>
<string>#fixed-size-buffer-declaration</string>
</dict>
<dict>
<key>include</key>
<string>#field-declaration</string>
Expand Down Expand Up @@ -1692,6 +1696,60 @@
</dict>
</array>
</dict>
<key>fixed-size-buffer-declaration</key>
<dict>
<key>begin</key>
<string>(?x)
\b(fixed)\b\s+
(?&lt;type_name&gt;
(?:
(?:(?&lt;identifier&gt;@?[_[:alpha:]][_[:alnum:]]*)\s*\:\:\s*)? # alias-qualification
(?&lt;name_and_type_args&gt; # identifier + type arguments (if any)
\g&lt;identifier&gt;\s*
(?&lt;type_args&gt;\s*&lt;(?:[^&lt;&gt;]|\g&lt;type_args&gt;)+&gt;\s*)?
)
(?:\s*\.\s*\g&lt;name_and_type_args&gt;)* # Are there any more names being dotted into?
)
)\s+
(\g&lt;identifier&gt;)\s* # buffer name
(?=\[)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.modifier.fixed.cs</string>
</dict>
<key>2</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type</string>
</dict>
</array>
</dict>
<key>6</key>
<dict>
<key>name</key>
<string>entity.name.variable.field.cs</string>
</dict>
</dict>
<key>end</key>
<string>(?=;)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#bracketed-argument-list</string>
</dict>
<dict>
<key>include</key>
<string>#comment</string>
</dict>
</array>
</dict>
<key>field-declaration</key>
<dict>
<key>begin</key>
Expand Down
40 changes: 40 additions & 0 deletions grammars/csharp.tmLanguage.cson
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ repository:
{
include: "#property-declaration"
}
{
include: "#fixed-size-buffer-declaration"
}
{
include: "#field-declaration"
}
Expand Down Expand Up @@ -1060,6 +1063,43 @@ repository:
include: "#generic-constraints"
}
]
"fixed-size-buffer-declaration":
begin: '''
(?x)
\\b(fixed)\\b\\s+
(?<type_name>
(?:
(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification
(?<name_and_type_args> # identifier + type arguments (if any)
\\g<identifier>\\s*
(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?
)
(?:\\s*\\.\\s*\\g<name_and_type_args>)* # Are there any more names being dotted into?
)
)\\s+
(\\g<identifier>)\\s* # buffer name
(?=\\[)
'''
beginCaptures:
"1":
name: "storage.modifier.fixed.cs"
"2":
patterns: [
{
include: "#type"
}
]
"6":
name: "entity.name.variable.field.cs"
end: "(?=;)"
patterns: [
{
include: "#bracketed-argument-list"
}
{
include: "#comment"
}
]
"field-declaration":
begin: '''
(?x)
Expand Down
31 changes: 31 additions & 0 deletions src/csharp.tmLanguage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ repository:
- include: '#type-declarations'
- include: '#constructor-declaration'
- include: '#property-declaration'
- include: '#fixed-size-buffer-declaration'
- include: '#field-declaration'
- include: '#event-declaration'
- include: '#indexer-declaration'
Expand Down Expand Up @@ -543,6 +544,36 @@ repository:
- include: '#punctuation-comma'
- include: '#generic-constraints'

fixed-size-buffer-declaration:
begin: |-
(?x)
\b(fixed)\b\s+
(?<type_name>
(?:
(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\s*\:\:\s*)? # alias-qualification
(?<name_and_type_args> # identifier + type arguments (if any)
\g<identifier>\s*
(?<type_args>\s*<(?:[^<>]|\g<type_args>)+>\s*)?
)
(?:\s*\.\s*\g<name_and_type_args>)* # Are there any more names being dotted into?
)
)\s+
(\g<identifier>)\s* # buffer name
(?=\[)
beginCaptures:
'1': { name: storage.modifier.fixed.cs }
'2':
patterns:
- include: '#type'
# '3': ?<identifier> is a sub-expression. It's final value is not considered.
# '4': ?<name_and_type_args> is a sub-expression. It's final value is not considered.
# '5': ?<type_args> is a sub-expression. It's final value is not considered.
'6': { name: entity.name.variable.field.cs }
end: (?=;)
patterns:
- include: '#bracketed-argument-list'
- include: '#comment'

field-declaration:
begin: |-
(?x)
Expand Down
66 changes: 66 additions & 0 deletions test/field.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -395,5 +395,71 @@ class C
Token.Punctuation.CloseBrace
]);
});

it("fixed-size buffer declaration", async () => {
const input = Input.InStruct(`public fixed byte Buffer[30];`);
const tokens = await tokenize(input);

tokens.should.deep.equal([
Token.Keyword.Modifier.Public,
Token.Keyword.Modifier.Fixed,
Token.PrimitiveType.Byte,
Token.Identifier.FieldName("Buffer"),
Token.Punctuation.OpenBracket,
Token.Literal.Numeric.Decimal("30"),
Token.Punctuation.CloseBracket,
Token.Punctuation.Semicolon
]);
});

it("fixed-size buffer with unsafe modifier", async () => {
const input = Input.InStruct(`public unsafe fixed byte Buffer[30];`);
const tokens = await tokenize(input);

tokens.should.deep.equal([
Token.Keyword.Modifier.Public,
Token.Keyword.Modifier.Unsafe,
Token.Keyword.Modifier.Fixed,
Token.PrimitiveType.Byte,
Token.Identifier.FieldName("Buffer"),
Token.Punctuation.OpenBracket,
Token.Literal.Numeric.Decimal("30"),
Token.Punctuation.CloseBracket,
Token.Punctuation.Semicolon
]);
});

it("fixed-size buffer with const reference", async () => {
const input = `
struct C
{
public const int length = 30;
public unsafe fixed byte Buffer[length];
}`;
const tokens = await tokenize(input);

tokens.should.deep.equal([
Token.Keyword.Definition.Struct,
Token.Identifier.StructName("C"),
Token.Punctuation.OpenBrace,
Token.Keyword.Modifier.Public,
Token.Keyword.Modifier.Const,
Token.PrimitiveType.Int,
Token.Identifier.FieldName("length"),
Token.Operator.Assignment,
Token.Literal.Numeric.Decimal("30"),
Token.Punctuation.Semicolon,
Token.Keyword.Modifier.Public,
Token.Keyword.Modifier.Unsafe,
Token.Keyword.Modifier.Fixed,
Token.PrimitiveType.Byte,
Token.Identifier.FieldName("Buffer"),
Token.Punctuation.OpenBracket,
Token.Variable.ReadWrite("length"),
Token.Punctuation.CloseBracket,
Token.Punctuation.Semicolon,
Token.Punctuation.CloseBrace
]);
});
});
});
1 change: 1 addition & 0 deletions test/utils/tokenize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@ export namespace Token {
export const Explicit = createToken('explicit', 'storage.modifier.explicit.cs');
export const Extern = createToken('extern', 'storage.modifier.extern.cs');
export const File = createToken('file', 'storage.modifier.file.cs');
export const Fixed = createToken('fixed', 'storage.modifier.fixed.cs');
export const Implicit = createToken('implicit', 'storage.modifier.implicit.cs');
export const In = createToken('in', 'storage.modifier.in.cs');
export const Internal = createToken('internal', 'storage.modifier.internal.cs');
Expand Down