{
  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  "name": "zig",
  "scopeName": "source.zig",
  "fileTypes": ["zig", "zon"],
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "include": "#strings"
    },
    {
      "include": "#keywords"
    },
    {
      "include": "#operators"
    },
    {
      "include": "#numbers"
    },
    {
      "include": "#support"
    },
    {
      "include": "#variables"
    }
  ],
  "repository": {
    "variables": {
      "patterns": [
        {
          "name": "meta.function.declaration.zig",
          "patterns": [
            {
              "match": "\\b(fn)\\s+([A-Z][a-zA-Z0-9]*)\\b",
              "captures": {
                "1": {
                  "name": "storage.type.function.zig"
                },
                "2": {
                  "name": "entity.name.type.zig"
                }
              }
            },
            {
              "match": "\\b(fn)\\s+([_a-zA-Z][_a-zA-Z0-9]*)\\b",
              "captures": {
                "1": {
                  "name": "storage.type.function.zig"
                },
                "2": {
                  "name": "entity.name.function.zig"
                }
              }
            },
            {
              "begin": "\\b(fn)\\s+@\"",
              "end": "\"",
              "name": "entity.name.function.string.zig",
              "beginCaptures": {
                "1": {
                  "name": "storage.type.function.zig"
                }
              },
              "patterns": [
                {
                  "include": "#stringcontent"
                }
              ]
            },
            {
              "name": "keyword.default.zig",
              "match": "\\b(const|var|fn)\\b"
            }
          ]
        },
        {
          "name": "meta.function.call.zig",
          "patterns": [
            {
              "match": "([A-Z][a-zA-Z0-9]*)(?=\\s*\\()",
              "name": "entity.name.type.zig"
            },
            {
              "match": "([_a-zA-Z][_a-zA-Z0-9]*)(?=\\s*\\()",
              "name": "entity.name.function.zig"
            }
          ]
        },
        {
          "name": "meta.variable.zig",
          "patterns": [
            {
              "match": "\\b[_a-zA-Z][_a-zA-Z0-9]*\\b",
              "name": "variable.zig"
            },
            {
              "begin": "@\"",
              "end": "\"",
              "name": "variable.string.zig",
              "patterns": [
                {
                  "include": "#stringcontent"
                }
              ]
            }
          ]
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "match": "\\binline\\b(?!\\s*\\bfn\\b)",
          "name": "keyword.control.repeat.zig"
        },
        {
          "match": "\\b(while|for)\\b",
          "name": "keyword.control.repeat.zig"
        },
        {
          "name": "keyword.storage.zig",
          "match": "\\b(extern|packed|export|pub|noalias|inline|comptime|volatile|align|linksection|threadlocal|allowzero|noinline|callconv)\\b"
        },
        {
          "name": "keyword.structure.zig",
          "match": "\\b(struct|enum|union|opaque)\\b"
        },
        {
          "name": "keyword.statement.zig",
          "match": "\\b(asm|unreachable)\\b"
        },
        {
          "name": "keyword.control.flow.zig",
          "match": "\\b(break|return|continue|defer|errdefer)\\b"
        },
        {
          "name": "keyword.control.async.zig",
          "match": "\\b(await|resume|suspend|async|nosuspend)\\b"
        },
        {
          "name": "keyword.control.trycatch.zig",
          "match": "\\b(try|catch)\\b"
        },
        {
          "name": "keyword.control.conditional.zig",
          "match": "\\b(if|else|switch|orelse)\\b"
        },
        {
          "name": "keyword.constant.default.zig",
          "match": "\\b(null|undefined)\\b"
        },
        {
          "name": "keyword.constant.bool.zig",
          "match": "\\b(true|false)\\b"
        },
        {
          "name": "keyword.default.zig",
          "match": "\\b(usingnamespace|test|and|or)\\b"
        },
        {
          "name": "keyword.type.zig",
          "match": "\\b(bool|void|noreturn|type|error|anyerror|anyframe|anytype|anyopaque)\\b"
        },
        {
          "name": "keyword.type.integer.zig",
          "match": "\\b(f16|f32|f64|f80|f128|u\\d+|i\\d+|isize|usize|comptime_int|comptime_float)\\b"
        },
        {
          "name": "keyword.type.c.zig",
          "match": "\\b(c_char|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|c_longlong|c_ulonglong|c_longdouble)\\b"
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "name": "keyword.operator.c-pointer.zig",
          "match": "(?<=\\[)\\*c(?=\\])"
        },
        {
          "name": "keyword.operator.comparison.zig",
          "match": "(\\b(and|or)\\b)|(==|!=)"
        },
        {
          "name": "keyword.operator.arithmetic.zig",
          "match": "(-%?|\\+%?|\\*%?|/|%)=?"
        },
        {
          "name": "keyword.operator.bitwise.zig",
          "match": "(<<%?|>>|!|&|\\^|\\|)=?"
        },
        {
          "name": "keyword.operator.special.zig",
          "match": "(==|\\+\\+|\\*\\*|->)"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "name": "comment.line.documentation.zig",
          "begin": "//[!/](?=[^/])",
          "end": "$",
          "patterns": [
            {
              "include": "#commentContents"
            }
          ]
        },
        {
          "name": "comment.line.double-slash.zig",
          "begin": "//",
          "end": "$",
          "patterns": [
            {
              "include": "#commentContents"
            }
          ]
        }
      ]
    },
    "commentContents": {
      "patterns": [
        {
          "match": "\\b(TODO|FIXME|XXX|NOTE)\\b:?",
          "name": "keyword.todo.zig"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.double.zig",
          "begin": "\"",
          "end": "\"",
          "patterns": [
            {
              "include": "#stringcontent"
            }
          ]
        },
        {
          "name": "string.multiline.zig",
          "begin": "\\\\\\\\",
          "end": "$"
        },
        {
          "name": "string.quoted.single.zig",
          "match": "'([^'\\\\]|\\\\(x\\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.))'"
        }
      ]
    },
    "stringcontent": {
      "patterns": [
        {
          "name": "constant.character.escape.zig",
          "match": "\\\\([nrt'\"\\\\]|(x[0-9a-fA-F]{2})|(u\\{[0-9a-fA-F]+\\}))"
        },
        {
          "name": "invalid.illegal.unrecognized-string-escape.zig",
          "match": "\\\\."
        }
      ]
    },
    "numbers": {
      "patterns": [
        {
          "name": "constant.numeric.hexfloat.zig",
          "match": "\\b0x[0-9a-fA-F][0-9a-fA-F_]*(\\.[0-9a-fA-F][0-9a-fA-F_]*)?([pP][+-]?[0-9a-fA-F_]+)?\\b"
        },
        {
          "name": "constant.numeric.float.zig",
          "match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?([eE][+-]?[0-9_]+)?\\b"
        },
        {
          "name": "constant.numeric.decimal.zig",
          "match": "\\b[0-9][0-9_]*\\b"
        },
        {
          "name": "constant.numeric.hexadecimal.zig",
          "match": "\\b0x[a-fA-F0-9_]+\\b"
        },
        {
          "name": "constant.numeric.octal.zig",
          "match": "\\b0o[0-7_]+\\b"
        },
        {
          "name": "constant.numeric.binary.zig",
          "match": "\\b0b[01_]+\\b"
        },
        {
          "name": "constant.numeric.invalid.zig",
          "match": "\\b[0-9](([eEpP][+-])|[0-9a-zA-Z_])*(\\.(([eEpP][+-])|[0-9a-zA-Z_])*)?([eEpP][+-])?[0-9a-zA-Z_]*\\b"
        }
      ]
    },
    "support": {
      "patterns": [
        {
          "comment": "Built-in functions",
          "name": "support.function.builtin.zig",
          "match": "@[_a-zA-Z][_a-zA-Z0-9]*"
        }
      ]
    }
  }
}
