{
  "displayName": "C#",
  "name": "csharp",
  "patterns": [
    {
      "include": "#preprocessor"
    },
    {
      "include": "#comment"
    },
    {
      "include": "#directives"
    },
    {
      "include": "#declarations"
    },
    {
      "include": "#script-top-level"
    }
  ],
  "repository": {
    "accessor-getter": {
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "contentName": "meta.accessor.getter.cs",
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#statement"
            }
          ]
        },
        {
          "include": "#accessor-getter-expression"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "accessor-getter-expression": {
      "begin": "=>",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.arrow.cs"
        }
      },
      "contentName": "meta.accessor.getter.cs",
      "end": "(?=;|\\})",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "accessor-setter": {
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "contentName": "meta.accessor.setter.cs",
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#statement"
            }
          ]
        },
        {
          "begin": "=>",
          "beginCaptures": {
            "0": {
              "name": "keyword.operator.arrow.cs"
            }
          },
          "contentName": "meta.accessor.setter.cs",
          "end": "(?=;|\\})",
          "patterns": [
            {
              "include": "#ref-modifier"
            },
            {
              "include": "#expression"
            }
          ]
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "anonymous-method-expression": {
      "patterns": [
        {
          "begin": "((?:\\b(?:async|static)\\b\\s*)*)(?:(@?[_[:alpha:]][_[:alnum:]]*)\\b|(\\()(?<tuple>(?:[^()]|\\(\\g<tuple>\\))*)(\\)))\\s*(=>)",
          "beginCaptures": {
            "1": {
              "patterns": [
                {
                  "match": "async|static",
                  "name": "storage.modifier.$0.cs"
                }
              ]
            },
            "2": {
              "name": "entity.name.variable.parameter.cs"
            },
            "3": {
              "name": "punctuation.parenthesis.open.cs"
            },
            "4": {
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "include": "#explicit-anonymous-function-parameter"
                },
                {
                  "include": "#implicit-anonymous-function-parameter"
                },
                {
                  "include": "#default-argument"
                },
                {
                  "include": "#punctuation-comma"
                }
              ]
            },
            "5": {
              "name": "punctuation.parenthesis.close.cs"
            },
            "6": {
              "name": "keyword.operator.arrow.cs"
            }
          },
          "end": "(?=[,;)}])",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "begin": "(?={)",
              "end": "(?=[,;)}])",
              "patterns": [
                {
                  "include": "#block"
                },
                {
                  "include": "#intrusive"
                }
              ]
            },
            {
              "begin": "\\b(ref)\\b|(?=\\S)",
              "beginCaptures": {
                "1": {
                  "name": "storage.modifier.ref.cs"
                }
              },
              "end": "(?=[,;)}])",
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            }
          ]
        },
        {
          "begin": "((?:\\b(?:async|static)\\b\\s*)*)\\b(delegate)\\b\\s*",
          "beginCaptures": {
            "1": {
              "patterns": [
                {
                  "match": "async|static",
                  "name": "storage.modifier.$0.cs"
                }
              ]
            },
            "2": {
              "name": "storage.type.delegate.cs"
            }
          },
          "end": "(?<=})|(?=[,;)}])",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "begin": "\\(",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.parenthesis.open.cs"
                }
              },
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.parenthesis.close.cs"
                }
              },
              "patterns": [
                {
                  "include": "#intrusive"
                },
                {
                  "include": "#explicit-anonymous-function-parameter"
                },
                {
                  "include": "#punctuation-comma"
                }
              ]
            },
            {
              "include": "#block"
            }
          ]
        }
      ]
    },
    "anonymous-object-creation-expression": {
      "begin": "\\b(new)\\b\\s*(?=\\{|//|/\\*|$)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.new.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#initializer-expression"
        }
      ]
    },
    "argument": {
      "patterns": [
        {
          "match": "\\b(ref|in)\\b",
          "name": "storage.modifier.$1.cs"
        },
        {
          "begin": "\\b(out)\\b",
          "beginCaptures": {
            "1": {
              "name": "storage.modifier.out.cs"
            }
          },
          "end": "(?=,|\\)|\\])",
          "patterns": [
            {
              "include": "#declaration-expression-local"
            },
            {
              "include": "#expression"
            }
          ]
        },
        {
          "include": "#expression"
        }
      ]
    },
    "argument-list": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#named-argument"
        },
        {
          "include": "#argument"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "array-creation-expression": {
      "begin": "\\b(new|stackalloc)\\b\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))?\\s*(?=\\[)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.$1.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "end": "(?<=\\])",
      "patterns": [
        {
          "include": "#bracketed-argument-list"
        }
      ]
    },
    "as-expression": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.as.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "match": "(?<!\\.)\\b(as)\\b\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?(?!\\?))?(?:\\s*\\[\\s*(?:,\\s*)*\\](?:\\s*\\?(?!\\?))?)*))?"
    },
    "assignment-expression": {
      "begin": "(?:\\*|/|%|\\+|-|\\?\\?|\\&|\\^|<<|>>>?|\\|)?=(?!=|>)",
      "beginCaptures": {
        "0": {
          "patterns": [
            {
              "include": "#assignment-operators"
            }
          ]
        }
      },
      "end": "(?=[,\\)\\];}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "assignment-operators": {
      "patterns": [
        {
          "match": "\\*=|/=|%=|\\+=|-=|\\?\\?=",
          "name": "keyword.operator.assignment.compound.cs"
        },
        {
          "match": "\\&=|\\^=|<<=|>>>?=|\\|=",
          "name": "keyword.operator.assignment.compound.bitwise.cs"
        },
        {
          "match": "\\=",
          "name": "keyword.operator.assignment.cs"
        }
      ]
    },
    "attribute": {
      "patterns": [
        {
          "include": "#type-name"
        },
        {
          "include": "#type-arguments"
        },
        {
          "include": "#attribute-arguments"
        }
      ]
    },
    "attribute-arguments": {
      "begin": "(\\()",
      "beginCaptures": {
        "1": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#attribute-named-argument"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "attribute-named-argument": {
      "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?==)",
      "beginCaptures": {
        "1": {
          "name": "entity.name.variable.property.cs"
        }
      },
      "end": "(?=(,|\\)))",
      "patterns": [
        {
          "include": "#operator-assignment"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "attribute-section": {
      "begin": "(\\[)(assembly|module|field|event|method|param|property|return|type)?(\\:)?",
      "beginCaptures": {
        "1": {
          "name": "punctuation.squarebracket.open.cs"
        },
        "2": {
          "name": "keyword.other.attribute-specifier.cs"
        },
        "3": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(\\])",
      "endCaptures": {
        "1": {
          "name": "punctuation.squarebracket.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#attribute"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "await-expression": {
      "match": "(?<!\\.\\s*)\\b(await)\\b",
      "name": "keyword.operator.expression.await.cs"
    },
    "await-statement": {
      "begin": "(?<!\\.\\s*)\\b(await)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.await.cs"
        }
      },
      "end": "(?<=})|(?=;|})",
      "patterns": [
        {
          "include": "#foreach-statement"
        },
        {
          "include": "#using-statement"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "base-types": {
      "begin": ":",
      "beginCaptures": {
        "0": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(?=\\{|where|;)",
      "patterns": [
        {
          "include": "#type"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#preprocessor"
        }
      ]
    },
    "block": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "boolean-literal": {
      "patterns": [
        {
          "match": "(?<!\\.)\\btrue\\b",
          "name": "constant.language.boolean.true.cs"
        },
        {
          "match": "(?<!\\.)\\bfalse\\b",
          "name": "constant.language.boolean.false.cs"
        }
      ]
    },
    "bracketed-argument-list": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.squarebracket.open.cs"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "punctuation.squarebracket.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#named-argument"
        },
        {
          "include": "#argument"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "bracketed-parameter-list": {
      "begin": "(?=(\\[))",
      "beginCaptures": {
        "1": {
          "name": "punctuation.squarebracket.open.cs"
        }
      },
      "end": "(?=(\\]))",
      "endCaptures": {
        "1": {
          "name": "punctuation.squarebracket.close.cs"
        }
      },
      "patterns": [
        {
          "begin": "(?<=\\[)",
          "end": "(?=\\])",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#attribute-section"
            },
            {
              "include": "#parameter"
            },
            {
              "include": "#punctuation-comma"
            },
            {
              "include": "#variable-initializer"
            }
          ]
        }
      ]
    },
    "break-or-continue-statement": {
      "match": "(?<!\\.)\\b(break|continue)\\b",
      "name": "keyword.control.flow.$1.cs"
    },
    "case-guard": {
      "patterns": [
        {
          "include": "#parenthesized-expression"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "cast-expression": {
      "captures": {
        "1": {
          "name": "punctuation.parenthesis.open.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "match": "(\\()\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*(\\))(?=\\s*-*!*@?[_[:alnum:]\\(])"
    },
    "casted-constant-pattern": {
      "begin": "(\\()([\\s.:@_[:alnum:]]+)(\\))(?=[\\s+\\-!~]*@?[_[:alnum:]('\"]+)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.parenthesis.open.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type-builtin"
            },
            {
              "include": "#type-name"
            }
          ]
        },
        "3": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "include": "#casted-constant-pattern"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#constant-pattern"
            }
          ]
        },
        {
          "include": "#constant-pattern"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.type.alias.cs"
            },
            "2": {
              "name": "punctuation.separator.coloncolon.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\:\\:)"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.type.cs"
            },
            "2": {
              "name": "punctuation.accessor.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\.)"
        },
        {
          "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
          "name": "variable.other.constant.cs"
        }
      ]
    },
    "catch-clause": {
      "begin": "(?<!\\.)\\b(catch)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.exception.catch.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "captures": {
                "1": {
                  "patterns": [
                    {
                      "include": "#type"
                    }
                  ]
                },
                "6": {
                  "name": "entity.name.variable.local.cs"
                }
              },
              "match": "(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*(?:(\\g<identifier>)\\b)?"
            }
          ]
        },
        {
          "include": "#when-clause"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#block"
        }
      ]
    },
    "char-character-escape": {
      "match": "\\\\(x[0-9a-fA-F]{1,4}|u[0-9a-fA-F]{4}|.)",
      "name": "constant.character.escape.cs"
    },
    "char-literal": {
      "begin": "'",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.char.begin.cs"
        }
      },
      "end": "(\\')|((?:[^\\\\\\n])$)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.char.end.cs"
        },
        "2": {
          "name": "invalid.illegal.newline.cs"
        }
      },
      "name": "string.quoted.single.cs",
      "patterns": [
        {
          "include": "#char-character-escape"
        }
      ]
    },
    "class-declaration": {
      "begin": "(?=(\\brecord\\b\\s+)?\\bclass\\b)",
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "begin": "(\\b(record)\\b\\s+)?\\b(class)\\b\\s+(@?[_[:alpha:]][_[:alnum:]]*)\\s*",
          "beginCaptures": {
            "2": {
              "name": "storage.type.record.cs"
            },
            "3": {
              "name": "storage.type.class.cs"
            },
            "4": {
              "name": "entity.name.type.class.cs"
            }
          },
          "end": "(?=\\{)|(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type-parameter-list"
            },
            {
              "include": "#parenthesized-parameter-list"
            },
            {
              "include": "#base-types"
            },
            {
              "include": "#generic-constraints"
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "class-or-struct-members": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#storage-modifier"
        },
        {
          "include": "#type-declarations"
        },
        {
          "include": "#property-declaration"
        },
        {
          "include": "#field-declaration"
        },
        {
          "include": "#event-declaration"
        },
        {
          "include": "#indexer-declaration"
        },
        {
          "include": "#variable-initializer"
        },
        {
          "include": "#constructor-declaration"
        },
        {
          "include": "#destructor-declaration"
        },
        {
          "include": "#operator-declaration"
        },
        {
          "include": "#conversion-operator-declaration"
        },
        {
          "include": "#method-declaration"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "combinator-pattern": {
      "match": "\\b(and|or|not)\\b",
      "name": "keyword.operator.expression.pattern.combinator.$1.cs"
    },
    "comment": {
      "patterns": [
        {
          "begin": "(^\\s+)?(///)(?!/)",
          "captures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.cs"
            },
            "2": {
              "name": "punctuation.definition.comment.cs"
            }
          },
          "name": "comment.block.documentation.cs",
          "patterns": [
            {
              "include": "#xml-doc-comment"
            }
          ],
          "while": "^(\\s*)(///)(?!/)"
        },
        {
          "begin": "(^\\s+)?(/\\*\\*)(?!/)",
          "captures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.cs"
            },
            "2": {
              "name": "punctuation.definition.comment.cs"
            }
          },
          "end": "(^\\s+)?(\\*/)",
          "name": "comment.block.documentation.cs",
          "patterns": [
            {
              "begin": "\\G(?=(?~\\*/)$)",
              "patterns": [
                {
                  "include": "#xml-doc-comment"
                }
              ],
              "while": "^(\\s*+)(\\*(?!/))?(?=(?~\\*/)$)",
              "whileCaptures": {
                "1": {
                  "name": "punctuation.whitespace.comment.leading.cs"
                },
                "2": {
                  "name": "punctuation.definition.comment.cs"
                }
              }
            },
            {
              "include": "#xml-doc-comment"
            }
          ]
        },
        {
          "begin": "(^\\s+)?(//).*$",
          "captures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.cs"
            },
            "2": {
              "name": "punctuation.definition.comment.cs"
            }
          },
          "name": "comment.line.double-slash.cs",
          "while": "^(\\s*)(//).*$"
        },
        {
          "begin": "/\\*",
          "captures": {
            "0": {
              "name": "punctuation.definition.comment.cs"
            }
          },
          "end": "\\*/",
          "name": "comment.block.cs"
        }
      ]
    },
    "conditional-operator": {
      "patterns": [
        {
          "match": "\\?(?!\\?|\\s*[.\\[])",
          "name": "keyword.operator.conditional.question-mark.cs"
        },
        {
          "match": ":",
          "name": "keyword.operator.conditional.colon.cs"
        }
      ]
    },
    "constant-pattern": {
      "patterns": [
        {
          "include": "#boolean-literal"
        },
        {
          "include": "#null-literal"
        },
        {
          "include": "#numeric-literal"
        },
        {
          "include": "#char-literal"
        },
        {
          "include": "#string-literal"
        },
        {
          "include": "#raw-string-literal"
        },
        {
          "include": "#verbatim-string-literal"
        },
        {
          "include": "#type-operator-expression"
        },
        {
          "include": "#expression-operator-expression"
        },
        {
          "include": "#expression-operators"
        },
        {
          "include": "#casted-constant-pattern"
        }
      ]
    },
    "constructor-declaration": {
      "begin": "(?=@?[_[:alpha:]][_[:alnum:]]*\\s*\\()",
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "entity.name.function.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b"
        },
        {
          "begin": "(:)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.separator.colon.cs"
            }
          },
          "end": "(?=\\{|=>)",
          "patterns": [
            {
              "include": "#constructor-initializer"
            }
          ]
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "constructor-initializer": {
      "begin": "\\b(base|this)\\b\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "variable.language.$1.cs"
        }
      },
      "end": "(?<=\\))",
      "patterns": [
        {
          "include": "#argument-list"
        }
      ]
    },
    "context-control-paren-statement": {
      "patterns": [
        {
          "include": "#fixed-statement"
        },
        {
          "include": "#lock-statement"
        },
        {
          "include": "#using-statement"
        }
      ]
    },
    "context-control-statement": {
      "match": "\\b(checked|unchecked|unsafe)\\b(?!\\s*[@_[:alpha:](])",
      "name": "keyword.control.context.$1.cs"
    },
    "conversion-operator-declaration": {
      "begin": "(?<explicit_or_implicit_keyword>(?:\\b(?:explicit|implicit)))\\s*(?<operator_keyword>(?:\\b(?:operator)))\\s*(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "captures": {
                "1": {
                  "name": "storage.modifier.explicit.cs"
                }
              },
              "match": "\\b(explicit)\\b"
            },
            {
              "captures": {
                "1": {
                  "name": "storage.modifier.implicit.cs"
                }
              },
              "match": "\\b(implicit)\\b"
            }
          ]
        },
        "2": {
          "name": "storage.type.operator.cs"
        },
        "3": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "declaration-expression-local": {
      "captures": {
        "1": {
          "name": "storage.type.var.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.local.cs"
        }
      },
      "match": "(?:\\b(var)\\b|(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*)))\\s+(\\g<identifier>)\\b\\s*(?=[,)\\]])"
    },
    "declaration-expression-tuple": {
      "captures": {
        "1": {
          "name": "storage.type.var.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.tuple-element.cs"
        }
      },
      "match": "(?:\\b(var)\\b|(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*)))\\s+(\\g<identifier>)\\b\\s*(?=[,)])"
    },
    "declarations": {
      "patterns": [
        {
          "include": "#namespace-declaration"
        },
        {
          "include": "#type-declarations"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "default-argument": {
      "begin": "=",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.assignment.cs"
        }
      },
      "end": "(?=,|\\))",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "default-literal-expression": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.default.cs"
        }
      },
      "match": "\\b(default)\\b"
    },
    "delegate-declaration": {
      "begin": "(?:\\b(delegate)\\b)\\s+(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+(\\g<identifier>)\\s*(<([^<>]+)>)?\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "storage.type.delegate.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.type.delegate.cs"
        },
        "8": {
          "patterns": [
            {
              "include": "#type-parameter-list"
            }
          ]
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#generic-constraints"
        }
      ]
    },
    "designation-pattern": {
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#punctuation-comma"
            },
            {
              "include": "#designation-pattern"
            }
          ]
        },
        {
          "include": "#simple-designation-pattern"
        }
      ]
    },
    "destructor-declaration": {
      "begin": "(~)(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "punctuation.tilde.cs"
        },
        "2": {
          "name": "entity.name.function.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "directives": {
      "patterns": [
        {
          "include": "#extern-alias-directive"
        },
        {
          "include": "#using-directive"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "discard-pattern": {
      "match": "_(?![_[:alnum:]])",
      "name": "variable.language.discard.cs"
    },
    "do-statement": {
      "begin": "(?<!\\.)\\b(do)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.loop.do.cs"
        }
      },
      "end": "(?=;|})",
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "double-raw-interpolation": {
      "begin": "(?<=[^\\{][^\\{]|^)((?:\\{)*)(\\{\\{)(?=[^\\{])",
      "beginCaptures": {
        "1": {
          "name": "string.quoted.double.cs"
        },
        "2": {
          "name": "punctuation.definition.interpolation.begin.cs"
        }
      },
      "end": "\\}\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.interpolation.end.cs"
        }
      },
      "name": "meta.interpolation.cs",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "element-access-expression": {
      "begin": "(?:(?:(\\?)\\s*)?(\\.)\\s*|(->)\\s*)?(?:(@?[_[:alpha:]][_[:alnum:]]*)\\s*)?(?:(\\?)\\s*)?(?=\\[)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.null-conditional.cs"
        },
        "2": {
          "name": "punctuation.accessor.cs"
        },
        "3": {
          "name": "punctuation.accessor.pointer.cs"
        },
        "4": {
          "name": "variable.other.object.property.cs"
        },
        "5": {
          "name": "keyword.operator.null-conditional.cs"
        }
      },
      "end": "(?<=\\])(?!\\s*\\[)",
      "patterns": [
        {
          "include": "#bracketed-argument-list"
        }
      ]
    },
    "else-part": {
      "begin": "(?<!\\.)\\b(else)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.conditional.else.cs"
        }
      },
      "end": "(?<=})|(?=;)",
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "enum-declaration": {
      "begin": "(?=\\benum\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?=enum)",
          "end": "(?=\\{)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "captures": {
                "1": {
                  "name": "storage.type.enum.cs"
                },
                "2": {
                  "name": "entity.name.type.enum.cs"
                }
              },
              "match": "(enum)\\s+(@?[_[:alpha:]][_[:alnum:]]*)"
            },
            {
              "begin": ":",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.separator.colon.cs"
                }
              },
              "end": "(?=\\{)",
              "patterns": [
                {
                  "include": "#type"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#preprocessor"
            },
            {
              "include": "#comment"
            },
            {
              "include": "#attribute-section"
            },
            {
              "include": "#punctuation-comma"
            },
            {
              "begin": "@?[_[:alpha:]][_[:alnum:]]*",
              "beginCaptures": {
                "0": {
                  "name": "entity.name.variable.enum-member.cs"
                }
              },
              "end": "(?=(,|\\}))",
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "include": "#variable-initializer"
                }
              ]
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "event-accessors": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#attribute-section"
        },
        {
          "begin": "\\b(add|remove)\\b\\s*(?=\\{|;|=>|//|/\\*|$)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.accessor.$1.cs"
            }
          },
          "end": "(?<=\\}|;)|(?=\\})",
          "patterns": [
            {
              "include": "#accessor-setter"
            }
          ]
        }
      ]
    },
    "event-declaration": {
      "begin": "\\b(event)\\b\\s*(?<return_type>(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+)(?<interface_name>\\g<type_name>\\s*\\.\\s*)?(\\g<identifier>)\\s*(?=\\{|;|,|=|//|/\\*|$)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.event.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "8": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "9": {
          "name": "entity.name.variable.event.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#event-accessors"
        },
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.variable.event.cs"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "begin": "=",
          "beginCaptures": {
            "0": {
              "name": "keyword.operator.assignment.cs"
            }
          },
          "end": "(?<=,)|(?=;)",
          "patterns": [
            {
              "include": "#expression"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        }
      ]
    },
    "explicit-anonymous-function-parameter": {
      "captures": {
        "1": {
          "name": "storage.modifier.$1.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.parameter.cs"
        }
      },
      "match": "(?:\\b(ref|params|out|in)\\b\\s*)?(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args><(?:[^<>]|\\g<type_args>)*>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^()]|\\g<tuple>)*\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*\\b(\\g<identifier>)\\b"
    },
    "expression": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#expression-operator-expression"
        },
        {
          "include": "#type-operator-expression"
        },
        {
          "include": "#default-literal-expression"
        },
        {
          "include": "#throw-expression"
        },
        {
          "include": "#raw-interpolated-string"
        },
        {
          "include": "#interpolated-string"
        },
        {
          "include": "#verbatim-interpolated-string"
        },
        {
          "include": "#type-builtin"
        },
        {
          "include": "#language-variable"
        },
        {
          "include": "#switch-statement-or-expression"
        },
        {
          "include": "#with-expression"
        },
        {
          "include": "#conditional-operator"
        },
        {
          "include": "#assignment-expression"
        },
        {
          "include": "#expression-operators"
        },
        {
          "include": "#await-expression"
        },
        {
          "include": "#query-expression"
        },
        {
          "include": "#as-expression"
        },
        {
          "include": "#is-expression"
        },
        {
          "include": "#anonymous-method-expression"
        },
        {
          "include": "#object-creation-expression"
        },
        {
          "include": "#array-creation-expression"
        },
        {
          "include": "#anonymous-object-creation-expression"
        },
        {
          "include": "#invocation-expression"
        },
        {
          "include": "#member-access-expression"
        },
        {
          "include": "#element-access-expression"
        },
        {
          "include": "#cast-expression"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#parenthesized-expression"
        },
        {
          "include": "#tuple-deconstruction-assignment"
        },
        {
          "include": "#initializer-expression"
        },
        {
          "include": "#identifier"
        }
      ]
    },
    "expression-body": {
      "begin": "=>",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.arrow.cs"
        }
      },
      "end": "(?=[,\\);}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "expression-operator-expression": {
      "begin": "\\b(checked|unchecked|nameof)\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.$1.cs"
        },
        "2": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "expression-operators": {
      "patterns": [
        {
          "match": "<<|>>>?",
          "name": "keyword.operator.bitwise.shift.cs"
        },
        {
          "match": "==|!=",
          "name": "keyword.operator.comparison.cs"
        },
        {
          "match": "<=|>=|<|>",
          "name": "keyword.operator.relational.cs"
        },
        {
          "match": "\\!|&&|\\|\\|",
          "name": "keyword.operator.logical.cs"
        },
        {
          "match": "\\&|~|\\^|\\|",
          "name": "keyword.operator.bitwise.cs"
        },
        {
          "match": "--",
          "name": "keyword.operator.decrement.cs"
        },
        {
          "match": "\\+\\+",
          "name": "keyword.operator.increment.cs"
        },
        {
          "match": "\\+|-(?!>)|\\*|/|%",
          "name": "keyword.operator.arithmetic.cs"
        },
        {
          "match": "\\?\\?",
          "name": "keyword.operator.null-coalescing.cs"
        },
        {
          "match": "\\.\\.",
          "name": "keyword.operator.range.cs"
        }
      ]
    },
    "extern-alias-directive": {
      "begin": "\\b(extern)\\s+(alias)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.directive.extern.cs"
        },
        "2": {
          "name": "keyword.other.directive.alias.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
          "name": "variable.other.alias.cs"
        }
      ]
    },
    "field-declaration": {
      "begin": "(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+(\\g<identifier>)\\s*(?!=>|==)(?=,|;|=|$)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "entity.name.variable.field.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.variable.field.cs"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#variable-initializer"
        },
        {
          "include": "#class-or-struct-members"
        }
      ]
    },
    "finally-clause": {
      "begin": "(?<!\\.)\\b(finally)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.exception.finally.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#block"
        }
      ]
    },
    "fixed-statement": {
      "begin": "\\b(fixed)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.context.fixed.cs"
        }
      },
      "end": "(?<=\\))|(?=;|})",
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#local-variable-declaration"
            }
          ]
        }
      ]
    },
    "for-statement": {
      "begin": "\\b(for)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.loop.for.cs"
        }
      },
      "end": "(?<=\\))|(?=;|})",
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "begin": "(?=[^;\\)])",
              "end": "(?=;|\\))",
              "patterns": [
                {
                  "include": "#intrusive"
                },
                {
                  "include": "#local-variable-declaration"
                }
              ]
            },
            {
              "begin": "(?=;)",
              "end": "(?=\\))",
              "patterns": [
                {
                  "include": "#intrusive"
                },
                {
                  "include": "#expression"
                },
                {
                  "include": "#punctuation-comma"
                },
                {
                  "include": "#punctuation-semicolon"
                }
              ]
            }
          ]
        }
      ]
    },
    "foreach-statement": {
      "begin": "\\b(foreach)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.loop.foreach.cs"
        }
      },
      "end": "(?<=\\))|(?=;|})",
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "captures": {
                "1": {
                  "name": "storage.modifier.ref.cs"
                },
                "2": {
                  "name": "storage.type.var.cs"
                },
                "3": {
                  "patterns": [
                    {
                      "include": "#type"
                    }
                  ]
                },
                "8": {
                  "name": "entity.name.variable.local.cs"
                },
                "9": {
                  "name": "keyword.control.loop.in.cs"
                }
              },
              "match": "(?:(?:(\\bref)\\s+)?(\\bvar\\b)|(?<type_name>(?:(?:ref\\s+)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*)))\\s+(\\g<identifier>)\\s+\\b(in)\\b"
            },
            {
              "captures": {
                "1": {
                  "name": "storage.type.var.cs"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tuple-declaration-deconstruction-element-list"
                    }
                  ]
                },
                "3": {
                  "name": "keyword.control.loop.in.cs"
                }
              },
              "match": "(?:\\b(var)\\b\\s*)?(?<tuple>\\((?:[^\\(\\)]|\\g<tuple>)+\\))\\s+\\b(in)\\b"
            },
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "generic-constraints": {
      "begin": "(where)\\s+(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.where.cs"
        },
        "2": {
          "name": "entity.name.type.type-parameter.cs"
        },
        "3": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(?=\\{|where|;|=>)",
      "patterns": [
        {
          "match": "\\bclass\\b",
          "name": "storage.type.class.cs"
        },
        {
          "match": "\\bstruct\\b",
          "name": "storage.type.struct.cs"
        },
        {
          "match": "\\bdefault\\b",
          "name": "keyword.other.constraint.default.cs"
        },
        {
          "match": "\\bnotnull\\b",
          "name": "keyword.other.constraint.notnull.cs"
        },
        {
          "match": "\\bunmanaged\\b",
          "name": "keyword.other.constraint.unmanaged.cs"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.expression.new.cs"
            },
            "2": {
              "name": "punctuation.parenthesis.open.cs"
            },
            "3": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "match": "(new)\\s*(\\()\\s*(\\))"
        },
        {
          "include": "#type"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#generic-constraints"
        }
      ]
    },
    "goto-statement": {
      "begin": "(?<!\\.)\\b(goto)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.goto.cs"
        }
      },
      "end": "(?=[;}])",
      "patterns": [
        {
          "begin": "\\b(case)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.conditional.case.cs"
            }
          },
          "end": "(?=[;}])",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "keyword.control.conditional.default.cs"
            }
          },
          "match": "\\b(default)\\b"
        },
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.label.cs"
        }
      ]
    },
    "group-by": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.by.cs"
        }
      },
      "match": "\\b(by)\\b\\s*"
    },
    "group-clause": {
      "begin": "\\b(group)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.group.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#group-by"
        },
        {
          "include": "#group-into"
        },
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "group-into": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.into.cs"
        },
        "2": {
          "name": "entity.name.variable.range-variable.cs"
        }
      },
      "match": "\\b(into)\\b\\s*(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*"
    },
    "identifier": {
      "match": "@?[_[:alpha:]][_[:alnum:]]*",
      "name": "variable.other.readwrite.cs"
    },
    "if-statement": {
      "begin": "(?<!\\.)\\b(if)\\b\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.conditional.if.cs"
        }
      },
      "end": "(?<=})|(?=;)",
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "include": "#statement"
        }
      ]
    },
    "implicit-anonymous-function-parameter": {
      "match": "\\@?[_[:alpha:]][_[:alnum:]]*\\b",
      "name": "entity.name.variable.parameter.cs"
    },
    "indexer-declaration": {
      "begin": "(?<return_type>(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+)(?<interface_name>\\g<type_name>\\s*\\.\\s*)?(?<indexer_name>this)\\s*(?=\\[)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "8": {
          "name": "variable.language.this.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#bracketed-parameter-list"
        },
        {
          "include": "#property-accessors"
        },
        {
          "include": "#accessor-getter-expression"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "initializer-expression": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "interface-declaration": {
      "begin": "(?=\\binterface\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(interface)\\b\\s+(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.interface.cs"
            },
            "2": {
              "name": "entity.name.type.interface.cs"
            }
          },
          "end": "(?=\\{)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type-parameter-list"
            },
            {
              "include": "#base-types"
            },
            {
              "include": "#generic-constraints"
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#interface-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "interface-members": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#storage-modifier"
        },
        {
          "include": "#property-declaration"
        },
        {
          "include": "#event-declaration"
        },
        {
          "include": "#indexer-declaration"
        },
        {
          "include": "#method-declaration"
        },
        {
          "include": "#operator-declaration"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "interpolated-string": {
      "begin": "\\$\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "(\")|((?:[^\\\\\\n])$)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.cs"
        },
        "2": {
          "name": "invalid.illegal.newline.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#string-character-escape"
        },
        {
          "include": "#interpolation"
        }
      ]
    },
    "interpolation": {
      "begin": "(?<=[^\\{]|^)((?:\\{\\{)*)(\\{)(?=[^\\{])",
      "beginCaptures": {
        "1": {
          "name": "string.quoted.double.cs"
        },
        "2": {
          "name": "punctuation.definition.interpolation.begin.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.interpolation.end.cs"
        }
      },
      "name": "meta.interpolation.cs",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "intrusive": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "invocation-expression": {
      "begin": "(?:(?:(\\?)\\s*)?(\\.)\\s*|(->)\\s*)?(@?[_[:alpha:]][_[:alnum:]]*)\\s*(<(?<type_args>[^<>()]|\\((?:[^<>()]|<[^<>()]*>|\\([^<>()]*\\))*\\)|<\\g<type_args>*>)*>\\s*)?(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.null-conditional.cs"
        },
        "2": {
          "name": "punctuation.accessor.cs"
        },
        "3": {
          "name": "punctuation.accessor.pointer.cs"
        },
        "4": {
          "name": "entity.name.function.cs"
        },
        "5": {
          "patterns": [
            {
              "include": "#type-arguments"
            }
          ]
        }
      },
      "end": "(?<=\\))",
      "patterns": [
        {
          "include": "#argument-list"
        }
      ]
    },
    "is-expression": {
      "begin": "(?<!\\.)\\b(is)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.pattern.is.cs"
        }
      },
      "end": "(?=[)}\\],;:?=&|^]|!=)",
      "patterns": [
        {
          "include": "#pattern"
        }
      ]
    },
    "join-clause": {
      "begin": "\\b(join)\\b\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))?\\s+(\\g<identifier>)\\b\\s*\\b(in)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.join.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.range-variable.cs"
        },
        "8": {
          "name": "keyword.operator.expression.query.in.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#join-on"
        },
        {
          "include": "#join-equals"
        },
        {
          "include": "#join-into"
        },
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "join-equals": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.equals.cs"
        }
      },
      "match": "\\b(equals)\\b\\s*"
    },
    "join-into": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.into.cs"
        },
        "2": {
          "name": "entity.name.variable.range-variable.cs"
        }
      },
      "match": "\\b(into)\\b\\s*(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*"
    },
    "join-on": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.on.cs"
        }
      },
      "match": "\\b(on)\\b\\s*"
    },
    "labeled-statement": {
      "captures": {
        "1": {
          "name": "entity.name.label.cs"
        },
        "2": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)"
    },
    "language-variable": {
      "patterns": [
        {
          "match": "\\b(base|this)\\b",
          "name": "variable.language.$1.cs"
        },
        {
          "match": "\\b(value)\\b",
          "name": "variable.other.$1.cs"
        }
      ]
    },
    "let-clause": {
      "begin": "\\b(let)\\b\\s*(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*(=)\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.let.cs"
        },
        "2": {
          "name": "entity.name.variable.range-variable.cs"
        },
        "3": {
          "name": "keyword.operator.assignment.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "list-pattern": {
      "begin": "(?=\\[)",
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "begin": "\\[",
          "beginCaptures": {
            "0": {
              "name": "punctuation.squarebracket.open.cs"
            }
          },
          "end": "\\]",
          "endCaptures": {
            "0": {
              "name": "punctuation.squarebracket.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#pattern"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        },
        {
          "begin": "(?<=\\])",
          "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#simple-designation-pattern"
            }
          ]
        }
      ]
    },
    "literal": {
      "patterns": [
        {
          "include": "#boolean-literal"
        },
        {
          "include": "#null-literal"
        },
        {
          "include": "#numeric-literal"
        },
        {
          "include": "#char-literal"
        },
        {
          "include": "#raw-string-literal"
        },
        {
          "include": "#string-literal"
        },
        {
          "include": "#verbatim-string-literal"
        },
        {
          "include": "#tuple-literal"
        }
      ]
    },
    "local-constant-declaration": {
      "begin": "(?<const_keyword>\\b(?:const)\\b)\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+(\\g<identifier>)\\s*(?=,|;|=)",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.const.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.local.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.variable.local.cs"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "local-declaration": {
      "patterns": [
        {
          "include": "#local-constant-declaration"
        },
        {
          "include": "#local-variable-declaration"
        },
        {
          "include": "#local-function-declaration"
        },
        {
          "include": "#local-tuple-var-deconstruction"
        }
      ]
    },
    "local-function-declaration": {
      "begin": "\\b((?:(?:async|unsafe|static|extern)\\s+)*)(?<type_name>(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?)?(?:\\s*\\[\\s*(?:,\\s*)*\\](?:\\s*\\?)?)*)\\s+(\\g<identifier>)\\s*(<[^<>]+>)?\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#storage-modifier"
            }
          ]
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.function.cs"
        },
        "8": {
          "patterns": [
            {
              "include": "#type-parameter-list"
            }
          ]
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#generic-constraints"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "local-tuple-var-deconstruction": {
      "begin": "(?:\\b(var)\\b\\s*)(?<tuple>\\((?:[^\\(\\)]|\\g<tuple>)+\\))\\s*(?=;|=|\\))",
      "beginCaptures": {
        "1": {
          "name": "storage.type.var.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#tuple-declaration-deconstruction-element-list"
            }
          ]
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "local-variable-declaration": {
      "begin": "(?:(?:(\\bref)\\s+(?:(\\breadonly)\\s+)?)?(\\bvar\\b)|(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*[?*]\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*)))\\s+(\\g<identifier>)\\s*(?!=>)(?=,|;|=|\\))",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.ref.cs"
        },
        "2": {
          "name": "storage.modifier.readonly.cs"
        },
        "3": {
          "name": "storage.type.var.cs"
        },
        "4": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "9": {
          "name": "entity.name.variable.local.cs"
        }
      },
      "end": "(?=[;)}])",
      "patterns": [
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.variable.local.cs"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "lock-statement": {
      "begin": "\\b(lock)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.context.lock.cs"
        }
      },
      "end": "(?<=\\))|(?=;|})",
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "member-access-expression": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.null-conditional.cs"
            },
            "2": {
              "name": "punctuation.accessor.cs"
            },
            "3": {
              "name": "punctuation.accessor.pointer.cs"
            },
            "4": {
              "name": "variable.other.object.property.cs"
            }
          },
          "match": "(?:(?:(\\?)\\s*)?(\\.)\\s*|(->)\\s*)(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?![_[:alnum:]]|\\(|(\\?)?\\[|<)"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.accessor.cs"
            },
            "2": {
              "name": "variable.other.object.cs"
            },
            "3": {
              "patterns": [
                {
                  "include": "#type-arguments"
                }
              ]
            }
          },
          "match": "(\\.)?\\s*(@?[_[:alpha:]][_[:alnum:]]*)(?<type_params>\\s*<([^<>]|\\g<type_params>)+>\\s*)(?=(\\s*\\?)?\\s*\\.\\s*@?[_[:alpha:]][_[:alnum:]]*)"
        },
        {
          "captures": {
            "1": {
              "name": "variable.other.object.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)(?=\\s*(?:(?:\\?\\s*)?\\.|->)\\s*@?[_[:alpha:]][_[:alnum:]]*)"
        }
      ]
    },
    "method-declaration": {
      "begin": "(?<return_type>(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+)(?<interface_name>\\g<type_name>\\s*\\.\\s*)?(\\g<identifier>)\\s*(<([^<>]+)>)?\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "8": {
          "name": "entity.name.function.cs"
        },
        "9": {
          "patterns": [
            {
              "include": "#type-parameter-list"
            }
          ]
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#generic-constraints"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "named-argument": {
      "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "entity.name.variable.parameter.cs"
        },
        "2": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(?=(,|\\)|\\]))",
      "patterns": [
        {
          "include": "#argument"
        }
      ]
    },
    "namespace-declaration": {
      "begin": "\\b(namespace)\\s+",
      "beginCaptures": {
        "1": {
          "name": "storage.type.namespace.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.type.namespace.cs"
        },
        {
          "include": "#punctuation-accessor"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#declarations"
            },
            {
              "include": "#using-directive"
            },
            {
              "include": "#punctuation-semicolon"
            }
          ]
        }
      ]
    },
    "null-literal": {
      "match": "(?<!\\.)\\bnull\\b",
      "name": "constant.language.null.cs"
    },
    "numeric-literal": {
      "captures": {
        "0": {
          "patterns": [
            {
              "begin": "(?=.)",
              "end": "$",
              "patterns": [
                {
                  "captures": {
                    "10": {
                      "name": "keyword.operator.arithmetic.cs"
                    },
                    "11": {
                      "name": "constant.numeric.decimal.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "12": {
                      "name": "constant.numeric.other.suffix.cs"
                    },
                    "2": {
                      "name": "constant.numeric.decimal.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "3": {
                      "name": "constant.numeric.other.separator.thousands.cs"
                    },
                    "4": {
                      "name": "constant.numeric.other.separator.decimals.cs"
                    },
                    "5": {
                      "name": "constant.numeric.decimal.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "6": {
                      "name": "constant.numeric.other.separator.thousands.cs"
                    },
                    "8": {
                      "name": "constant.numeric.other.exponent.cs"
                    },
                    "9": {
                      "name": "keyword.operator.arithmetic.cs"
                    }
                  },
                  "match": "(\\G(?=[0-9.])(?!0[xXbB]))([0-9](?:[0-9]|((?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)?((?:(?<=[0-9])|\\.(?=[0-9])))([0-9](?:[0-9]|((?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)?((?<!_)([eE])(\\+?)(\\-?)((?:[0-9](?:[0-9]|(?:(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)))?([fFdDmM](?!\\w))?$"
                },
                {
                  "captures": {
                    "1": {
                      "name": "constant.numeric.other.preffix.binary.cs"
                    },
                    "2": {
                      "name": "constant.numeric.binary.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "3": {
                      "name": "constant.numeric.other.separator.thousands.cs"
                    },
                    "4": {
                      "name": "constant.numeric.other.suffix.cs"
                    }
                  },
                  "match": "(\\G0[bB])([01_](?:[01_]|((?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)((?:(?:(?:(?:(?:[uU]|[uU]l)|[uU]L)|l[uU]?)|L[uU]?)|[fFdDmM])(?!\\w))?$"
                },
                {
                  "captures": {
                    "1": {
                      "name": "constant.numeric.other.preffix.hex.cs"
                    },
                    "2": {
                      "name": "constant.numeric.hex.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "3": {
                      "name": "constant.numeric.other.separator.thousands.cs"
                    },
                    "4": {
                      "name": "constant.numeric.other.suffix.cs"
                    }
                  },
                  "match": "(\\G0[xX])([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)((?:(?:(?:(?:(?:[uU]|[uU]l)|[uU]L)|l[uU]?)|L[uU]?)|[fFdDmM])(?!\\w))?$"
                },
                {
                  "captures": {
                    "2": {
                      "name": "constant.numeric.decimal.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "3": {
                      "name": "constant.numeric.other.separator.thousands.cs"
                    },
                    "5": {
                      "name": "constant.numeric.other.exponent.cs"
                    },
                    "6": {
                      "name": "keyword.operator.arithmetic.cs"
                    },
                    "7": {
                      "name": "keyword.operator.arithmetic.cs"
                    },
                    "8": {
                      "name": "constant.numeric.decimal.cs",
                      "patterns": [
                        {
                          "match": "(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])",
                          "name": "constant.numeric.other.separator.thousands.cs"
                        }
                      ]
                    },
                    "9": {
                      "name": "constant.numeric.other.suffix.cs"
                    }
                  },
                  "match": "(\\G(?=[0-9.])(?!0[xXbB]))([0-9](?:[0-9]|((?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)((?<!_)([eE])(\\+?)(\\-?)((?:[0-9](?:[0-9]|(?:(?<=[0-9a-fA-F])_(?=[0-9a-fA-F])))*)))?((?:(?:(?:(?:(?:[uU]|[uU]l)|[uU]L)|l[uU]?)|L[uU]?)|[fFdDmM])(?!\\w))?$"
                },
                {
                  "match": "(?:(?:[0-9a-zA-Z_]|_)|(?<=[eE])[+-]|\\.\\d)+",
                  "name": "invalid.illegal.constant.numeric.cs"
                }
              ]
            }
          ]
        }
      },
      "match": "(?<!\\w)\\.?\\d(?:(?:[0-9a-zA-Z_]|_)|(?<=[eE])[+-]|\\.\\d)*"
    },
    "object-creation-expression": {
      "patterns": [
        {
          "include": "#object-creation-expression-with-parameters"
        },
        {
          "include": "#object-creation-expression-with-no-parameters"
        }
      ]
    },
    "object-creation-expression-with-no-parameters": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.new.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "match": "(new)\\s+(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*(?=\\{|//|/\\*|$)"
    },
    "object-creation-expression-with-parameters": {
      "begin": "(new)(?:\\s+(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*)))?\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.new.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "end": "(?<=\\))",
      "patterns": [
        {
          "include": "#argument-list"
        }
      ]
    },
    "operator-assignment": {
      "match": "(?<!=|!)(=)(?!=)",
      "name": "keyword.operator.assignment.cs"
    },
    "operator-declaration": {
      "begin": "(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s*\\b(?<operator_keyword>operator)\\b\\s*(?<operator>[+\\-*/%&|\\^!=~<>]+|true|false)\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "storage.type.operator.cs"
        },
        "7": {
          "name": "entity.name.function.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "orderby-clause": {
      "begin": "\\b(orderby)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.orderby.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#ordering-direction"
        },
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "ordering-direction": {
      "captures": {
        "1": {
          "name": "keyword.operator.expression.query.$1.cs"
        }
      },
      "match": "\\b(ascending|descending)\\b"
    },
    "parameter": {
      "captures": {
        "1": {
          "name": "storage.modifier.$1.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.parameter.cs"
        }
      },
      "match": "(?:(?:\\b(ref|params|out|in|this)\\b)\\s+)?(?<type_name>(?:(?:ref\\s+)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^()]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+(\\g<identifier>)"
    },
    "parenthesized-expression": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "parenthesized-parameter-list": {
      "begin": "(\\()",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#parameter"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "pattern": {
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "include": "#combinator-pattern"
        },
        {
          "include": "#discard-pattern"
        },
        {
          "include": "#constant-pattern"
        },
        {
          "include": "#relational-pattern"
        },
        {
          "include": "#var-pattern"
        },
        {
          "include": "#type-pattern"
        },
        {
          "include": "#positional-pattern"
        },
        {
          "include": "#property-pattern"
        },
        {
          "include": "#list-pattern"
        },
        {
          "include": "#slice-pattern"
        }
      ]
    },
    "positional-pattern": {
      "begin": "(?=\\()",
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#subpattern"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        },
        {
          "begin": "(?<=\\))",
          "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#property-pattern"
            },
            {
              "include": "#simple-designation-pattern"
            }
          ]
        }
      ]
    },
    "preprocessor": {
      "begin": "^\\s*(\\#)\\s*",
      "beginCaptures": {
        "1": {
          "name": "punctuation.separator.hash.cs"
        }
      },
      "end": "(?<=$)",
      "name": "meta.preprocessor.cs",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#preprocessor-define-or-undef"
        },
        {
          "include": "#preprocessor-if-or-elif"
        },
        {
          "include": "#preprocessor-else-or-endif"
        },
        {
          "include": "#preprocessor-warning-or-error"
        },
        {
          "include": "#preprocessor-region"
        },
        {
          "include": "#preprocessor-endregion"
        },
        {
          "include": "#preprocessor-load"
        },
        {
          "include": "#preprocessor-r"
        },
        {
          "include": "#preprocessor-line"
        },
        {
          "include": "#preprocessor-pragma-warning"
        },
        {
          "include": "#preprocessor-pragma-checksum"
        }
      ]
    },
    "preprocessor-define-or-undef": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.define.cs"
        },
        "2": {
          "name": "keyword.preprocessor.undef.cs"
        },
        "3": {
          "name": "entity.name.variable.preprocessor.symbol.cs"
        }
      },
      "match": "\\b(?:(define)|(undef))\\b\\s*\\b([_[:alpha:]][_[:alnum:]]*)\\b"
    },
    "preprocessor-else-or-endif": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.else.cs"
        },
        "2": {
          "name": "keyword.preprocessor.endif.cs"
        }
      },
      "match": "\\b(?:(else)|(endif))\\b"
    },
    "preprocessor-endregion": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.endregion.cs"
        }
      },
      "match": "\\b(endregion)\\b"
    },
    "preprocessor-expression": {
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#preprocessor-expression"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "constant.language.boolean.true.cs"
            },
            "2": {
              "name": "constant.language.boolean.false.cs"
            },
            "3": {
              "name": "entity.name.variable.preprocessor.symbol.cs"
            }
          },
          "match": "\\b(?:(true)|(false)|([_[:alpha:]][_[:alnum:]]*))\\b"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.comparison.cs"
            },
            "2": {
              "name": "keyword.operator.logical.cs"
            }
          },
          "match": "(==|!=)|(\\!|&&|\\|\\|)"
        }
      ]
    },
    "preprocessor-if-or-elif": {
      "begin": "\\b(?:(if)|(elif))\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.preprocessor.if.cs"
        },
        "2": {
          "name": "keyword.preprocessor.elif.cs"
        }
      },
      "end": "(?=$)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#preprocessor-expression"
        }
      ]
    },
    "preprocessor-line": {
      "begin": "\\b(line)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.preprocessor.line.cs"
        }
      },
      "end": "(?=$)",
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.preprocessor.default.cs"
            },
            "2": {
              "name": "keyword.preprocessor.hidden.cs"
            }
          },
          "match": "\\b(?:(default|hidden))"
        },
        {
          "captures": {
            "0": {
              "name": "constant.numeric.decimal.cs"
            }
          },
          "match": "[0-9]+"
        },
        {
          "captures": {
            "0": {
              "name": "string.quoted.double.cs"
            }
          },
          "match": "\\\"[^\"]*\\\""
        }
      ]
    },
    "preprocessor-load": {
      "begin": "\\b(load)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.preprocessor.load.cs"
        }
      },
      "end": "(?=$)",
      "patterns": [
        {
          "captures": {
            "0": {
              "name": "string.quoted.double.cs"
            }
          },
          "match": "\\\"[^\"]*\\\""
        }
      ]
    },
    "preprocessor-pragma-checksum": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.pragma.cs"
        },
        "2": {
          "name": "keyword.preprocessor.checksum.cs"
        },
        "3": {
          "name": "string.quoted.double.cs"
        },
        "4": {
          "name": "string.quoted.double.cs"
        },
        "5": {
          "name": "string.quoted.double.cs"
        }
      },
      "match": "\\b(pragma)\\b\\s*\\b(checksum)\\b\\s*(\\\"[^\"]*\\\")\\s*(\\\"[^\"]*\\\")\\s*(\\\"[^\"]*\\\")"
    },
    "preprocessor-pragma-warning": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.pragma.cs"
        },
        "2": {
          "name": "keyword.preprocessor.warning.cs"
        },
        "3": {
          "name": "keyword.preprocessor.disable.cs"
        },
        "4": {
          "name": "keyword.preprocessor.restore.cs"
        },
        "5": {
          "patterns": [
            {
              "captures": {
                "0": {
                  "name": "constant.numeric.decimal.cs"
                }
              },
              "match": "[0-9]+"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        }
      },
      "match": "\\b(pragma)\\b\\s*\\b(warning)\\b\\s*\\b(?:(disable)|(restore))\\b(\\s*[0-9]+(?:\\s*,\\s*[0-9]+)?)?"
    },
    "preprocessor-r": {
      "begin": "\\b(r)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.preprocessor.r.cs"
        }
      },
      "end": "(?=$)",
      "patterns": [
        {
          "captures": {
            "0": {
              "name": "string.quoted.double.cs"
            }
          },
          "match": "\\\"[^\"]*\\\""
        }
      ]
    },
    "preprocessor-region": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.region.cs"
        },
        "2": {
          "name": "string.unquoted.preprocessor.message.cs"
        }
      },
      "match": "\\b(region)\\b\\s*(.*)(?=$)"
    },
    "preprocessor-warning-or-error": {
      "captures": {
        "1": {
          "name": "keyword.preprocessor.warning.cs"
        },
        "2": {
          "name": "keyword.preprocessor.error.cs"
        },
        "3": {
          "name": "string.unquoted.preprocessor.message.cs"
        }
      },
      "match": "\\b(?:(warning)|(error))\\b\\s*(.*)(?=$)"
    },
    "property-accessors": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#attribute-section"
        },
        {
          "match": "\\b(private|protected|internal)\\b",
          "name": "storage.modifier.$1.cs"
        },
        {
          "begin": "\\b(get)\\b\\s*(?=\\{|;|=>|//|/\\*|$)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.accessor.$1.cs"
            }
          },
          "end": "(?<=\\}|;)|(?=\\})",
          "patterns": [
            {
              "include": "#accessor-getter"
            }
          ]
        },
        {
          "begin": "\\b(set|init)\\b\\s*(?=\\{|;|=>|//|/\\*|$)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.accessor.$1.cs"
            }
          },
          "end": "(?<=\\}|;)|(?=\\})",
          "patterns": [
            {
              "include": "#accessor-setter"
            }
          ]
        }
      ]
    },
    "property-declaration": {
      "begin": "(?![[:word:][:space:]]*\\b(?:class|interface|struct|enum|event)\\b)(?<return_type>(?<type_name>(?:(?:ref\\s+(?:readonly\\s+)?)?(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))\\s+)(?<interface_name>\\g<type_name>\\s*\\.\\s*)?(?<property_name>\\g<identifier>)\\s*(?=\\{|=>|//|/\\*|$)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "8": {
          "name": "entity.name.variable.property.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#property-accessors"
        },
        {
          "include": "#accessor-getter-expression"
        },
        {
          "include": "#variable-initializer"
        },
        {
          "include": "#class-or-struct-members"
        }
      ]
    },
    "property-pattern": {
      "begin": "(?={)",
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#subpattern"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        },
        {
          "begin": "(?<=\\})",
          "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#simple-designation-pattern"
            }
          ]
        }
      ]
    },
    "punctuation-accessor": {
      "match": "\\.",
      "name": "punctuation.accessor.cs"
    },
    "punctuation-comma": {
      "match": ",",
      "name": "punctuation.separator.comma.cs"
    },
    "punctuation-semicolon": {
      "match": ";",
      "name": "punctuation.terminator.statement.cs"
    },
    "query-body": {
      "patterns": [
        {
          "include": "#let-clause"
        },
        {
          "include": "#where-clause"
        },
        {
          "include": "#join-clause"
        },
        {
          "include": "#orderby-clause"
        },
        {
          "include": "#select-clause"
        },
        {
          "include": "#group-clause"
        }
      ]
    },
    "query-expression": {
      "begin": "\\b(from)\\b\\s*(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))?\\s+(\\g<identifier>)\\b\\s*\\b(in)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.from.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "name": "entity.name.variable.range-variable.cs"
        },
        "8": {
          "name": "keyword.operator.expression.query.in.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "raw-interpolated-string": {
      "patterns": [
        {
          "include": "#raw-interpolated-string-five-or-more-quote-one-or-more-interpolation"
        },
        {
          "include": "#raw-interpolated-string-three-or-more-quote-three-or-more-interpolation"
        },
        {
          "include": "#raw-interpolated-string-quadruple-quote-double-interpolation"
        },
        {
          "include": "#raw-interpolated-string-quadruple-quote-single-interpolation"
        },
        {
          "include": "#raw-interpolated-string-triple-quote-double-interpolation"
        },
        {
          "include": "#raw-interpolated-string-triple-quote-single-interpolation"
        }
      ]
    },
    "raw-interpolated-string-five-or-more-quote-one-or-more-interpolation": {
      "begin": "\\$+\"\"\"\"\"+",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"\"\"+",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs"
    },
    "raw-interpolated-string-quadruple-quote-double-interpolation": {
      "begin": "\\$\\$\"\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#double-raw-interpolation"
        }
      ]
    },
    "raw-interpolated-string-quadruple-quote-single-interpolation": {
      "begin": "\\$\"\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#raw-interpolation"
        }
      ]
    },
    "raw-interpolated-string-three-or-more-quote-three-or-more-interpolation": {
      "begin": "\\$\\$\\$+\"\"\"+",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"+",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs"
    },
    "raw-interpolated-string-triple-quote-double-interpolation": {
      "begin": "\\$\\$\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#double-raw-interpolation"
        }
      ]
    },
    "raw-interpolated-string-triple-quote-single-interpolation": {
      "begin": "\\$\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#raw-interpolation"
        }
      ]
    },
    "raw-interpolation": {
      "begin": "(?<=[^\\{]|^)((?:\\{)*)(\\{)(?=[^\\{])",
      "beginCaptures": {
        "1": {
          "name": "string.quoted.double.cs"
        },
        "2": {
          "name": "punctuation.definition.interpolation.begin.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.interpolation.end.cs"
        }
      },
      "name": "meta.interpolation.cs",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "raw-string-literal": {
      "patterns": [
        {
          "include": "#raw-string-literal-more"
        },
        {
          "include": "#raw-string-literal-quadruple"
        },
        {
          "include": "#raw-string-literal-triple"
        }
      ]
    },
    "raw-string-literal-more": {
      "begin": "\"\"\"\"\"+",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"\"\"+",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs"
    },
    "raw-string-literal-quadruple": {
      "begin": "\"\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs"
    },
    "raw-string-literal-triple": {
      "begin": "\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs"
    },
    "readonly-modifier": {
      "match": "\\breadonly\\b",
      "name": "storage.modifier.readonly.cs"
    },
    "record-declaration": {
      "begin": "(?=\\brecord\\b)",
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "begin": "(record)\\b\\s+(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.record.cs"
            },
            "2": {
              "name": "entity.name.type.class.cs"
            }
          },
          "end": "(?=\\{)|(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type-parameter-list"
            },
            {
              "include": "#parenthesized-parameter-list"
            },
            {
              "include": "#base-types"
            },
            {
              "include": "#generic-constraints"
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "ref-modifier": {
      "match": "\\bref\\b",
      "name": "storage.modifier.ref.cs"
    },
    "relational-pattern": {
      "begin": "<=?|>=?",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.relational.cs"
        }
      },
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "return-statement": {
      "begin": "(?<!\\.)\\b(return)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.return.cs"
        }
      },
      "end": "(?=[;}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "script-top-level": {
      "patterns": [
        {
          "include": "#statement"
        },
        {
          "include": "#method-declaration"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "select-clause": {
      "begin": "\\b(select)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.select.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "simple-designation-pattern": {
      "patterns": [
        {
          "include": "#discard-pattern"
        },
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.variable.local.cs"
        }
      ]
    },
    "slice-pattern": {
      "match": "\\.\\.",
      "name": "keyword.operator.range.cs"
    },
    "statement": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#while-statement"
        },
        {
          "include": "#do-statement"
        },
        {
          "include": "#for-statement"
        },
        {
          "include": "#foreach-statement"
        },
        {
          "include": "#if-statement"
        },
        {
          "include": "#else-part"
        },
        {
          "include": "#goto-statement"
        },
        {
          "include": "#return-statement"
        },
        {
          "include": "#break-or-continue-statement"
        },
        {
          "include": "#throw-statement"
        },
        {
          "include": "#yield-statement"
        },
        {
          "include": "#await-statement"
        },
        {
          "include": "#try-statement"
        },
        {
          "include": "#expression-operator-expression"
        },
        {
          "include": "#context-control-statement"
        },
        {
          "include": "#context-control-paren-statement"
        },
        {
          "include": "#labeled-statement"
        },
        {
          "include": "#object-creation-expression"
        },
        {
          "include": "#array-creation-expression"
        },
        {
          "include": "#anonymous-object-creation-expression"
        },
        {
          "include": "#local-declaration"
        },
        {
          "include": "#block"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "storage-modifier": {
      "match": "(?<!\\.)\\b(new|public|protected|internal|private|abstract|virtual|override|sealed|static|partial|readonly|volatile|const|extern|async|unsafe|ref|required|file)\\b",
      "name": "storage.modifier.$1.cs"
    },
    "string-character-escape": {
      "match": "\\\\(x[0-9a-fA-F]{1,4}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|.)",
      "name": "constant.character.escape.cs"
    },
    "string-literal": {
      "begin": "(?<!@)\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "(\")|((?:[^\\\\\\n])$)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.cs"
        },
        "2": {
          "name": "invalid.illegal.newline.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#string-character-escape"
        }
      ]
    },
    "struct-declaration": {
      "begin": "(?=(\\brecord\\b\\s+)?\\bstruct\\b)",
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "begin": "(\\b(record)\\b\\s+)?(struct)\\b\\s+(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "2": {
              "name": "storage.type.record.cs"
            },
            "3": {
              "name": "storage.type.struct.cs"
            },
            "4": {
              "name": "entity.name.type.struct.cs"
            }
          },
          "end": "(?=\\{)|(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type-parameter-list"
            },
            {
              "include": "#parenthesized-parameter-list"
            },
            {
              "include": "#base-types"
            },
            {
              "include": "#generic-constraints"
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "subpattern": {
      "patterns": [
        {
          "captures": {
            "1": {
              "patterns": [
                {
                  "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
                  "name": "variable.other.object.property.cs"
                },
                {
                  "include": "#punctuation-accessor"
                }
              ]
            },
            "2": {
              "name": "punctuation.separator.colon.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*(?:\\s*\\.\\s*@?[_[:alpha:]][_[:alnum:]]*)*)\\s*(:)"
        },
        {
          "include": "#pattern"
        }
      ]
    },
    "switch-expression": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#punctuation-comma"
        },
        {
          "begin": "=>",
          "beginCaptures": {
            "0": {
              "name": "keyword.operator.arrow.cs"
            }
          },
          "end": "(?=,|})",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "begin": "\\b(when)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.conditional.when.cs"
            }
          },
          "end": "(?==>|,|})",
          "patterns": [
            {
              "include": "#case-guard"
            }
          ]
        },
        {
          "begin": "(?!\\s)",
          "end": "(?=\\bwhen\\b|=>|,|})",
          "patterns": [
            {
              "include": "#pattern"
            }
          ]
        }
      ]
    },
    "switch-label": {
      "begin": "\\b(case|default)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.conditional.$1.cs"
        }
      },
      "end": "(:)|(?=})",
      "endCaptures": {
        "1": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "patterns": [
        {
          "begin": "\\b(when)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.conditional.when.cs"
            }
          },
          "end": "(?=:|})",
          "patterns": [
            {
              "include": "#case-guard"
            }
          ]
        },
        {
          "begin": "(?!\\s)",
          "end": "(?=\\bwhen\\b|:|})",
          "patterns": [
            {
              "include": "#pattern"
            }
          ]
        }
      ]
    },
    "switch-statement": {
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#switch-label"
            },
            {
              "include": "#statement"
            }
          ]
        }
      ]
    },
    "switch-statement-or-expression": {
      "begin": "(?<!\\.)\\b(switch)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.conditional.switch.cs"
        }
      },
      "end": "(?<=})|(?=})",
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "(?=\\()",
          "end": "(?<=\\})|(?=\\})",
          "patterns": [
            {
              "include": "#switch-statement"
            }
          ]
        },
        {
          "begin": "(?=\\{)",
          "end": "(?<=\\})|(?=\\})",
          "patterns": [
            {
              "include": "#switch-expression"
            }
          ]
        }
      ]
    },
    "throw-expression": {
      "captures": {
        "1": {
          "name": "keyword.control.flow.throw.cs"
        }
      },
      "match": "\\b(throw)\\b"
    },
    "throw-statement": {
      "begin": "(?<!\\.)\\b(throw)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.throw.cs"
        }
      },
      "end": "(?=[;}])",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "try-block": {
      "begin": "(?<!\\.)\\b(try)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.exception.try.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#block"
        }
      ]
    },
    "try-statement": {
      "patterns": [
        {
          "include": "#try-block"
        },
        {
          "include": "#catch-clause"
        },
        {
          "include": "#finally-clause"
        }
      ]
    },
    "tuple-declaration-deconstruction-element-list": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#tuple-declaration-deconstruction-element-list"
        },
        {
          "include": "#declaration-expression-tuple"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.variable.tuple-element.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*(?=[,)])"
        }
      ]
    },
    "tuple-deconstruction-assignment": {
      "captures": {
        "1": {
          "patterns": [
            {
              "include": "#tuple-deconstruction-element-list"
            }
          ]
        }
      },
      "match": "(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\\s*(?!=>|==)(?==)"
    },
    "tuple-deconstruction-element-list": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#tuple-deconstruction-element-list"
        },
        {
          "include": "#declaration-expression-tuple"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "captures": {
            "1": {
              "name": "variable.other.readwrite.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b\\s*(?=[,)])"
        }
      ]
    },
    "tuple-element": {
      "captures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "entity.name.variable.tuple-element.cs"
        }
      },
      "match": "(?<type_name>(?:(?:(?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)?(?<name_and_type_args>\\g<identifier>\\s*(?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?)(?:\\s*\\.\\s*\\g<name_and_type_args>)*|(?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\)))(?:\\s*\\?\\s*)?(?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*(?:\\?)?\\s*)*))(?:(?<tuple_name>\\g<identifier>)\\b)?"
    },
    "tuple-literal": {
      "begin": "(\\()(?=.*[:,])",
      "beginCaptures": {
        "1": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#tuple-literal-element"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "tuple-literal-element": {
      "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(?=:)",
      "beginCaptures": {
        "1": {
          "name": "entity.name.variable.tuple-element.cs"
        }
      },
      "end": "(:)",
      "endCaptures": {
        "0": {
          "name": "punctuation.separator.colon.cs"
        }
      }
    },
    "tuple-type": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#tuple-element"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#readonly-modifier"
        },
        {
          "include": "#tuple-type"
        },
        {
          "include": "#type-builtin"
        },
        {
          "include": "#type-name"
        },
        {
          "include": "#type-arguments"
        },
        {
          "include": "#type-array-suffix"
        },
        {
          "include": "#type-nullable-suffix"
        },
        {
          "include": "#type-pointer-suffix"
        }
      ]
    },
    "type-arguments": {
      "begin": "<",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.begin.cs"
        }
      },
      "end": ">",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.end.cs"
        }
      },
      "patterns": [
        {
          "include": "#type"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-array-suffix": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.squarebracket.open.cs"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "punctuation.squarebracket.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-builtin": {
      "captures": {
        "1": {
          "name": "keyword.type.$1.cs"
        }
      },
      "match": "\\b(bool|s?byte|u?short|n?u?int|u?long|float|double|decimal|char|string|object|void|dynamic)\\b"
    },
    "type-declarations": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#storage-modifier"
        },
        {
          "include": "#class-declaration"
        },
        {
          "include": "#delegate-declaration"
        },
        {
          "include": "#enum-declaration"
        },
        {
          "include": "#interface-declaration"
        },
        {
          "include": "#struct-declaration"
        },
        {
          "include": "#record-declaration"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "type-name": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "entity.name.type.alias.cs"
            },
            "2": {
              "name": "punctuation.separator.coloncolon.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\:\\:)"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.type.cs"
            },
            "2": {
              "name": "punctuation.accessor.cs"
            }
          },
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\.)"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.accessor.cs"
            },
            "2": {
              "name": "entity.name.type.cs"
            }
          },
          "match": "(\\.)\\s*(@?[_[:alpha:]][_[:alnum:]]*)"
        },
        {
          "match": "@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.type.cs"
        }
      ]
    },
    "type-nullable-suffix": {
      "match": "\\?",
      "name": "punctuation.separator.question-mark.cs"
    },
    "type-operator-expression": {
      "begin": "\\b(default|sizeof|typeof)\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.$1.cs"
        },
        "2": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#type"
        }
      ]
    },
    "type-parameter-list": {
      "begin": "\\<",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.begin.cs"
        }
      },
      "end": "\\>",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.end.cs"
        }
      },
      "patterns": [
        {
          "match": "\\b(in|out)\\b",
          "name": "storage.modifier.$1.cs"
        },
        {
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b",
          "name": "entity.name.type.type-parameter.cs"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#attribute-section"
        }
      ]
    },
    "type-pattern": {
      "begin": "(?=@?[_[:alpha:]][_[:alnum:]]*)",
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "begin": "\\G",
          "end": "(?!\\G[@_[:alpha:]])(?=[\\({@_[:alpha:])}\\],;:=&|^]|(?:\\s|^)\\?|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#type-subpattern"
            }
          ]
        },
        {
          "begin": "(?=[\\({@_[:alpha:]])",
          "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#positional-pattern"
            },
            {
              "include": "#property-pattern"
            },
            {
              "include": "#simple-designation-pattern"
            }
          ]
        }
      ]
    },
    "type-pointer-suffix": {
      "match": "\\*",
      "name": "punctuation.separator.asterisk.cs"
    },
    "type-subpattern": {
      "patterns": [
        {
          "include": "#type-builtin"
        },
        {
          "begin": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(::)",
          "beginCaptures": {
            "1": {
              "name": "entity.name.type.alias.cs"
            },
            "2": {
              "name": "punctuation.separator.coloncolon.cs"
            }
          },
          "end": "(?<=[_[:alnum:]])|(?=[.<\\[\\({)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
              "name": "entity.name.type.cs"
            }
          ]
        },
        {
          "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
          "name": "entity.name.type.cs"
        },
        {
          "begin": "\\.",
          "beginCaptures": {
            "0": {
              "name": "punctuation.accessor.cs"
            }
          },
          "end": "(?<=[_[:alnum:]])|(?=[<\\[\\({)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
              "name": "entity.name.type.cs"
            }
          ]
        },
        {
          "include": "#type-arguments"
        },
        {
          "include": "#type-array-suffix"
        },
        {
          "match": "(?<!\\s)\\?",
          "name": "punctuation.separator.question-mark.cs"
        }
      ]
    },
    "using-directive": {
      "patterns": [
        {
          "begin": "\\b(?:(global)\\s+)?(using)\\s+(static)\\b\\s*(?:(unsafe)\\b\\s*)?",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.global.cs"
            },
            "2": {
              "name": "keyword.other.directive.using.cs"
            },
            "3": {
              "name": "keyword.other.directive.static.cs"
            },
            "4": {
              "name": "storage.modifier.unsafe.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "\\b(?:(global)\\s+)?(using)\\b\\s*(?:(unsafe)\\b\\s*)?(@?[_[:alpha:]][_[:alnum:]]*)\\s*(=)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.global.cs"
            },
            "2": {
              "name": "keyword.other.directive.using.cs"
            },
            "3": {
              "name": "storage.modifier.unsafe.cs"
            },
            "4": {
              "name": "entity.name.type.alias.cs"
            },
            "5": {
              "name": "keyword.operator.assignment.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "\\b(?:(global)\\s+)?(using)\\b\\s*+(?!\\(|var\\b)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.global.cs"
            },
            "2": {
              "name": "keyword.other.directive.using.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "match": "\\@?[_[:alpha:]][_[:alnum:]]*",
              "name": "entity.name.type.namespace.cs"
            },
            {
              "include": "#punctuation-accessor"
            },
            {
              "include": "#operator-assignment"
            }
          ]
        }
      ]
    },
    "using-statement": {
      "begin": "\\b(using)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.context.using.cs"
        }
      },
      "end": "(?<=\\))|(?=;|})",
      "patterns": [
        {
          "include": "#intrusive"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#intrusive"
            },
            {
              "include": "#await-expression"
            },
            {
              "include": "#local-variable-declaration"
            },
            {
              "include": "#expression"
            }
          ]
        },
        {
          "include": "#local-variable-declaration"
        }
      ]
    },
    "var-pattern": {
      "begin": "\\b(var)\\b",
      "beginCaptures": {
        "1": {
          "name": "storage.type.var.cs"
        }
      },
      "end": "(?=[)}\\],;:?=&|^]|!=|\\b(and|or|when)\\b)",
      "patterns": [
        {
          "include": "#designation-pattern"
        }
      ]
    },
    "variable-initializer": {
      "begin": "(?<!=|!)(=)(?!=|>)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.assignment.cs"
        }
      },
      "end": "(?=[,\\)\\];}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "verbatim-interpolated-string": {
      "begin": "(?:\\$@|@\\$)\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"(?=[^\"])",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#verbatim-string-character-escape"
        },
        {
          "include": "#interpolation"
        }
      ]
    },
    "verbatim-string-character-escape": {
      "match": "\"\"",
      "name": "constant.character.escape.cs"
    },
    "verbatim-string-literal": {
      "begin": "@\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\"(?=[^\"])",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.quoted.double.cs",
      "patterns": [
        {
          "include": "#verbatim-string-character-escape"
        }
      ]
    },
    "when-clause": {
      "begin": "(?<!\\.)\\b(when)\\b\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.exception.when.cs"
        },
        "2": {
          "name": "punctuation.parenthesis.open.cs"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "where-clause": {
      "begin": "\\b(where)\\b\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.query.where.cs"
        }
      },
      "end": "(?=;|\\))",
      "patterns": [
        {
          "include": "#query-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "while-statement": {
      "begin": "(?<!\\.)\\b(while)\\b\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.loop.while.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.parenthesis.open.cs"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.parenthesis.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "include": "#statement"
        }
      ]
    },
    "with-expression": {
      "begin": "(?<!\\.)\\b(with)\\b\\s*(?=\\{|//|/\\*|$)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.expression.with.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#initializer-expression"
        }
      ]
    },
    "xml-attribute": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "entity.other.attribute-name.cs"
            },
            "2": {
              "name": "entity.other.attribute-name.namespace.cs"
            },
            "3": {
              "name": "punctuation.separator.colon.cs"
            },
            "4": {
              "name": "entity.other.attribute-name.localname.cs"
            },
            "5": {
              "name": "punctuation.separator.equals.cs"
            }
          },
          "match": "(?:^|\\s+)((?:([-_[:alnum:]]+)(:))?([-_[:alnum:]]+))(=)"
        },
        {
          "include": "#xml-string"
        }
      ]
    },
    "xml-cdata": {
      "begin": "<!\\[CDATA\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.cs"
        }
      },
      "end": "\\]\\]>",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.cs"
        }
      },
      "name": "string.unquoted.cdata.cs"
    },
    "xml-character-entity": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.constant.cs"
            },
            "3": {
              "name": "punctuation.definition.constant.cs"
            }
          },
          "match": "(&)((?:[[:alpha:]:_][[:alnum:]:_.-]*)|(?:\\#[[:digit:]]+)|(?:\\#x[[:xdigit:]]+))(;)",
          "name": "constant.character.entity.cs"
        },
        {
          "match": "&",
          "name": "invalid.illegal.bad-ampersand.cs"
        }
      ]
    },
    "xml-comment": {
      "begin": "<!--",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.comment.cs"
        }
      },
      "end": "-->",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.comment.cs"
        }
      },
      "name": "comment.block.cs"
    },
    "xml-doc-comment": {
      "patterns": [
        {
          "include": "#xml-comment"
        },
        {
          "include": "#xml-character-entity"
        },
        {
          "include": "#xml-cdata"
        },
        {
          "include": "#xml-tag"
        }
      ]
    },
    "xml-string": {
      "patterns": [
        {
          "begin": "\\'",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.cs"
            }
          },
          "end": "\\'",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.cs"
            }
          },
          "name": "string.quoted.single.cs",
          "patterns": [
            {
              "include": "#xml-character-entity"
            }
          ]
        },
        {
          "begin": "\\\"",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.cs"
            }
          },
          "end": "\\\"",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.cs"
            }
          },
          "name": "string.quoted.double.cs",
          "patterns": [
            {
              "include": "#xml-character-entity"
            }
          ]
        }
      ]
    },
    "xml-tag": {
      "begin": "(</?)((?:([-_[:alnum:]]+)(:))?([-_[:alnum:]]+))",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.tag.cs"
        },
        "2": {
          "name": "entity.name.tag.cs"
        },
        "3": {
          "name": "entity.name.tag.namespace.cs"
        },
        "4": {
          "name": "punctuation.separator.colon.cs"
        },
        "5": {
          "name": "entity.name.tag.localname.cs"
        }
      },
      "end": "(/?>)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.tag.cs"
        }
      },
      "name": "meta.tag.cs",
      "patterns": [
        {
          "include": "#xml-attribute"
        }
      ]
    },
    "yield-break-statement": {
      "captures": {
        "1": {
          "name": "keyword.control.flow.yield.cs"
        },
        "2": {
          "name": "keyword.control.flow.break.cs"
        }
      },
      "match": "(?<!\\.)\\b(yield)\\b\\s*\\b(break)\\b"
    },
    "yield-return-statement": {
      "begin": "(?<!\\.)\\b(yield)\\b\\s*\\b(return)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.yield.cs"
        },
        "2": {
          "name": "keyword.control.flow.return.cs"
        }
      },
      "end": "(?=[;}])",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "yield-statement": {
      "patterns": [
        {
          "include": "#yield-return-statement"
        },
        {
          "include": "#yield-break-statement"
        }
      ]
    }
  },
  "scopeName": "source.cs"
}
