github-linguist 6.4.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/bin/{linguist → github-linguist} +0 -0
  3. data/grammars/source.abap.json +35 -6
  4. data/grammars/source.apl.json +4 -8
  5. data/grammars/source.ballerina.json +82 -3
  6. data/grammars/source.bdf.json +419 -0
  7. data/grammars/source.c++.json +25 -3
  8. data/grammars/source.c.json +6 -3
  9. data/grammars/source.chapel.json +3 -3
  10. data/grammars/source.coq.json +2 -2
  11. data/grammars/source.cs.json +83 -73
  12. data/grammars/source.csound.json +1 -1
  13. data/grammars/source.dart.json +1 -1
  14. data/grammars/source.elixir.json +112 -137
  15. data/grammars/source.emacs.lisp.json +179 -4
  16. data/grammars/source.figctrl.json +252 -0
  17. data/grammars/source.figfont.json +121 -0
  18. data/grammars/source.fontdir.json +99 -0
  19. data/grammars/source.fstar.json +439 -0
  20. data/grammars/source.hx.json +27 -9
  21. data/grammars/source.j.json +260 -0
  22. data/grammars/source.julia.json +24 -12
  23. data/grammars/source.lisp.json +3 -3
  24. data/grammars/source.mupad.json +1 -1
  25. data/grammars/source.pony.json +3 -3
  26. data/grammars/source.powershell.json +2 -2
  27. data/grammars/source.protobuf.json +87 -5
  28. data/grammars/source.purescript.json +5 -2
  29. data/grammars/source.python.json +17 -12
  30. data/grammars/source.rascal.json +0 -1
  31. data/grammars/source.reg.json +159 -0
  32. data/grammars/source.slice.json +2755 -0
  33. data/grammars/source.solidity.json +2 -2
  34. data/grammars/source.ts.json +225 -132
  35. data/grammars/source.tsx.json +235 -142
  36. data/grammars/source.viml.json +4 -4
  37. data/grammars/source.xlfd.json +462 -0
  38. data/grammars/source.yasnippet.json +387 -0
  39. data/grammars/text.elixir.json +17 -5
  40. data/grammars/text.html.basic.json +622 -2264
  41. data/grammars/text.html.elixir.json +10 -1
  42. data/grammars/text.html.php.blade.json +7 -3
  43. data/grammars/version +1 -0
  44. data/lib/linguist.rb +2 -0
  45. data/lib/linguist/VERSION +1 -1
  46. data/lib/linguist/generated.rb +14 -1
  47. data/lib/linguist/heuristics.rb +77 -468
  48. data/lib/linguist/heuristics.yml +404 -0
  49. data/lib/linguist/languages.json +1 -1
  50. data/lib/linguist/languages.yml +86 -6
  51. data/lib/linguist/samples.json +2624 -483
  52. data/lib/linguist/strategy/xml.rb +30 -0
  53. metadata +20 -7
@@ -8,6 +8,28 @@
8
8
  {
9
9
  "include": "#strings"
10
10
  },
11
+ {
12
+ "match": "\\b(if)\\s+(constexpr)\\b",
13
+ "captures": {
14
+ "1": {
15
+ "name": "keyword.control.c++"
16
+ },
17
+ "2": {
18
+ "name": "keyword.control.c++"
19
+ }
20
+ }
21
+ },
22
+ {
23
+ "match": "(::)\\s*(template)\\b",
24
+ "captures": {
25
+ "1": {
26
+ "name": "punctuation.separator.scope.c++"
27
+ },
28
+ "2": {
29
+ "name": "storage.modifier.template.c++"
30
+ }
31
+ }
32
+ },
11
33
  {
12
34
  "include": "source.c"
13
35
  },
@@ -53,7 +75,7 @@
53
75
  },
54
76
  {
55
77
  "name": "storage.modifier.c++",
56
- "match": "\\b(constexpr|export|mutable|typename|thread_local)\\b"
78
+ "match": "\\b(constexpr|export|mutable|typename|thread_local|noexcept)\\b"
57
79
  },
