shiki
Version: 
1,891 lines • 138 kB
JSON
{
  "name": "csharp",
  "scopeName": "source.cs",
  "fileTypes": ["cs"],
  "uuid": "f7de61e2-bdde-4e2a-a139-8221b179584e",
  "patterns": [
    {
      "include": "#preprocessor"
    },
    {
      "include": "#comment"
    },
    {
      "include": "#directives"
    },
    {
      "include": "#declarations"
    },
    {
      "include": "#script-top-level"
    }
  ],
  "repository": {
    "directives": {
      "patterns": [
        {
          "include": "#extern-alias-directive"
        },
        {
          "include": "#using-directive"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "declarations": {
      "patterns": [
        {
          "include": "#namespace-declaration"
        },
        {
          "include": "#type-declarations"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "script-top-level": {
      "patterns": [
        {
          "include": "#method-declaration"
        },
        {
          "include": "#statement"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "type-declarations": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#storage-modifier"
        },
        {
          "include": "#class-declaration"
        },
        {
          "include": "#delegate-declaration"
        },
        {
          "include": "#enum-declaration"
        },
        {
          "include": "#interface-declaration"
        },
        {
          "include": "#record-declaration"
        },
        {
          "include": "#struct-declaration"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "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"
        }
      ]
    },
    "interface-members": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#property-declaration"
        },
        {
          "include": "#event-declaration"
        },
        {
          "include": "#indexer-declaration"
        },
        {
          "include": "#method-declaration"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "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": "#switch-statement"
        },
        {
          "include": "#goto-statement"
        },
        {
          "include": "#return-statement"
        },
        {
          "include": "#break-or-continue-statement"
        },
        {
          "include": "#throw-statement"
        },
        {
          "include": "#yield-statement"
        },
        {
          "include": "#await-statement"
        },
        {
          "include": "#try-statement"
        },
        {
          "include": "#checked-unchecked-statement"
        },
        {
          "include": "#lock-statement"
        },
        {
          "include": "#using-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"
        }
      ]
    },
    "expression": {
      "patterns": [
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#checked-unchecked-expression"
        },
        {
          "include": "#typeof-or-default-expression"
        },
        {
          "include": "#nameof-expression"
        },
        {
          "include": "#throw-expression"
        },
        {
          "include": "#raw-interpolated-string"
        },
        {
          "include": "#interpolated-string"
        },
        {
          "include": "#verbatim-interpolated-string"
        },
        {
          "include": "#this-or-base-expression"
        },
        {
          "include": "#switch-expression"
        },
        {
          "include": "#conditional-operator"
        },
        {
          "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"
        }
      ]
    },
    "extern-alias-directive": {
      "begin": "\\s*(extern)\\b\\s*(alias)\\b\\s*(@?[_[:alpha:]][_[:alnum:]]*)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.extern.cs"
        },
        "2": {
          "name": "keyword.other.alias.cs"
        },
        "3": {
          "name": "variable.other.alias.cs"
        }
      },
      "end": "(?=;)"
    },
    "using-directive": {
      "patterns": [
        {
          "begin": "\\b(using)\\b\\s+(static)\\s+",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.using.cs"
            },
            "2": {
              "name": "keyword.other.static.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "\\b(using)\\s+(?=(@?[_[:alpha:]][_[:alnum:]]*)\\s*=)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.using.cs"
            },
            "2": {
              "name": "entity.name.type.alias.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#type"
            },
            {
              "include": "#operator-assignment"
            }
          ]
        },
        {
          "begin": "\\b(using)\\s*",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.using.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "name": "entity.name.type.namespace.cs",
              "match": "@?[_[:alpha:]][_[:alnum:]]*"
            },
            {
              "include": "#operator-assignment"
            }
          ]
        }
      ]
    },
    "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"
        }
      ]
    },
    "attribute": {
      "patterns": [
        {
          "include": "#type-name"
        },
        {
          "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"
        }
      ]
    },
    "namespace-declaration": {
      "begin": "\\b(namespace)\\s+",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.namespace.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "name": "entity.name.type.namespace.cs",
          "match": "@?[_[:alpha:]][_[:alnum:]]*"
        },
        {
          "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"
            }
          ]
        }
      ]
    },
    "storage-modifier": {
      "name": "storage.modifier.cs",
      "match": "(?<!\\.)\\b(new|public|protected|internal|private|abstract|virtual|override|sealed|static|partial|readonly|volatile|const|extern|async|unsafe|ref|required)\\b"
    },
    "class-declaration": {
      "begin": "(?=\\bclass\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?x)\n\\b(class)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)\\s*",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.class.cs"
            },
            "2": {
              "name": "entity.name.type.class.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": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "delegate-declaration": {
      "begin": "(?x)\n(?:\\b(delegate)\\b)\\s+\n(?<type_name>\n  (?:\n    (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)\\s+\n(\\g<identifier>)\\s*\n(<([^<>]+)>)?\\s*\n(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.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"
        }
      ]
    },
    "enum-declaration": {
      "begin": "(?=\\benum\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?=enum)",
          "end": "(?=\\{)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "match": "(enum)\\s+(@?[_[:alpha:]][_[:alnum:]]*)",
              "captures": {
                "1": {
                  "name": "keyword.other.enum.cs"
                },
                "2": {
                  "name": "entity.name.type.enum.cs"
                }
              }
            },
            {
              "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"
        }
      ]
    },
    "interface-declaration": {
      "begin": "(?=\\binterface\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?x)\n(interface)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.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"
        }
      ]
    },
    "record-declaration": {
      "begin": "(?=\\brecord\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?x)\n(record)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.record.cs"
            },
            "2": {
              "name": "entity.name.type.record.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": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "struct-declaration": {
      "begin": "(?=\\bstruct\\b)",
      "end": "(?<=\\})",
      "patterns": [
        {
          "begin": "(?x)\n(struct)\\b\\s+\n(@?[_[:alpha:]][_[:alnum:]]*)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.struct.cs"
            },
            "2": {
              "name": "entity.name.type.struct.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": "#class-or-struct-members"
            }
          ]
        },
        {
          "include": "#preprocessor"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "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",
          "captures": {
            "1": {
              "name": "storage.modifier.cs"
            }
          }
        },
        {
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b",
          "captures": {
            "1": {
              "name": "entity.name.type.type-parameter.cs"
            }
          }
        },
        {
          "include": "#comment"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#attribute-section"
        }
      ]
    },
    "base-types": {
      "begin": ":",
      "beginCaptures": {
        "0": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(?=\\{|where)",
      "patterns": [
        {
          "include": "#type"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#preprocessor"
        }
      ]
    },
    "generic-constraints": {
      "begin": "(where)\\s+(@?[_[:alpha:]][_[:alnum:]]*)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.where.cs"
        },
        "2": {
          "name": "entity.name.type.type-parameter.cs"
        },
        "3": {
          "name": "punctuation.separator.colon.cs"
        }
      },
      "end": "(?=\\{|where|;|=>)",
      "patterns": [
        {
          "name": "keyword.other.class.cs",
          "match": "\\bclass\\b"
        },
        {
          "name": "keyword.other.struct.cs",
          "match": "\\bstruct\\b"
        },
        {
          "match": "(new)\\s*(\\()\\s*(\\))",
          "captures": {
            "1": {
              "name": "keyword.other.new.cs"
            },
            "2": {
              "name": "punctuation.parenthesis.open.cs"
            },
            "3": {
              "name": "punctuation.parenthesis.close.cs"
            }
          }
        },
        {
          "include": "#type"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#generic-constraints"
        }
      ]
    },
    "field-declaration": {
      "begin": "(?x)\n(?<type_name>\n  (?:\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)\\s+\n(\\g<identifier>)\\s* # first field name\n(?!=>|==)(?=,|;|=|$)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "entity.name.variable.field.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "name": "entity.name.variable.field.cs",
          "match": "@?[_[:alpha:]][_[:alnum:]]*"
        },
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#variable-initializer"
        },
        {
          "include": "#class-or-struct-members"
        }
      ]
    },
    "property-declaration": {
      "begin": "(?x)\n\n# The negative lookahead below ensures that we don't match nested types\n# or other declarations as properties.\n(?![[:word:][:space:]]*\\b(?:class|interface|struct|enum|event)\\b)\n\n(?<return_type>\n  (?<type_name>\n    (?:\n      (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n      (?:\n        (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n        (?<name_and_type_args> # identifier + type arguments (if any)\n          \\g<identifier>\\s*\n          (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n        )\n        (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n        (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n      )\n      (?:\\s*\\?\\s*)? # nullable suffix?\n      (?:\\s* # array suffix?\n        \\[\n          (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n        \\]\n        \\s*\n        (?:\\?)? # arrays can be nullable reference types\n        \\s*\n      )*\n    )\n  )\\s+\n)\n(?<interface_name>\\g<type_name>\\s*\\.\\s*)?\n(?<property_name>\\g<identifier>)\\s*\n(?=\\{|=>|$)",
      "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": "#expression-body"
        },
        {
          "include": "#variable-initializer"
        },
        {
          "include": "#class-or-struct-members"
        }
      ]
    },
    "indexer-declaration": {
      "begin": "(?x)\n(?<return_type>\n  (?<type_name>\n    (?:\n      (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n      (?:\n        (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n        (?<name_and_type_args> # identifier + type arguments (if any)\n          \\g<identifier>\\s*\n          (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n        )\n        (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n        (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n      )\n      (?:\\s*\\?\\s*)? # nullable suffix?\n      (?:\\s* # array suffix?\n        \\[\n          (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n        \\]\n        \\s*\n        (?:\\?)? # arrays can be nullable reference types\n        \\s*\n      )*\n    )\n  )\\s+\n)\n(?<interface_name>\\g<type_name>\\s*\\.\\s*)?\n(?<indexer_name>this)\\s*\n(?=\\[)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "7": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "8": {
          "name": "keyword.other.this.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#bracketed-parameter-list"
        },
        {
          "include": "#property-accessors"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#variable-initializer"
        }
      ]
    },
    "event-declaration": {
      "begin": "(?x)\n\\b(event)\\b\\s*\n(?<return_type>\n  (?<type_name>\n    (?:\n      (?:\n        (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n        (?<name_and_type_args> # identifier + type arguments (if any)\n          \\g<identifier>\\s*\n          (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n        )\n        (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n        (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n      )\n      (?:\\s*\\?\\s*)? # nullable suffix?\n      (?:\\s* # array suffix?\n        \\[\n          (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n        \\]\n        \\s*\n        (?:\\?)? # arrays can be nullable reference types\n        \\s*\n      )*\n    )\n  )\\s+\n)\n(?<interface_name>\\g<type_name>\\s*\\.\\s*)?\n(?<event_names>\\g<identifier>(?:\\s*,\\s*\\g<identifier>)*)\\s*\n(?=\\{|;|$)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.event.cs"
        },
        "2": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "8": {
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#punctuation-accessor"
            }
          ]
        },
        "9": {
          "patterns": [
            {
              "name": "entity.name.variable.event.cs",
              "match": "@?[_[:alpha:]][_[:alnum:]]*"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#event-accessors"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "property-accessors": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "name": "storage.modifier.cs",
          "match": "\\b(private|protected|internal)\\b"
        },
        {
          "name": "keyword.other.get.cs",
          "match": "\\b(get)\\b"
        },
        {
          "name": "keyword.other.set.cs",
          "match": "\\b(set)\\b"
        },
        {
          "name": "keyword.other.init.cs",
          "match": "\\b(init)\\b"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "event-accessors": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "name": "keyword.other.add.cs",
          "match": "\\b(add)\\b"
        },
        {
          "name": "keyword.other.remove.cs",
          "match": "\\b(remove)\\b"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#attribute-section"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "method-declaration": {
      "begin": "(?x)\n(?<return_type>\n  (?<type_name>\n    (?:\n      (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n      (?:\n        (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n        (?<name_and_type_args> # identifier + type arguments (if any)\n          \\g<identifier>\\s*\n          (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n        )\n        (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n        (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n      )\n      (?:\\s*\\?\\s*)? # nullable suffix?\n      (?:\\s* # array suffix?\n        \\[\n          (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n        \\]\n        \\s*\n        (?:\\?)? # arrays can be nullable reference types\n        \\s*\n      )*\n    )\n  )\\s+\n)\n(?<interface_name>\\g<type_name>\\s*\\.\\s*)?\n(\\g<identifier>)\\s*\n(<([^<>]+)>)?\\s*\n(?=\\()",
      "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"
        }
      ]
    },
    "constructor-declaration": {
      "begin": "(?=@?[_[:alpha:]][_[:alnum:]]*\\s*\\()",
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\b",
          "captures": {
            "1": {
              "name": "entity.name.function.cs"
            }
          }
        },
        {
          "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": "keyword.other.base.cs"
        },
        "2": {
          "name": "keyword.other.this.cs"
        }
      },
      "end": "(?<=\\))",
      "patterns": [
        {
          "include": "#argument-list"
        }
      ]
    },
    "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"
        }
      ]
    },
    "operator-declaration": {
      "begin": "(?x)\n(?<type_name>\n  (?:\n    (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)\\s*\n(?<operator_keyword>(?:\\b(?:operator)))\\s*\n(?<operator>(?:\\+|-|\\*|/|%|&|\\||\\^|\\<\\<|\\>\\>|==|!=|\\>|\\<|\\>=|\\<=|!|~|\\+\\+|--|true|false))\\s*\n(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "keyword.other.operator-decl.cs"
        },
        "7": {
          "name": "entity.name.function.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "conversion-operator-declaration": {
      "begin": "(?x)\n(?<explicit_or_implicit_keyword>(?:\\b(?:explicit|implicit)))\\s*\n(?<operator_keyword>(?:\\b(?:operator)))\\s*\n(?<type_name>\n  (?:\n    (?:ref\\s+(?:readonly\\s+)?)?   # ref return\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)\\s*\n(?=\\()",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "match": "\\b(explicit)\\b",
              "captures": {
                "1": {
                  "name": "keyword.other.explicit.cs"
                }
              }
            },
            {
              "match": "\\b(implicit)\\b",
              "captures": {
                "1": {
                  "name": "keyword.other.implicit.cs"
                }
              }
            }
          ]
        },
        "2": {
          "name": "keyword.other.operator-decl.cs"
        },
        "3": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#parenthesized-parameter-list"
        },
        {
          "include": "#expression-body"
        },
        {
          "include": "#block"
        }
      ]
    },
    "block": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "variable-initializer": {
      "begin": "(?<!=|!)(=)(?!=|>)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.assignment.cs"
        }
      },
      "end": "(?=[,\\)\\];}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "expression-body": {
      "begin": "=>",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.arrow.cs"
        }
      },
      "end": "(?=[,\\);}])",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "goto-statement": {
      "begin": "(?<!\\.)\\b(goto)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.goto.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "begin": "\\b(case)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.case.cs"
            }
          },
          "end": "(?=;)",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "match": "\\b(default)\\b",
          "captures": {
            "1": {
              "name": "keyword.control.default.cs"
            }
          }
        },
        {
          "name": "entity.name.label.cs",
          "match": "@?[_[:alpha:]][_[:alnum:]]*"
        }
      ]
    },
    "return-statement": {
      "begin": "(?<!\\.)\\b(return)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.return.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "include": "#ref-modifier"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "break-or-continue-statement": {
      "match": "(?<!\\.)\\b(?:(break)|(continue))\\b",
      "captures": {
        "1": {
          "name": "keyword.control.flow.break.cs"
        },
        "2": {
          "name": "keyword.control.flow.continue.cs"
        }
      }
    },
    "throw-statement": {
      "begin": "(?<!\\.)\\b(throw)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.flow.throw.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "yield-statement": {
      "patterns": [
        {
          "include": "#yield-return-statement"
        },
        {
          "include": "#yield-break-statement"
        }
      ]
    },
    "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-break-statement": {
      "match": "(?<!\\.)\\b(yield)\\b\\s*\\b(break)\\b",
      "captures": {
        "1": {
          "name": "keyword.control.flow.yield.cs"
        },
        "2": {
          "name": "keyword.control.flow.break.cs"
        }
      }
    },
    "await-statement": {
      "begin": "(?<!\\.)\\b(await)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.await.cs"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "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"
        }
      ]
    },
    "else-part": {
      "begin": "(?<!\\.)\\b(else)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.conditional.else.cs"
        }
      },
      "end": "(?<=\\})|(?=;)",
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "switch-statement": {
      "begin": "(?<!\\.)\\b(switch)\\b\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.switch.cs"
        }
      },
      "end": "(?<=\\})",
      "patterns": [
        {
          "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-expression": {
      "begin": "(?x) (?<!\\.)\\b(switch)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.switch.cs"
        }
      },
      "end": "(?<=\\})",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.cs"
        }
      },
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.curlybrace.open.cs"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "punctuation.curlybrace.close.cs"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#literal"
            },
            {
              "include": "#switch-var-pattern"
            },
            {
              "include": "#switch-property-expression"
            },
            {
              "include": "#member-access-expression"
            },
            {
              "include": "#switch-pattern"
            },
            {
              "include": "#expression-body"
            },
            {
              "include": "#punctuation-comma"
            }
          ]
        }
      ]
    },
    "switch-pattern": {
      "begin": "(?x) # e.g. int x OR var x\n(?<type_name>\n  (?:\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)\\s+\n(\\g<identifier>)\\b\\s*",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "2": {
          "name": "entity.name.variable.local.cs"
        }
      },
      "end": "(?==>)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#switch-when-clause"
        }
      ]
    },
    "switch-property-expression": {
      "begin": "(?x) # e.g. int x OR var x\n(?<type_name>\n  (?:\n    (?:\n      (?:(?<identifier>@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n      (?<name_and_type_args> # identifier + type arguments (if any)\n        \\g<identifier>\\s*\n        (?<type_args>\\s*<(?:[^<>]|\\g<type_args>)+>\\s*)?\n      )\n      (?:\\s*\\.\\s*\\g<name_and_type_args>)* | # Are there any more names being dotted into?\n      (?<tuple>\\s*\\((?:[^\\(\\)]|\\g<tuple>)+\\))\n    )\n    (?:\\s*\\?\\s*)? # nullable suffix?\n    (?:\\s* # array suffix?\n      \\[\n        (?:\\s*,\\s*)* # commata for multi-dimensional arrays\n      \\]\n      \\s*\n      (?:\\?)? # arrays can be nullable reference types\n      \\s*\n    )*\n  )\n)?\\s*\n(\\{)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        "6": {
          "name": "punctuation.curlybrace.open.cs"
        }
      },
      "end": "\\}",
      "endCaptures