github-linguist 6.4.1 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
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"