{
  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  "name": "nub",
  "scopeName": "source.nub",
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "include": "#keywords"
    },
    {
      "include": "#modifiers"
    },
    {
      "include": "#types"
    },
    {
      "include": "#strings"
    },
    {
      "include": "#numbers"
    },
    {
      "include": "#operators"
    },
    {
      "include": "#function-definition"
    },
    {
      "include": "#struct-definition"
    },
    {
      "include": "#function-call"
    },
    {
      "include": "#identifiers"
    }
  ],
  "repository": {
    "comments": {
      "patterns": [
        {
          "name": "comment.line.double-slash.nub",
          "begin": "//",
          "end": "$"
        },
        {
          "name": "comment.block.nub",
          "begin": "/\\*",
          "end": "\\*/"
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "name": "keyword.control.nub",
          "match": "\\b(if|else|while|for|in|break|continue|return|let|defer)\\b"
        },
        {
          "name": "keyword.other.nub",
          "match": "\\b(func|struct|module|import)\\b"
        }
      ]
    },
    "modifiers": {
      "patterns": [
        {
          "name": "storage.modifier.nub",
          "match": "\\b(export|extern)\\b"
        }
      ]
    },
    "types": {
      "patterns": [
        {
          "include": "#function-type"
        },
        {
          "name": "storage.type.primitive.nub",
          "match": "\\b(i8|i16|i32|i64|u8|u16|u32|u64|f32|f64|bool|string|cstring|void|any)\\b"
        },
        {
          "name": "storage.type.array.nub",
          "match": "\\[\\]"
        },
        {
          "name": "storage.type.pointer.nub",
          "match": "\\^"
        }
      ]
    },
    "function-type": {
      "patterns": [
        {
          "begin": "\\b(func)\\s*\\(",
          "beginCaptures": {
            "1": {
              "name": "storage.type.function.nub"
            }
          },
          "end": "(?<=\\))(?:\\s*:\\s*([^\\s,;{}()]+))?",
          "endCaptures": {
            "1": {
              "name": "storage.type.nub"
            }
          },
          "patterns": [
            {
              "include": "#function-type-parameters"
            }
          ]
        }
      ]
    },
    "function-type-parameters": {
      "patterns": [
        {
          "match": "\\.\\.\\.",
          "name": "keyword.operator.variadic.nub"
        },
        {
          "include": "#types"
        },
        {
          "match": ",",
          "name": "punctuation.separator.nub"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.double.nub",
          "begin": "\"",
          "end": "\"",
          "patterns": [
            {
              "name": "constant.character.escape.nub",
              "match": "\\\\(n|t|r|\\\\|\"|')"
            },
            {
              "name": "constant.character.escape.nub",
              "match": "\\\\[0-7]{1,3}"
            },
            {
              "name": "constant.character.escape.nub",
              "match": "\\\\x[0-9A-Fa-f]{1,2}"
            }
          ]
        },
        {
          "name": "string.quoted.single.nub",
          "begin": "'",
          "end": "'",
          "patterns": [
            {
              "name": "constant.character.escape.nub",
              "match": "\\\\(n|t|r|\\\\|\"|')"
            }
          ]
        }
      ]
    },
    "numbers": {
      "patterns": [
        {
          "name": "constant.numeric.float.nub",
          "match": "\\b\\d+\\.\\d*([eE][+-]?\\d+)?[fF]?\\b"
        },
        {
          "name": "constant.numeric.integer.decimal.nub",
          "match": "\\b\\d+\\b"
        },
        {
          "name": "constant.numeric.integer.hexadecimal.nub",
          "match": "\\b0[xX][0-9A-Fa-f]+\\b"
        },
        {
          "name": "constant.numeric.integer.binary.nub",
          "match": "\\b0[bB][01]+\\b"
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "name": "keyword.operator.assignment.nub",
          "match": "="
        },
        {
          "name": "keyword.operator.comparison.nub",
          "match": "(==|!=|<=|>=|<|>)"
        },
        {
          "name": "keyword.operator.arithmetic.nub",
          "match": "(\\+|\\-|\\*|/)"
        },
        {
          "name": "keyword.operator.logical.nub",
          "match": "(&&|\\|\\||!)"
        },
        {
          "name": "keyword.operator.address.nub",
          "match": "&"
        },
        {
          "name": "keyword.operator.dereference.nub",
          "match": "\\^"
        },
        {
          "name": "keyword.operator.member-access.nub",
          "match": "\\."
        },
        {
          "name": "keyword.operator.module-access.nub",
          "match": "::"
        }
      ]
    },
    "function-definition": {
      "patterns": [
        {
          "begin": "\\b(export\\s+|extern\\s+)?(func)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(",
          "beginCaptures": {
            "1": {
              "name": "storage.modifier.nub"
            },
            "2": {
              "name": "keyword.other.nub"
            },
            "3": {
              "name": "entity.name.function.nub"
            }
          },
          "end": "\\)",
          "patterns": [
            {
              "include": "#function-parameters"
            }
          ]
        }
      ]
    },
    "struct-definition": {
      "patterns": [
        {
          "match": "\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\b",
          "captures": {
            "1": {
              "name": "keyword.other.nub"
            },
            "2": {
              "name": "entity.name.type.struct.nub"
            }
          }
        }
      ]
    },
    "function-parameters": {
      "patterns": [
        {
          "match": "\\.\\.\\.",
          "name": "keyword.operator.variadic.nub"
        },
        {
          "match": "([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*",
          "captures": {
            "1": {
              "name": "variable.parameter.nub"
            }
          }
        },
        {
          "include": "#types"
        },
        {
          "include": "#identifiers"
        }
      ]
    },
    "function-call": {
      "patterns": [
        {
          "match": "([a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=\\()",
          "captures": {
            "1": {
              "name": "entity.name.function.call.nub"
            }
          }
        }
      ]
    },
    "identifiers": {
      "patterns": [
        {
          "name": "variable.other.nub",
          "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b"
        }
      ]
    }
  }
}