58
80
  {
59
81
  "name": "meta.function.destructor.c++",
@@ -123,7 +145,7 @@
123
145
  "patterns": [
124
146
  {
125
147
  "name": "meta.function-call.c",
126
- "match": "(?x)\n \t\t\t\t(\n \t\t\t\t\t(?!while|for|do|if|else|switch|catch|enumerate|return|r?iterate)(?: \\b[A-Za-z_][A-Za-z0-9_]*+\\b | :: )*+ # actual name\n \t\t\t\t)\n \t\t\t\t \\s*(\\()",
148
+ "match": "(?x)\n \t\t\t\t(\n \t\t\t\t\t(?!while|for|do|if|else|switch|catch|return)(?: \\b[A-Za-z_][A-Za-z0-9_]*+\\b | :: )*+ # actual name\n \t\t\t\t)\n \t\t\t\t \\s*(\\()",
127
149
  "captures": {
128
150
  "1": {
129
151
  "name": "support.function.any-method.c"
@@ -152,7 +174,7 @@
152
174
  "patterns": [
153
175
  {
154
176
  "name": "meta.function.constructor.c++",
155
- "begin": "(?x)\n \t\t\t\t(?: ^\\s*) # begin-of-line\n \t\t\t\t((?!while|for|do|if|else|switch|catch|enumerate|r?iterate)[A-Za-z_][A-Za-z0-9_:]*) # actual name\n \t\t\t\t \\s*(\\() # start bracket or end-of-line\n \t\t\t",
177
+ "begin": "(?x)\n \t\t\t\t(?: ^\\s*) # begin-of-line\n \t\t\t\t((?!while|for|do|if|else|switch|catch)[A-Za-z_][A-Za-z0-9_:]*) # actual name\n \t\t\t\t \\s*(\\() # start bracket or end-of-line\n \t\t\t",
156
178
  "end": "\\)",
157
179
  "patterns": [
158
180
  {
@@ -224,7 +224,7 @@
224
224
  },
225
225
  {
226
226
  "name": "meta.function.c",
227
- "begin": "(?x)\n \t\t(?: ^ # begin-of-line\n \t\t | \n \t\t (?: (?= \\s ) (?\u003c!else|new|return) (?\u003c=\\w) # or word + space before name\n \t\t | (?= \\s*[A-Za-z_] ) (?\u003c!\u0026\u0026) (?\u003c=[*\u0026\u003e]) # or type modifier before name\n \t\t )\n \t\t)\n \t\t(\\s*) (?!(while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\()\n \t\t(\n \t\t\t(?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ | # actual name\n \t\t\t(?: (?\u003c=operator) (?: [-*\u0026\u003c\u003e=+!]+ | \\(\\) | \\[\\] ) ) # if it is a C++ operator\n \t\t)\n \t\t \\s*(?=\\()",
227
+ "begin": "(?x)\n \t\t(?: ^ # begin-of-line\n \t\t | \n \t\t (?: (?= \\s ) (?\u003c!else|new|return) (?\u003c=\\w) # or word + space before name\n \t\t | (?= \\s*[A-Za-z_] ) (?\u003c!\u0026\u0026) (?\u003c=[*\u0026\u003e]) # or type modifier before name\n \t\t )\n \t\t)\n \t\t(\\s*) (?!(while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate|(?:::)?new|(?:::)?delete)\\s*\\()\n \t\t(\n \t\t\t(?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ | # actual name\n \t\t\t(?: (?\u003c=operator) (?: [-*\u0026\u003c\u003e=+!]+ | \\(\\) | \\[\\] ) ) # if it is a C++ operator\n \t\t)\n \t\t \\s*(?=\\()",
228
228
  "end": "(?\u003c=\\})|(?=#)|(;)",
229
229
  "patterns": [
230
230
  {
@@ -256,12 +256,15 @@
256
256
  ],
257
257
  "repository": {
258
258
  "access": {
259
- "match": "(\\.|\\-\u003e)([a-zA-Z_][a-zA-Z_0-9]*)\\b(?!\\s*\\()",
259
+ "match": "(\\.|\\-\u003e)(?:\\s*(template)\\s+)?([a-zA-Z_][a-zA-Z_0-9]*)\\b(?!\\s*\\()",
260
260
  "captures": {
261
261
  "1": {
262
262
  "name": "punctuation.separator.variable-access.c"
263
263
  },
264
264
  "2": {
265
+ "name": "storage.modifier.template.c++"
266
+ },
267
+ "3": {
265
268
  "name": "variable.other.dot-access.c"
266
269
  }
267
270
  }
@@ -335,7 +338,7 @@
335
338
  },
336
339
  "c_function_call": {
337
340
  "name": "meta.function-call.c",
338
- "match": "(?x) (?: (?= \\s ) (?:(?\u003c=else|new|return) | (?\u003c!\\w)) (\\s+))?\n\t\t\t(\\b \n\t\t\t\t(?!(while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\()(?:(?!NS)[A-Za-z_][A-Za-z0-9_]*+\\b | :: )++ # actual name\n\t\t\t)\n\t\t\t \\s*(\\()",
341
+ "match": "(?x) (?: (?= \\s ) (?:(?\u003c=else|new|return) | (?\u003c!\\w)) (\\s+))?\n\t\t\t(\\b \n\t\t\t\t(?!(while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate|(?:::)?new|(?:::)?delete)\\s*\\()(?:(?!NS)[A-Za-z_][A-Za-z0-9_]*+\\b | :: )++ # actual name\n\t\t\t)\n\t\t\t \\s*(\\()",
339
342
  "captures": {
340
343
  "1": {
341
344
  "name": "punctuation.whitespace.function-call.leading.c"
@@ -7,7 +7,7 @@
7
7
  },
8
8
  {
9
9
  "name": "keyword.control.chapel",
10
- "match": "\\b(align|as|atomic|begin|break|by|catch|class|cobegin|coforall|continue|delete|dmapped|do|else|enum|except|export|extern|for|forall|if|index|inline|in|inout|iter|label|lambda|let|local|module|new|noinit|on|only|otherwise|out|pragma|private|proc|prototype|public|record|reduce|ref|require|return|scan|select|serial|sync|then|throw|throws|try|union|use|var|when|where|while|with|yield|zip)\\b"
10
+ "match": "\\b(align|as|atomic|begin|borrowed|break|by|catch|class|cobegin|coforall|continue|delete|dmapped|do|else|enum|except|export|extern|for|forall|if|index|inline|in|inout|iter|label|lambda|let|local|module|new|noinit|on|only|otherwise|out|override|owned|pragma|private|proc|prototype|public|record|reduce|ref|require|return|scan|select|serial|shared|sync|then|throw|throws|try|union|unmanaged|use|var|when|where|while|with|yield|zip)\\b"
11
11
  },
12
12
  {
13
13
  "name": "storage.type.chapel",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  {
17
17
  "name": "storage.modifier.chapel",
18
- "match": "\\b(config|const|enum|param|private|public|single|sparse|sync|type)\\b"
18
+ "match": "\\b(borrowed|config|const|enum|owned|param|private|public|single|shared|sparse|sync|type|unmanaged)\\b"
19
19
  },
20
20
  {
21
21
  "name": "constant.language.chapel",
@@ -236,7 +236,7 @@
236
236
  },
237
237
  "illegal_names": {
238
238
  "name": "invalid.illegal.name.chapel",
239
- "match": "\\b(align|as|atomic|begin|break|by|catch|class|cobegin|coforall|continue|delete|dmapped|do|else|enum|except|export|extern|for|forall|if|index|inline|in|inout|iter|label|lambda|let|local|module|new|noinit|on|only|otherwise|out|pragma|private|proc|public|record|reduce|ref|require|return|scan|select|serial|single|sync|then|throw|throws|try|union|use|var|when|where|while|with|yield|zip)\\b"
239
+ "match": "\\b(align|as|atomic|begin|borrowed|break|by|catch|class|cobegin|coforall|continue|delete|dmapped|do|else|enum|except|export|extern|for|forall|if|index|inline|in|inout|iter|label|lambda|let|local|module|new|noinit|on|only|otherwise|out|override|owned|pragma|private|proc|public|record|reduce|ref|require|return|scan|select|serial|shared|single|sync|then|throw|throws|try|union|unmanaged|use|var|when|where|while|with|yield|zip)\\b"
240
240
  },
241
241
  "string_escaped_char": {
242
242
  "patterns": [
@@ -21,7 +21,7 @@
21
21
  }
22
22
  },
23
23
  {
24
- "match": "\\b(Axiom|Conjecture|Parameter|Parameters|Variable|Variables|Hypothesis|Hypotheses|Definition|Let|Fixpoint|CoFixpoint|Inductive|CoInductive|Remark|Fact|Corollary|Proposition|Example|Module|Theorem|Lemma)\\b",
24
+ "match": "\\b(Axiom|Conjecture|Parameter|Parameters|Variable|Variables|Hypothesis|Hypotheses|Definition|Let|Fixpoint|CoFixpoint|Inductive|CoInductive|Remark|Fact|Corollary|Proposition|Example|Module|Theorem|Lemma|Class|Instance|Context)\\b",
25
25
  "captures": {
26
26
  "1": {
27
27
  "name": "variable.coq"
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  {
32
- "match": "\\b(Require|Proof|Qed|Type|Admitted|match|with|end|Eval|in|Check|End|Notation|forall|as|Defined|Set|fun|at|cofix|else|exists|exists2|fix|for|if|IF|let|mod|Prop|return|then|using|where|Abort)\\b",
32
+ "match": "\\b(Abort|About|Add|Admit|Admitted|All|Arguments|as|Assumptions|Axiom|Back|BackTo|Backtrack|Bind|Blacklist|Canonical|Cd|Check|Class|Classes|Close|Coercion|Coercions|cofix|CoFixpoint|CoInductive|Collection|Combined|Compute|Conjecture|Conjectures|Constant|constr|Constraint|Constructors|Context|Corollary|CreateHintDb|Cumulative|Cut|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Drop|eauto|else|end|End|Equality|Eval|Example|Existential|Existentials|Existing|Export|exporting|Extern|Extract|Extraction|Fact|Fail|Field|Fields|File|fix|Fixpoint|Focus|for|forall|From|fun|Function|Functional|Generalizable|Global|Goal|Grab|Grammar|Graph|Guarded|Heap|Hint|HintDb|Hints|Hypotheses|Hypothesis|Identity|if|If|Immediate|Implicit|Import|in|Include|Inductive|Infix|Info|Initial|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|Language|Left|Lemma|let|Let|Libraries|Library|Load|LoadPath|Local|Locate|Ltac|match|Match|ML|Mode|Module|Modules|Monomorphic|Morphism|Next|NoInline|NonCumulative|Notation|Obligation|Obligations|Opaque|Open|Optimize|Options|Parameter|Parameters|Parametric|Path|Paths|pattern|Polymorphic|Preterm|Print|Printing|Profile|Program|Projections|Proof|Prop|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|return|Rewrite|Right|Ring|Rings|Scheme|Scope|Scopes|Script|Search|SearchAbout|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Sorted|Step|Strategies|Strategy|struct|Structure|SubClass|Table|Tables|Tactic|Term|Test|then|Theorem|Time|Timeout|Transparent|Type|Typeclasses|Types|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unset|Unshelve|using|Variable|Variables|Variant|Verbose|View|Visibility|where|with)\\b",
33
33
  "captures": {
34
34
  "1": {
35
35
  "name": "keyword.coq"
@@ -22,7 +22,7 @@
22
22
  "anonymous-method-expression": {
23
23
  "patterns": [
24
24
  {
25
- "begin": "(?x)\n(?:\\b(async)\\b\\s*)?\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(=\u003e)",
25
+ "begin": "(?x)\n(?:\\b(async)\\b\\s*)?\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(=\u003e)",
26
26
  "end": "(?=\\)|;|}|,)",
27
27
  "patterns": [
28
28
  {
@@ -120,7 +120,7 @@
120
120
  "patterns": [
121
121
  {
122
122
  "name": "storage.modifier.cs",
123
- "match": "\\b(ref|out)\\b"
123
+ "match": "\\b(ref|out|in)\\b"
124
124
  },
125
125
  {
126
126
  "include": "#declaration-expression-local"
@@ -156,7 +156,7 @@
156
156
  }
157
157
  },
158
158
  "array-creation-expression": {
159
- "begin": "(?x)\n\\b(new)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\\s*\n(?=\\[)",
159
+ "begin": "(?x)\n\\b(new|stackalloc)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\\s*\n(?=\\[)",
160
160
  "end": "(?\u003c=\\])",
161
161
  "patterns": [
162
162
  {
@@ -177,7 +177,7 @@
177
177
  }
178
178
  },
179
179
  "as-expression": {
180
- "match": "(?x)\n(?\u003c!\\.)\\b(as)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?",
180
+ "match": "(?x)\n(?\u003c!\\.)\\b(as)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?",
181
181
  "captures": {
182
182
  "1": {
183
183
  "name": "keyword.other.as.cs"
@@ -227,7 +227,7 @@
227
227
  }
228
228
  },
229
229
  "attribute-named-argument": {
230
- "begin": "([_[:alpha:]][_[:alnum:]]*)\\s*(?==)",
230
+ "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?==)",
231
231
  "end": "(?=(,|\\)))",
232
232
  "patterns": [
233
233
  {
@@ -417,7 +417,7 @@
417
417
  }
418
418
  },
419
419
  "cast-expression": {
420
- "match": "(?x)\n(\\()\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(\\))(?=\\s*[_[:alnum:]\\(])",
420
+ "match": "(?x)\n(\\()\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(\\))(?=\\s*@?[_[:alnum:]\\(])",
421
421
  "captures": {
422
422
  "1": {
423
423
  "name": "punctuation.parenthesis.open.cs"
@@ -443,7 +443,7 @@
443
443
  "end": "\\)",
444
444
  "patterns": [
445
445
  {
446
- "match": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?:\\b(\\g\u003cidentifier\u003e)\\b)?",
446
+ "match": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?:(\\g\u003cidentifier\u003e)\\b)?",
447
447
  "captures": {
448
448
  "1": {
449
449
  "patterns": [
@@ -558,7 +558,7 @@
558
558
  "end": "(?\u003c=\\})",
559
559
  "patterns": [
560
560
  {
561
- "begin": "(?x)\n\\b(class)\\b\\s+\n([_[:alpha:]][_[:alnum:]]*)\\s*",
561
+ "begin": "(?x)\n\\b(class)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)\\s*",
562
562
  "end": "(?=\\{)",
563
563
  "patterns": [
564
564
  {
@@ -625,13 +625,13 @@
625
625
  "include": "#type-declarations"
626
626
  },
627
627
  {
628
- "include": "#field-declaration"
628
+ "include": "#property-declaration"
629
629
  },
630
630
  {
631
- "include": "#event-declaration"
631
+ "include": "#field-declaration"
632
632
  },
633
633
  {
634
- "include": "#property-declaration"
634
+ "include": "#event-declaration"
635
635
  },
636
636
  {
637
637
  "include": "#indexer-declaration"
@@ -737,11 +737,11 @@
737
737
  }
738
738
  },
739
739
  "constructor-declaration": {
740
- "begin": "(?=[_[:alpha:]][_[:alnum:]]*\\s*\\()",
740
+ "begin": "(?=@?[_[:alpha:]][_[:alnum:]]*\\s*\\()",
741
741
  "end": "(?\u003c=\\})|(?=;)",
742
742
  "patterns": [
743
743
  {
744
- "match": "\\b([_[:alpha:]][_[:alnum:]]*)\\b",
744
+ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b",
745
745
  "captures": {
746
746
  "1": {
747
747
  "name": "entity.name.function.cs"
@@ -797,7 +797,7 @@
797
797
  }
798
798
  },
799
799
  "conversion-operator-declaration": {
800
- "begin": "(?x)\n(?\u003cexplicitorimplicitkeyword\u003e(?:\\b(?:explicit|implicit)))\\s*\n(?\u003coperatorkeyword\u003e(?:\\b(?:operator)))\\s*\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\()",
800
+ "begin": "(?x)\n(?\u003cexplicitorimplicitkeyword\u003e(?:\\b(?:explicit|implicit)))\\s*\n(?\u003coperatorkeyword\u003e(?:\\b(?:operator)))\\s*\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\()",
801
801
  "end": "(?\u003c=\\})|(?=;)",
802
802
  "patterns": [
803
803
  {
@@ -847,7 +847,7 @@
847
847
  }
848
848
  },
849
849
  "declaration-expression-local": {
850
- "match": "(?x) # e.g. int x OR var x\n(?:\n \\b(var)\\b|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n\\b(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)\\]])",
850
+ "match": "(?x) # e.g. int x OR var x\n(?:\n \\b(var)\\b|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)\\]])",
851
851
  "captures": {
852
852
  "1": {
853
853
  "name": "keyword.other.var.cs"
@@ -865,7 +865,7 @@
865
865
  }
866
866
  },
867
867
  "declaration-expression-tuple": {
868
- "match": "(?x) # e.g. int x OR var x\n(?:\n \\b(var)\\b|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n\\b(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)])",
868
+ "match": "(?x) # e.g. int x OR var x\n(?:\n \\b(var)\\b|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)])",
869
869
  "captures": {
870
870
  "1": {
871
871
  "name": "keyword.other.var.cs"
@@ -896,7 +896,7 @@
896
896
  ]
897
897
  },
898
898
  "delegate-declaration": {
899
- "begin": "(?x)\n(?:\\b(delegate)\\b)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(\u003c([^\u003c\u003e]+)\u003e)?\\s*\n(?=\\()",
899
+ "begin": "(?x)\n(?:\\b(delegate)\\b)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(\u003c([^\u003c\u003e]+)\u003e)?\\s*\n(?=\\()",
900
900
  "end": "(?=;)",
901
901
  "patterns": [
902
902
  {
@@ -933,7 +933,7 @@
933
933
  }
934
934
  },
935
935
  "destructor-declaration": {
936
- "begin": "(~)([_[:alpha:]][_[:alnum:]]*)\\s*(?=\\()",
936
+ "begin": "(~)(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?=\\()",
937
937
  "end": "(?\u003c=\\})|(?=;)",
938
938
  "patterns": [
939
939
  {
@@ -989,7 +989,7 @@
989
989
  }
990
990
  },
991
991
  "element-access-expression": {
992
- "begin": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(?:(\\.)\\s*)? # preceding dot?\n(?:([_[:alpha:]][_[:alnum:]]*)\\s*)? # property name\n(?:(\\?)\\s*)? # null-conditional operator?\n(?=\\[) # open bracket of argument list",
992
+ "begin": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(?:(\\.)\\s*)? # preceding dot?\n(?:(@?[_[:alpha:]][_[:alnum:]]*)\\s*)? # property name\n(?:(\\?)\\s*)? # null-conditional operator?\n(?=\\[) # open bracket of argument list",
993
993
  "end": "(?\u003c=\\])(?!\\s*\\[)",
994
994
  "patterns": [
995
995
  {
@@ -1037,7 +1037,7 @@
1037
1037
  "include": "#comment"
1038
1038
  },
1039
1039
  {
1040
- "match": "(enum)\\s+([_[:alpha:]][_[:alnum:]]*)",
1040
+ "match": "(enum)\\s+(@?[_[:alpha:]][_[:alnum:]]*)",
1041
1041
  "captures": {
1042
1042
  "1": {
1043
1043
  "name": "keyword.other.enum.cs"
@@ -1080,7 +1080,7 @@
1080
1080
  "include": "#punctuation-comma"
1081
1081
  },
1082
1082
  {
1083
- "begin": "[_[:alpha:]][_[:alnum:]]*",
1083
+ "begin": "@?[_[:alpha:]][_[:alnum:]]*",
1084
1084
  "end": "(?=(,|\\}))",
1085
1085
  "patterns": [
1086
1086
  {
@@ -1156,7 +1156,7 @@
1156
1156
  }
1157
1157
  },
1158
1158
  "event-declaration": {
1159
- "begin": "(?x)\n\\b(event)\\b\\s*\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003ceventnames\u003e\\g\u003cidentifier\u003e(?:\\s*,\\s*\\g\u003cidentifier\u003e)*)\\s*\n(?=\\{|;|$)",
1159
+ "begin": "(?x)\n\\b(event)\\b\\s*\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003ceventnames\u003e\\g\u003cidentifier\u003e(?:\\s*,\\s*\\g\u003cidentifier\u003e)*)\\s*\n(?=\\{|;|$)",
1160
1160
  "end": "(?\u003c=\\})|(?=;)",
1161
1161
  "patterns": [
1162
1162
  {
@@ -1194,7 +1194,7 @@
1194
1194
  "patterns": [
1195
1195
  {
1196
1196
  "name": "entity.name.variable.event.cs",
1197
- "match": "[_[:alpha:]][_[:alnum:]]*"
1197
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
1198
1198
  },
1199
1199
  {
1200
1200
  "include": "#punctuation-comma"
@@ -1361,7 +1361,7 @@
1361
1361
  ]
1362
1362
  },
1363
1363
  "extern-alias-directive": {
1364
- "begin": "\\s*(extern)\\b\\s*(alias)\\b\\s*([_[:alpha:]][_[:alnum:]]*)",
1364
+ "begin": "\\s*(extern)\\b\\s*(alias)\\b\\s*(@?[_[:alpha:]][_[:alnum:]]*)",
1365
1365
  "end": "(?=;)",
1366
1366
  "beginCaptures": {
1367
1367
  "1": {
@@ -1376,12 +1376,12 @@
1376
1376
  }
1377
1377
  },
1378
1378
  "field-declaration": {
1379
- "begin": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s* # first field name\n(?!=\u003e|==)(?=,|;|=|$)",
1379
+ "begin": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s* # first field name\n(?!=\u003e|==)(?=,|;|=|$)",
1380
1380
  "end": "(?=;)",
1381
1381
  "patterns": [
1382
1382
  {
1383
1383
  "name": "variable.other.cs",
1384
- "match": "[_[:alpha:]][_[:alnum:]]*"
1384
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
1385
1385
  },
1386
1386
  {
1387
1387
  "include": "#punctuation-comma"
@@ -1477,7 +1477,7 @@
1477
1477
  "end": "\\)",
1478
1478
  "patterns": [
1479
1479
  {
1480
- "match": "(?x)\n(?:\n (\\bvar\\b)|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s+\n\\b(in)\\b",
1480
+ "match": "(?x)\n(?:\n (\\bvar\\b)|\n (?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s+\n\\b(in)\\b",
1481
1481
  "captures": {
1482
1482
  "1": {
1483
1483
  "name": "keyword.other.var.cs"
@@ -1541,7 +1541,7 @@
1541
1541
  }
1542
1542
  },
1543
1543
  "generic-constraints": {
1544
- "begin": "(where)\\s+([_[:alpha:]][_[:alnum:]]*)\\s*(:)",
1544
+ "begin": "(where)\\s+(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
1545
1545
  "end": "(?=\\{|where|;|=\u003e)",
1546
1546
  "patterns": [
1547
1547
  {
@@ -1616,7 +1616,7 @@
1616
1616
  },
1617
1617
  {
1618
1618
  "name": "entity.name.label.cs",
1619
- "match": "[_[:alpha:]][_[:alnum:]]*"
1619
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
1620
1620
  }
1621
1621
  ],
1622
1622
  "beginCaptures": {
@@ -1657,7 +1657,7 @@
1657
1657
  }
1658
1658
  },
1659
1659
  "group-into": {
1660
- "match": "(?x)\n\\b(into)\\b\\s*\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*",
1660
+ "match": "(?x)\n\\b(into)\\b\\s*\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*",
1661
1661
  "captures": {
1662
1662
  "1": {
1663
1663
  "name": "keyword.query.into.cs"
@@ -1669,7 +1669,7 @@
1669
1669
  },
1670
1670
  "identifier": {
1671
1671
  "name": "variable.other.readwrite.cs",
1672
- "match": "[_[:alpha:]][_[:alnum:]]*"
1672
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
1673
1673
  },
1674
1674
  "if-statement": {
1675
1675
  "begin": "(?\u003c!\\.)\\b(if)\\b\\s*(?=\\()",
@@ -1705,7 +1705,7 @@
1705
1705
  }
1706
1706
  },
1707
1707
  "indexer-declaration": {
1708
- "begin": "(?x)\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003cindexername\u003ethis)\\s*\n(?=\\[)",
1708
+ "begin": "(?x)\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003cindexername\u003ethis)\\s*\n(?=\\[)",
1709
1709
  "end": "(?\u003c=\\})|(?=;)",
1710
1710
  "patterns": [
1711
1711
  {
@@ -1774,7 +1774,7 @@
1774
1774
  "end": "(?\u003c=\\})",
1775
1775
  "patterns": [
1776
1776
  {
1777
- "begin": "(?x)\n(interface)\\b\\s+\n([_[:alpha:]][_[:alnum:]]*)",
1777
+ "begin": "(?x)\n(interface)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)",
1778
1778
  "end": "(?=\\{)",
1779
1779
  "patterns": [
1780
1780
  {
@@ -1835,10 +1835,10 @@
1835
1835
  "include": "#comment"
1836
1836
  },
1837
1837
  {
1838
- "include": "#event-declaration"
1838
+ "include": "#property-declaration"
1839
1839
  },
1840
1840
  {
1841
- "include": "#property-declaration"
1841
+ "include": "#event-declaration"
1842
1842
  },
1843
1843
  {
1844
1844
  "include": "#indexer-declaration"
@@ -1904,7 +1904,7 @@
1904
1904
  }
1905
1905
  },
1906
1906
  "invocation-expression": {
1907
- "begin": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(?:(\\.)\\s*)? # preceding dot?\n([_[:alpha:]][_[:alnum:]]*)\\s* # method name\n(?\u003ctypeargs\u003e\\s*\u003c([^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\\s* # type arguments\n(?=\\() # open paren of argument list",
1907
+ "begin": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(?:(\\.)\\s*)? # preceding dot?\n(@?[_[:alpha:]][_[:alnum:]]*)\\s* # method name\n(?\u003ctypeargs\u003e\\s*\u003c([^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\\s* # type arguments\n(?=\\() # open paren of argument list",
1908
1908
  "end": "(?\u003c=\\))",
1909
1909
  "patterns": [
1910
1910
  {
@@ -1931,7 +1931,7 @@
1931
1931
  }
1932
1932
  },
1933
1933
  "is-expression": {
1934
- "match": "(?x)\n(?\u003c!\\.)\\b(is)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?",
1934
+ "match": "(?x)\n(?\u003c!\\.)\\b(is)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?",
1935
1935
  "captures": {
1936
1936
  "1": {
1937
1937
  "name": "keyword.other.is.cs"
@@ -1946,7 +1946,7 @@
1946
1946
  }
1947
1947
  },
1948
1948
  "join-clause": {
1949
- "begin": "(?x)\n\\b(join)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\n\\b(\\g\u003cidentifier\u003e)\\b\\s*\n\\b(in)\\b\\s*",
1949
+ "begin": "(?x)\n\\b(join)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\n\\s+(\\g\u003cidentifier\u003e)\\b\\s*\n\\b(in)\\b\\s*",
1950
1950
  "end": "(?=;|\\))",
1951
1951
  "patterns": [
1952
1952
  {
@@ -1993,7 +1993,7 @@
1993
1993
  }
1994
1994
  },
1995
1995
  "join-into": {
1996
- "match": "(?x)\n\\b(into)\\b\\s*\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*",
1996
+ "match": "(?x)\n\\b(into)\\b\\s*\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*",
1997
1997
  "captures": {
1998
1998
  "1": {
1999
1999
  "name": "keyword.query.into.cs"
@@ -2012,7 +2012,7 @@
2012
2012
  }
2013
2013
  },
2014
2014
  "labeled-statement": {
2015
- "match": "([_[:alpha:]][_[:alnum:]]*)\\s*(:)",
2015
+ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
2016
2016
  "captures": {
2017
2017
  "1": {
2018
2018
  "name": "entity.name.label.cs"
@@ -2023,7 +2023,7 @@
2023
2023
  }
2024
2024
  },
2025
2025
  "lambda-parameter": {
2026
- "match": "(?x)\n(ref|out)?\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\n\\b(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)])",
2026
+ "match": "(?x)\n(?:\\b(ref|out|in)\\b)?\\s*\n(?:(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+)?\n(\\g\u003cidentifier\u003e)\\b\\s*\n(?=[,)])",
2027
2027
  "captures": {
2028
2028
  "1": {
2029
2029
  "name": "storage.modifier.cs"
@@ -2069,7 +2069,7 @@
2069
2069
  }
2070
2070
  },
2071
2071
  "let-clause": {
2072
- "begin": "(?x)\n\\b(let)\\b\\s*\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(=)\\s*",
2072
+ "begin": "(?x)\n\\b(let)\\b\\s*\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(=)\\s*",
2073
2073
  "end": "(?=;|\\))",
2074
2074
  "patterns": [
2075
2075
  {
@@ -2117,12 +2117,12 @@
2117
2117
  ]
2118
2118
  },
2119
2119
  "local-constant-declaration": {
2120
- "begin": "(?x)\n(?\u003cconstkeyword\u003e\\b(?:const)\\b)\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(?=,|;|=)",
2120
+ "begin": "(?x)\n(?\u003cconstkeyword\u003e\\b(?:const)\\b)\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(?=,|;|=)",
2121
2121
  "end": "(?=;)",
2122
2122
  "patterns": [
2123
2123
  {
2124
2124
  "name": "variable.other.cs",
2125
- "match": "[_[:alpha:]][_[:alnum:]]*"
2125
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
2126
2126
  },
2127
2127
  {
2128
2128
  "include": "#punctuation-comma"
@@ -2188,12 +2188,12 @@
2188
2188
  }
2189
2189
  },
2190
2190
  "local-variable-declaration": {
2191
- "begin": "(?x)\n(?:\n (?:(\\bref)\\s+)?(\\bvar\\b)| # ref local\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref local\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(?=,|;|=|\\))",
2191
+ "begin": "(?x)\n(?:\n (?:(\\bref)\\s+(?:(\\breadonly)\\s+)?)?(\\bvar\\b)| # ref local\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref local\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g\u003cidentifier\u003e)\\s*\n(?=,|;|=|\\))",
2192
2192
  "end": "(?=;|\\))",
2193
2193
  "patterns": [
2194
2194
  {
2195
2195
  "name": "variable.other.cs",
2196
- "match": "[_[:alpha:]][_[:alnum:]]*"
2196
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
2197
2197
  },
2198
2198
  {
2199
2199
  "include": "#punctuation-comma"
@@ -2210,16 +2210,19 @@
2210
2210
  "name": "storage.modifier.cs"
2211
2211
  },
2212
2212
  "2": {
2213
- "name": "keyword.other.var.cs"
2213
+ "name": "storage.modifier.cs"
2214
2214
  },
2215
2215
  "3": {
2216
+ "name": "keyword.other.var.cs"
2217
+ },
2218
+ "4": {
2216
2219
  "patterns": [
2217
2220
  {
2218
2221
  "include": "#type"
2219
2222
  }
2220
2223
  ]
2221
2224
  },
2222
- "8": {
2225
+ "9": {
2223
2226
  "name": "variable.other.cs"
2224
2227
  }
2225
2228
  }
@@ -2260,7 +2263,7 @@
2260
2263
  "member-access-expression": {
2261
2264
  "patterns": [
2262
2265
  {
2263
- "match": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(\\.)\\s* # preceding dot\n([_[:alpha:]][_[:alnum:]]*)\\s* # property name\n(?![_[:alnum:]]|\\(|(\\?)?\\[|\u003c) # next character is not alpha-numeric, nor a (, [, or \u003c. Also, test for ?[",
2266
+ "match": "(?x)\n(?:(\\?)\\s*)? # preceding null-conditional operator?\n(\\.)\\s* # preceding dot\n(@?[_[:alpha:]][_[:alnum:]]*)\\s* # property name\n(?![_[:alnum:]]|\\(|(\\?)?\\[|\u003c) # next character is not alpha-numeric, nor a (, [, or \u003c. Also, test for ?[",
2264
2267
  "captures": {
2265
2268
  "1": {
2266
2269
  "name": "keyword.operator.null-conditional.cs"
@@ -2274,7 +2277,7 @@
2274
2277
  }
2275
2278
  },
2276
2279
  {
2277
- "match": "(?x)\n(\\.)?\\s*\n([_[:alpha:]][_[:alnum:]]*)\n(?\u003ctypeparams\u003e\\s*\u003c([^\u003c\u003e]|\\g\u003ctypeparams\u003e)+\u003e\\s*)\n(?=\n (\\s*\\?)?\n \\s*\\.\\s*[_[:alpha:]][_[:alnum:]]*\n)",
2280
+ "match": "(?x)\n(\\.)?\\s*\n(@?[_[:alpha:]][_[:alnum:]]*)\n(?\u003ctypeparams\u003e\\s*\u003c([^\u003c\u003e]|\\g\u003ctypeparams\u003e)+\u003e\\s*)\n(?=\n (\\s*\\?)?\n \\s*\\.\\s*@?[_[:alpha:]][_[:alnum:]]*\n)",
2278
2281
  "captures": {
2279
2282
  "1": {
2280
2283
  "name": "punctuation.accessor.cs"
@@ -2292,7 +2295,7 @@
2292
2295
  }
2293
2296
  },
2294
2297
  {
2295
- "match": "(?x)\n([_[:alpha:]][_[:alnum:]]*)\n(?=\n (\\s*\\?)?\n \\s*\\.\\s*[_[:alpha:]][_[:alnum:]]*\n)",
2298
+ "match": "(?x)\n(@?[_[:alpha:]][_[:alnum:]]*)\n(?=\n (\\s*\\?)?\n \\s*\\.\\s*@?[_[:alpha:]][_[:alnum:]]*\n)",
2296
2299
  "captures": {
2297
2300
  "1": {
2298
2301
  "name": "variable.other.object.cs"
@@ -2302,7 +2305,7 @@
2302
2305
  ]
2303
2306
  },
2304
2307
  "method-declaration": {
2305
- "begin": "(?x)\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(\\g\u003cidentifier\u003e)\\s*\n(\u003c([^\u003c\u003e]+)\u003e)?\\s*\n(?=\\()",
2308
+ "begin": "(?x)\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(\\g\u003cidentifier\u003e)\\s*\n(\u003c([^\u003c\u003e]+)\u003e)?\\s*\n(?=\\()",
2306
2309
  "end": "(?\u003c=\\})|(?=;)",
2307
2310
  "patterns": [
2308
2311
  {
@@ -2352,7 +2355,7 @@
2352
2355
  }
2353
2356
  },
2354
2357
  "named-argument": {
2355
- "begin": "([_[:alpha:]][_[:alnum:]]*)\\s*(:)",
2358
+ "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
2356
2359
  "end": "(?=(,|\\)|\\]))",
2357
2360
  "patterns": [
2358
2361
  {
@@ -2399,7 +2402,7 @@
2399
2402
  },
2400
2403
  {
2401
2404
  "name": "entity.name.type.namespace.cs",
2402
- "match": "[_[:alpha:]][_[:alnum:]]*"
2405
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
2403
2406
  },
2404
2407
  {
2405
2408
  "include": "#punctuation-accessor"
@@ -2479,7 +2482,7 @@
2479
2482
  ]
2480
2483
  },
2481
2484
  "object-creation-expression-with-no-parameters": {
2482
- "match": "(?x)\n(new)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\{|$)",
2485
+ "match": "(?x)\n(new)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\{|$)",
2483
2486
  "captures": {
2484
2487
  "1": {
2485
2488
  "name": "keyword.other.new.cs"
@@ -2494,7 +2497,7 @@
2494
2497
  }
2495
2498
  },
2496
2499
  "object-creation-expression-with-parameters": {
2497
- "begin": "(?x)\n(new)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\()",
2500
+ "begin": "(?x)\n(new)\\s+\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?=\\()",
2498
2501
  "end": "(?\u003c=\\))",
2499
2502
  "patterns": [
2500
2503
  {
@@ -2519,7 +2522,7 @@
2519
2522
  "match": "(?\u003c!=|!)(=)(?!=)"
2520
2523
  },
2521
2524
  "operator-declaration": {
2522
- "begin": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?\u003coperatorkeyword\u003e(?:\\b(?:operator)))\\s*\n(?\u003coperator\u003e(?:\\+|-|\\*|/|%|\u0026|\\||\\^|\\\u003c\\\u003c|\\\u003e\\\u003e|==|!=|\\\u003e|\\\u003c|\\\u003e=|\\\u003c=|!|~|\\+\\+|--|true|false))\\s*\n(?=\\()",
2525
+ "begin": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?\u003coperatorkeyword\u003e(?:\\b(?:operator)))\\s*\n(?\u003coperator\u003e(?:\\+|-|\\*|/|%|\u0026|\\||\\^|\\\u003c\\\u003c|\\\u003e\\\u003e|==|!=|\\\u003e|\\\u003c|\\\u003e=|\\\u003c=|!|~|\\+\\+|--|true|false))\\s*\n(?=\\()",
2523
2526
  "end": "(?\u003c=\\})|(?=;)",
2524
2527
  "patterns": [
2525
2528
  {
@@ -2586,7 +2589,7 @@
2586
2589
  }
2587
2590
  },
2588
2591
  "parameter": {
2589
- "match": "(?x)\n(?:(?:\\b(ref|params|out|this)\\b)\\s+)?\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)",
2592
+ "match": "(?x)\n(?:(?:\\b(ref|params|out|in|this)\\b)\\s+)?\n(?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s+\n(\\g\u003cidentifier\u003e)",
2590
2593
  "captures": {
2591
2594
  "1": {
2592
2595
  "name": "storage.modifier.cs"
@@ -2999,7 +3002,7 @@
2999
3002
  }
3000
3003
  },
3001
3004
  "property-declaration": {
3002
- "begin": "(?x)\n(?!.*\\b(?:class|interface|struct|enum|event)\\b)\\s*\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003cpropertyname\u003e\\g\u003cidentifier\u003e)\\s*\n(?=\\{|=\u003e|$)",
3005
+ "begin": "(?x)\n\n# The negative lookahead below ensures that we don't match nested types\n# or other declarations as properties.\n(?![[:word:][:space:]]*\\b(?:class|interface|struct|enum|event)\\b)\n\n(?\u003creturntype\u003e\n (?\u003ctypename\u003e\n (?:\n (?:ref\\s+(?:readonly\\s+)?)? # ref return\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\\s+\n)\n(?\u003cinterfacename\u003e\\g\u003ctypename\u003e\\s*\\.\\s*)?\n(?\u003cpropertyname\u003e\\g\u003cidentifier\u003e)\\s*\n(?=\\{|=\u003e|$)",
3003
3006
  "end": "(?\u003c=\\})|(?=;)",
3004
3007
  "patterns": [
3005
3008
  {
@@ -3076,7 +3079,7 @@
3076
3079
  ]
3077
3080
  },
3078
3081
  "query-expression": {
3079
- "begin": "(?x)\n\\b(from)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\n\\b(\\g\u003cidentifier\u003e)\\b\\s*\n\\b(in)\\b\\s*",
3082
+ "begin": "(?x)\n\\b(from)\\b\\s*\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)?\n\\s+(\\g\u003cidentifier\u003e)\\b\\s*\n\\b(in)\\b\\s*",
3080
3083
  "end": "(?=;|\\))",
3081
3084
  "patterns": [
3082
3085
  {
@@ -3105,6 +3108,10 @@
3105
3108
  }
3106
3109
  }
3107
3110
  },
3111
+ "readonly-modifier": {
3112
+ "name": "storage.modifier.cs",
3113
+ "match": "\\b(readonly)\\b"
3114
+ },
3108
3115
  "ref-modifier": {
3109
3116
  "name": "storage.modifier.cs",
3110
3117
  "match": "\\b(ref)\\b"
@@ -3234,7 +3241,7 @@
3234
3241
  },
3235
3242
  "storage-modifier": {
3236
3243
  "name": "storage.modifier.cs",
3237
- "match": "(?\u003c!\\.)\\b(new|public|protected|internal|private|abstract|virtual|override|sealed|static|partial|readonly|volatile|const|extern|async|unsafe)\\b"
3244
+ "match": "(?\u003c!\\.)\\b(new|public|protected|internal|private|abstract|virtual|override|sealed|static|partial|readonly|volatile|const|extern|async|unsafe|ref)\\b"
3238
3245
  },
3239
3246
  "string-character-escape": {
3240
3247
  "name": "constant.character.escape.cs",
@@ -3268,7 +3275,7 @@
3268
3275
  "end": "(?\u003c=\\})",
3269
3276
  "patterns": [
3270
3277
  {
3271
- "begin": "(?x)\n(struct)\\b\\s+\n([_[:alpha:]][_[:alnum:]]*)",
3278
+ "begin": "(?x)\n(struct)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)",
3272
3279
  "end": "(?=\\{)",
3273
3280
  "patterns": [
3274
3281
  {
@@ -3486,7 +3493,7 @@
3486
3493
  "include": "#punctuation-comma"
3487
3494
  },
3488
3495
  {
3489
- "match": "(?x) # e.g. x\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(?=[,)])",
3496
+ "match": "(?x) # e.g. x\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(?=[,)])",
3490
3497
  "captures": {
3491
3498
  "1": {
3492
3499
  "name": "entity.name.variable.tuple-element.cs"
@@ -3534,7 +3541,7 @@
3534
3541
  "include": "#punctuation-comma"
3535
3542
  },
3536
3543
  {
3537
- "match": "(?x) # e.g. x\n\\b([_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(?=[,)])",
3544
+ "match": "(?x) # e.g. x\n(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*\n(?=[,)])",
3538
3545
  "captures": {
3539
3546
  "1": {
3540
3547
  "name": "variable.other.readwrite.cs"
@@ -3554,7 +3561,7 @@
3554
3561
  }
3555
3562
  },
3556
3563
  "tuple-element": {
3557
- "match": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\*\\s*)* # pointer suffix?\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\n(?:\\b(?\u003ctuplename\u003e\\g\u003cidentifier\u003e)\\b)?",
3564
+ "match": "(?x)\n(?\u003ctypename\u003e\n (?:\n (?:\n (?:(?\u003cidentifier\u003e@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (?\u003cnameandtypeargs\u003e # identifier + type arguments (if any)\n \\g\u003cidentifier\u003e\\s*\n (?\u003ctypeargs\u003e\\s*\u003c(?:[^\u003c\u003e]|\\g\u003ctypeargs\u003e)+\u003e\\s*)?\n )\n (?:\\s*\\.\\s*\\g\u003cnameandtypeargs\u003e)* | # Are there any more names being dotted into?\n (?\u003ctuple\u003e\\s*\\((?:[^\\(\\)]|\\g\u003ctuple\u003e)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\n(?:(?\u003ctuplename\u003e\\g\u003cidentifier\u003e)\\b)?",
3558
3565
  "captures": {
3559
3566
  "1": {
3560
3567
  "patterns": [
@@ -3594,7 +3601,7 @@
3594
3601
  }
3595
3602
  },
3596
3603
  "tuple-literal-element": {
3597
- "begin": "(?x)\n(?:([_[:alpha:]][_[:alnum:]]*)\\s*(:)\\s*)?\n(?![,)])",
3604
+ "begin": "(?x)\n(?:(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)\\s*)?\n(?![,)])",
3598
3605
  "end": "(?=[,)])",
3599
3606
  "patterns": [
3600
3607
  {
@@ -3641,6 +3648,9 @@
3641
3648
  {
3642
3649
  "include": "#ref-modifier"
3643
3650
  },
3651
+ {
3652
+ "include": "#readonly-modifier"
3653
+ },
3644
3654
  {
3645
3655
  "include": "#tuple-type"
3646
3656
  },
@@ -3750,7 +3760,7 @@
3750
3760
  "type-name": {
3751
3761
  "patterns": [
3752
3762
  {
3753
- "match": "([_[:alpha:]][_[:alnum:]]*)\\s*(\\:\\:)",
3763
+ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\:\\:)",
3754
3764
  "captures": {
3755
3765
  "1": {
3756
3766
  "name": "entity.name.type.alias.cs"
@@ -3761,7 +3771,7 @@
3761
3771
  }
3762
3772
  },
3763
3773
  {
3764
- "match": "([_[:alpha:]][_[:alnum:]]*)\\s*(\\.)",
3774
+ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\.)",
3765
3775
  "captures": {
3766
3776
  "1": {
3767
3777
  "name": "storage.type.cs"
@@ -3772,7 +3782,7 @@
3772
3782
  }
3773
3783
  },
3774
3784
  {
3775
- "match": "(\\.)\\s*([_[:alpha:]][_[:alnum:]]*)",
3785
+ "match": "(\\.)\\s*(@?[_[:alpha:]][_[:alnum:]]*)",
3776
3786
  "captures": {
3777
3787
  "1": {
3778
3788
  "name": "punctuation.accessor.cs"
@@ -3784,7 +3794,7 @@
3784
3794
  },
3785
3795
  {
3786
3796
  "name": "entity.name.type.cs",
3787
- "match": "[_[:alpha:]][_[:alnum:]]*"
3797
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
3788
3798
  }
3789
3799
  ]
3790
3800
  },
@@ -3809,7 +3819,7 @@
3809
3819
  }
3810
3820
  },
3811
3821
  {
3812
- "match": "\\b([_[:alpha:]][_[:alnum:]]*)\\b",
3822
+ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b",
3813
3823
  "captures": {
3814
3824
  "1": {
3815
3825
  "name": "entity.name.type.type-parameter.cs"
@@ -3882,7 +3892,7 @@
3882
3892
  }
3883
3893
  },
3884
3894
  {
3885
- "begin": "\\b(using)\\s+(?=([_[:alpha:]][_[:alnum:]]*)\\s*=)",
3895
+ "begin": "\\b(using)\\s+(?=(@?[_[:alpha:]][_[:alnum:]]*)\\s*=)",
3886
3896
  "end": "(?=;)",
3887
3897
  "patterns": [
3888
3898
  {
@@ -3913,7 +3923,7 @@
3913
3923
  },
3914
3924
  {
3915
3925
  "name": "entity.name.type.namespace.cs",
3916
- "match": "[_[:alpha:]][_[:alnum:]]*"
3926
+ "match": "@?[_[:alpha:]][_[:alnum:]]*"
3917
3927
  },
3918
3928
  {
3919
3929
  "include": "#operator-assignment"