{
  "displayName": "TypeSpec",
  "fileTypes": [
    "tsp"
  ],
  "name": "typespec",
  "patterns": [
    {
      "include": "#statement"
    }
  ],
  "repository": {
    "alias-id": {
      "begin": "(=)\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.assignment.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.alias-id.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "alias-statement": {
      "begin": "\\b(alias)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.type.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.alias-statement.typespec",
      "patterns": [
        {
          "include": "#alias-id"
        },
        {
          "include": "#type-parameters"
        }
      ]
    },
    "augment-decorator-statement": {
      "begin": "((@@)\\b[$_[:alpha:]](?:[$_[:alnum:]]|\\.[$_[:alpha:]])*)\\b",
      "beginCaptures": {
        "1": {
          "name": "entity.name.tag.tsp"
        },
        "2": {
          "name": "entity.name.tag.tsp"
        }
      },
      "end": "(?=([$_`[:alpha:]]))|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.augment-decorator-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#parenthesized-expression"
        }
      ]
    },
    "block-comment": {
      "begin": "/\\*",
      "end": "\\*/",
      "name": "comment.block.tsp"
    },
    "boolean-literal": {
      "match": "\\b(true|false)\\b",
      "name": "constant.language.tsp"
    },
    "callExpression": {
      "begin": "\\b([$_[:alpha:]](?:[$_[:alnum:]]|\\.[$_[:alpha:]])*)\\b\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "entity.name.function.tsp"
        },
        "2": {
          "name": "punctuation.parenthesis.open.tsp"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.tsp"
        }
      },
      "name": "meta.callExpression.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "const-statement": {
      "begin": "\\b(const)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "variable.name.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.const-statement.typespec",
      "patterns": [
        {
          "include": "#type-annotation"
        },
        {
          "include": "#operator-assignment"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "decorator": {
      "begin": "((@)\\b[$_[:alpha:]](?:[$_[:alnum:]]|\\.[$_[:alpha:]])*)\\b",
      "beginCaptures": {
        "1": {
          "name": "entity.name.tag.tsp"
        },
        "2": {
          "name": "entity.name.tag.tsp"
        }
      },
      "end": "(?=([$_`[:alpha:]]))|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.decorator.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#parenthesized-expression"
        }
      ]
    },
    "decorator-declaration-statement": {
      "begin": "(?:(extern)\\s+)?\\b(dec)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "keyword.other.tsp"
        },
        "3": {
          "name": "entity.name.function.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.decorator-declaration-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#operation-parameters"
        }
      ]
    },
    "directive": {
      "begin": "\\s*(#\\b[$_[:alpha:]][$_[:alnum:]]*)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.directive.name.tsp"
        }
      },
      "end": "$|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.directive.typespec",
      "patterns": [
        {
          "include": "#string-literal"
        },
        {
          "include": "#identifier-expression"
        }
      ]
    },
    "doc-comment": {
      "begin": "/\\*\\*",
      "beginCaptures": {
        "0": {
          "name": "comment.block.tsp"
        }
      },
      "end": "\\*/",
      "endCaptures": {
        "0": {
          "name": "comment.block.tsp"
        }
      },
      "name": "comment.block.tsp",
      "patterns": [
        {
          "include": "#doc-comment-block"
        }
      ]
    },
    "doc-comment-block": {
      "patterns": [
        {
          "include": "#doc-comment-param"
        },
        {
          "include": "#doc-comment-return-tag"
        },
        {
          "include": "#doc-comment-unknown-tag"
        }
      ]
    },
    "doc-comment-param": {
      "captures": {
        "1": {
          "name": "keyword.tag.tspdoc"
        },
        "2": {
          "name": "keyword.tag.tspdoc"
        },
        "3": {
          "name": "variable.name.tsp"
        }
      },
      "match": "((@)(?:param|template|prop))\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\b",
      "name": "comment.block.tsp"
    },
    "doc-comment-return-tag": {
      "captures": {
        "1": {
          "name": "keyword.tag.tspdoc"
        },
        "2": {
          "name": "keyword.tag.tspdoc"
        }
      },
      "match": "((@)returns)\\b",
      "name": "comment.block.tsp"
    },
    "doc-comment-unknown-tag": {
      "captures": {
        "1": {
          "name": "entity.name.tag.tsp"
        },
        "2": {
          "name": "entity.name.tag.tsp"
        }
      },
      "match": "((@)(?:\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`))\\b",
      "name": "comment.block.tsp"
    },
    "enum-body": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.enum-body.typespec",
      "patterns": [
        {
          "include": "#enum-member"
        },
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "enum-member": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\s*(:?)",
      "beginCaptures": {
        "1": {
          "name": "variable.name.tsp"
        },
        "2": {
          "name": "keyword.operator.type.annotation.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.enum-member.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-annotation"
        }
      ]
    },
    "enum-statement": {
      "begin": "\\b(enum)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.type.tsp"
        }
      },
      "end": "(?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.enum-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#enum-body"
        }
      ]
    },
    "escape-character": {
      "match": "\\\\.",
      "name": "constant.character.escape.tsp"
    },
    "expression": {
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#parenthesized-expression"
        },
        {
          "include": "#valueof"
        },
        {
          "include": "#typeof"
        },
        {
          "include": "#type-arguments"
        },
        {
          "include": "#object-literal"
        },
        {
          "include": "#tuple-literal"
        },
        {
          "include": "#tuple-expression"
        },
        {
          "include": "#model-expression"
        },
        {
          "include": "#callExpression"
        },
        {
          "include": "#identifier-expression"
        }
      ]
    },
    "function-declaration-statement": {
      "begin": "(?:(extern)\\s+)?\\b(fn)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "keyword.other.tsp"
        },
        "3": {
          "name": "entity.name.function.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.function-declaration-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#operation-parameters"
        },
        {
          "include": "#type-annotation"
        }
      ]
    },
    "identifier-expression": {
      "match": "\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`",
      "name": "entity.name.type.tsp"
    },
    "import-statement": {
      "begin": "\\b(import)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.import-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        }
      ]
    },
    "interface-body": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.interface-body.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#interface-member"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "interface-heritage": {
      "begin": "\\b(extends)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "((?=\\{)|(?=[);@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))",
      "name": "meta.interface-heritage.typespec",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "interface-member": {
      "begin": "(?:\\b(op)\\b\\s+)?(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.function.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.interface-member.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#operation-signature"
        }
      ]
    },
    "interface-statement": {
      "begin": "\\b(interface)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.interface-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-parameters"
        },
        {
          "include": "#interface-heritage"
        },
        {
          "include": "#interface-body"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "line-comment": {
      "match": "//.*$",
      "name": "comment.line.double-slash.tsp"
    },
    "model-expression": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.model-expression.typespec",
      "patterns": [
        {
          "include": "#model-property"
        },
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#spread-operator"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "model-heritage": {
      "begin": "\\b(extends|is)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "((?=\\{)|(?=[);@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))",
      "name": "meta.model-heritage.typespec",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "model-property": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)|(\"(?:[^\"\\\\]|\\\\.)*\")",
      "beginCaptures": {
        "1": {
          "name": "variable.name.tsp"
        },
        "2": {
          "name": "string.quoted.double.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.model-property.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-annotation"
        },
        {
          "include": "#operator-assignment"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "model-statement": {
      "begin": "\\b(model)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.model-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-parameters"
        },
        {
          "include": "#model-heritage"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "namespace-body": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.namespace-body.typespec",
      "patterns": [
        {
          "include": "#statement"
        }
      ]
    },
    "namespace-name": {
      "begin": "(?=([$_`[:alpha:]]))",
      "end": "((?=\\{)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))",
      "name": "meta.namespace-name.typespec",
      "patterns": [
        {
          "include": "#identifier-expression"
        },
        {
          "include": "#punctuation-accessor"
        }
      ]
    },
    "namespace-statement": {
      "begin": "\\b(namespace)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "((?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))",
      "name": "meta.namespace-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#namespace-name"
        },
        {
          "include": "#namespace-body"
        }
      ]
    },
    "numeric-literal": {
      "match": "\\b(?<!\\$)0[Xx]\\h[_\\h]*(n)?\\b(?!\\$)|\\b(?<!\\$)0[Bb][01][01_]*(n)?\\b(?!\\$)|(?<!\\$)(?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*[Ee][-+]?[0-9][0-9_]*(n)?\\b|\\b[0-9][0-9_]*(\\.)[Ee][-+]?[0-9][0-9_]*(n)?\\b|\\B(\\.)[0-9][0-9_]*[Ee][-+]?[0-9][0-9_]*(n)?\\b|\\b[0-9][0-9_]*[Ee][-+]?[0-9][0-9_]*(n)?\\b|\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*(n)?\\b|\\b[0-9][0-9_]*(\\.)(n)?\\B|\\B(\\.)[0-9][0-9_]*(n)?\\b|\\b[0-9][0-9_]*(n)?\\b(?!\\.))(?!\\$)",
      "name": "constant.numeric.tsp"
    },
    "object-literal": {
      "begin": "#\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.hashcurlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.object-literal.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#object-literal-property"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#spread-operator"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "object-literal-property": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "variable.name.tsp"
        },
        "2": {
          "name": "keyword.operator.type.annotation.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.object-literal-property.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "operation-heritage": {
      "begin": "\\b(is)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.operation-heritage.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "operation-parameters": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.tsp"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.tsp"
        }
      },
      "name": "meta.operation-parameters.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#model-property"
        },
        {
          "include": "#spread-operator"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "operation-signature": {
      "patterns": [
        {
          "include": "#type-parameters"
        },
        {
          "include": "#operation-heritage"
        },
        {
          "include": "#operation-parameters"
        },
        {
          "include": "#type-annotation"
        }
      ]
    },
    "operation-statement": {
      "begin": "\\b(op)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.function.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.operation-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#operation-signature"
        }
      ]
    },
    "operator-assignment": {
      "match": "=",
      "name": "keyword.operator.assignment.tsp"
    },
    "parenthesized-expression": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.open.tsp"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.close.tsp"
        }
      },
      "name": "meta.parenthesized-expression.typespec",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "punctuation-accessor": {
      "match": "\\.",
      "name": "punctuation.accessor.tsp"
    },
    "punctuation-comma": {
      "match": ",",
      "name": "punctuation.comma.tsp"
    },
    "punctuation-semicolon": {
      "match": ";",
      "name": "punctuation.terminator.statement.tsp"
    },
    "scalar-body": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.scalar-body.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#scalar-constructor"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "scalar-constructor": {
      "begin": "\\b(init)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.function.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.scalar-constructor.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#operation-parameters"
        }
      ]
    },
    "scalar-extends": {
      "begin": "\\b(extends)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=[);@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.scalar-extends.typespec",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "scalar-statement": {
      "begin": "\\b(scalar)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.type.tsp"
        }
      },
      "end": "(?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.scalar-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-parameters"
        },
        {
          "include": "#scalar-extends"
        },
        {
          "include": "#scalar-body"
        }
      ]
    },
    "spread-operator": {
      "begin": "\\.\\.\\.",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.spread.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.spread-operator.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "statement": {
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#augment-decorator-statement"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#model-statement"
        },
        {
          "include": "#scalar-statement"
        },
        {
          "include": "#union-statement"
        },
        {
          "include": "#interface-statement"
        },
        {
          "include": "#enum-statement"
        },
        {
          "include": "#alias-statement"
        },
        {
          "include": "#const-statement"
        },
        {
          "include": "#namespace-statement"
        },
        {
          "include": "#operation-statement"
        },
        {
          "include": "#import-statement"
        },
        {
          "include": "#using-statement"
        },
        {
          "include": "#decorator-declaration-statement"
        },
        {
          "include": "#function-declaration-statement"
        },
        {
          "include": "#punctuation-semicolon"
        }
      ]
    },
    "string-literal": {
      "begin": "\"",
      "end": "\"|$",
      "name": "string.quoted.double.tsp",
      "patterns": [
        {
          "include": "#template-expression"
        },
        {
          "include": "#escape-character"
        }
      ]
    },
    "template-expression": {
      "begin": "\\$\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.begin.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.end.tsp"
        }
      },
      "name": "meta.template-expression.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "token": {
      "patterns": [
        {
          "include": "#doc-comment"
        },
        {
          "include": "#line-comment"
        },
        {
          "include": "#block-comment"
        },
        {
          "include": "#triple-quoted-string-literal"
        },
        {
          "include": "#string-literal"
        },
        {
          "include": "#boolean-literal"
        },
        {
          "include": "#numeric-literal"
        }
      ]
    },
    "triple-quoted-string-literal": {
      "begin": "\"\"\"",
      "end": "\"\"\"",
      "name": "string.quoted.triple.tsp",
      "patterns": [
        {
          "include": "#template-expression"
        },
        {
          "include": "#escape-character"
        }
      ]
    },
    "tuple-expression": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.squarebracket.open.tsp"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "punctuation.squarebracket.close.tsp"
        }
      },
      "name": "meta.tuple-expression.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "tuple-literal": {
      "begin": "#\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.hashsquarebracket.open.tsp"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "punctuation.squarebracket.close.tsp"
        }
      },
      "name": "meta.tuple-literal.typespec",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-annotation": {
      "begin": "\\s*(\\??)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.optional.tsp"
        },
        "2": {
          "name": "keyword.operator.type.annotation.tsp"
        }
      },
      "end": "(?=[),;=@}]|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.type-annotation.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "type-argument": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\s*(=)",
      "beginCaptures": {
        "1": {
          "name": "entity.name.type.tsp"
        },
        "2": {
          "name": "keyword.operator.assignment.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "endCaptures": {
        "0": {
          "name": "keyword.operator.assignment.tsp"
        }
      },
      "name": "meta.type-argument.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-arguments": {
      "begin": "<",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.begin.tsp"
        }
      },
      "end": ">",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.end.tsp"
        }
      },
      "name": "meta.type-arguments.typespec",
      "patterns": [
        {
          "include": "#type-argument"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-parameter": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "entity.name.type.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.type-parameter.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#type-parameter-constraint"
        },
        {
          "include": "#type-parameter-default"
        }
      ]
    },
    "type-parameter-constraint": {
      "begin": "extends",
      "beginCaptures": {
        "0": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.type-parameter-constraint.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "type-parameter-default": {
      "begin": "=",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.assignment.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.type-parameter-default.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "type-parameters": {
      "begin": "<",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.begin.tsp"
        }
      },
      "end": ">",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.typeparameters.end.tsp"
        }
      },
      "name": "meta.type-parameters.typespec",
      "patterns": [
        {
          "include": "#type-parameter"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "typeof": {
      "begin": "\\b(typeof)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.typeof.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "union-body": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.curlybrace.open.tsp"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.curlybrace.close.tsp"
        }
      },
      "name": "meta.union-body.typespec",
      "patterns": [
        {
          "include": "#union-variant"
        },
        {
          "include": "#token"
        },
        {
          "include": "#directive"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#expression"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "union-statement": {
      "begin": "\\b(union)\\b\\s+(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        },
        "2": {
          "name": "entity.name.type.tsp"
        }
      },
      "end": "(?<=})|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.union-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#union-body"
        }
      ]
    },
    "union-variant": {
      "begin": "(\\b[$_[:alpha:]][$_[:alnum:]]*\\b|`(?:[^\\\\`]|\\\\.)*`)\\s*(:)",
      "beginCaptures": {
        "1": {
          "name": "variable.name.tsp"
        },
        "2": {
          "name": "keyword.operator.type.annotation.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.union-variant.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "using-statement": {
      "begin": "\\b(using)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.using-statement.typespec",
      "patterns": [
        {
          "include": "#token"
        },
        {
          "include": "#identifier-expression"
        },
        {
          "include": "#punctuation-accessor"
        }
      ]
    },
    "valueof": {
      "begin": "\\b(valueof)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.tsp"
        }
      },
      "end": "(?=>)|(?=[),;@}]|\\bextern\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)",
      "name": "meta.valueof.typespec",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    }
  },
  "scopeName": "source.tsp"
}
