-- mod-version:3
local syntax = require "core.syntax"

syntax.add {
  name = "Zig",
  files = { "%.zig$" },
  comment = "//",
  patterns = {
    { pattern = "//.-\n",                       type = "comment"  },
    { pattern = "\\\\.-\n",                     type = "string" },
    { pattern = { '"', '"', '\\' },             type = "string" },
    { pattern = { "'", "'", '\\' },             type = "string" },
    { pattern = "[iu][%d_]+",                   type = "keyword2" },
    { pattern = "0b[01_]+",                     type = "number" },
    { pattern = "0o[0-7_]+",                    type = "number" },
    { pattern = "0x[%x_]+",                     type = "number" },
    { pattern = "0x[%x_]+%.[%x_]*[pP][-+]?%d+", type = "number" },
    { pattern = "0x[%x_]+%.[%x_]*",             type = "number" },
    { pattern = "0x%.[%x_]+[pP][-+]?%d+",       type = "number" },
    { pattern = "0x%.[%x_]+",                   type = "number" },
    { pattern = "0x[%x_]+[pP][-+]?%d+",         type = "number" },
    { pattern = "0x[%x_]+",                     type = "number" },
    { pattern = "%d[%d_]*%.[%d_]*[eE][-+]?%d+", type = "number" },
    { pattern = "%d[%d_]*%.[%d_]*",             type = "number" },
    { pattern = "%d[%d_]*",                     type = "number" },
    { pattern = "[%+%-=/%*%^%%<>!~|&%.%?]",     type = "operator" },
    { pattern = "[%a_][%w_]*()%s*%(",           type = {"function", "normal"} },
    { pattern = "[A-Z][%w_]*",                  type = "keyword2" },
    { pattern = "[%a_][%w_]*",                  type = "symbol" },
    { pattern = "@()[%a_][%w_]*",               type = {"operator", "function"} },
  },
  symbols = {
    ["fn"]          = "keyword",
    ["asm"]         = "keyword",
    ["volatile"]    = "keyword",
    ["continue"]    = "keyword",
    ["break"]       = "keyword",
    ["switch"]      = "keyword",
    ["for"]         = "keyword",
    ["while"]       = "keyword",
    ["var"]             = "keyword",
    ["anytype"]         = "keyword",
    ["anyframe"] = "keyword",
    ["const"]           = "keyword",
    ["test"]            = "keyword",
    ["packed"]          = "keyword",
    ["extern"]          = "keyword",
    ["export"]          = "keyword",
    ["pub"]             = "keyword",
    ["defer"]           = "keyword",
    ["errdefer"]        = "keyword",
    ["align"]           = "keyword",
    ["usingnamespace"]  = "keyword",
    ["noasync"]     = "keyword",
    ["async"]       = "keyword",
    ["await"]       = "keyword",
    ["cancel"]      = "keyword",
    ["suspend"]     = "keyword",
    ["resume"]      = "keyword",
    ["threadlocal"] = "keyword",
    ["linksection"] = "keyword",
    ["callconv"]    = "keyword",
    ["try"]         = "keyword",
    ["catch"]       = "keyword",
    ["orelse"]      = "keyword",
    ["unreachable"] = "keyword",
    ["error"]       = "keyword",
    ["if"]          = "keyword",
    ["else"]        = "keyword",
    ["return"]      = "keyword",
    ["comptime"]    = "keyword",
    ["stdcallcc"]   = "keyword",
    ["ccc"]         = "keyword",
    ["nakedcc"]     = "keyword",
    ["and"]         = "keyword",
    ["or"]          = "keyword",
    ["struct"] = "keyword",
    ["enum"] = "keyword",
    ["union"] = "keyword",
    ["opaque"] = "keyword",
    ["inline"] = "keyword",
    ["allowzero"] = "keyword",
    ["noalias"] = "keyword",
    ["nosuspend"] = "keyword",

    -- types
    ["f16"] = "keyword2",
    ["f32"] = "keyword2",
    ["f64"] = "keyword2",
    ["f80"] = "keyword2",
    ["f128"] = "keyword2",
    ["void"]            = "keyword2",
    ["c_void"]          = "keyword2",
    ["isize"]           = "keyword2",
    ["usize"]           = "keyword2",
    ["c_short"]         = "keyword2",
    ["c_ushort"]        = "keyword2",
    ["c_int"]           = "keyword2",
    ["c_uint"]          = "keyword2",
    ["c_long"]          = "keyword2",
    ["c_ulong"]         = "keyword2",
    ["c_longlong"]      = "keyword2",
    ["c_ulonglong"]     = "keyword2",
    ["c_longdouble"]    = "keyword2",
    ["bool"]            = "keyword2",

    ["noreturn"]        = "keyword2",
    ["type"]            = "keyword2",
    ["anyerror"]        = "keyword2",
    ["comptime_int"]    = "keyword2",
    ["comptime_float"]  = "keyword2",

    ["true"]            = "literal",
    ["false"]           = "literal",
    ["null"]            = "literal",
    ["undefined"]       = "literal",
  },
}
