{
  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  "name": "Lux",
  "scopeName": "source.lux",
  "patterns": [
    { "include": "#comments" },
    { "include": "#strings" },
    { "include": "#numbers" },
    { "include": "#keywords" },
    { "include": "#operators" },
    { "include": "#types" },
    { "include": "#functions" },
    { "include": "#variables" }
  ],
  "repository": {
    "comments": {
      "patterns": [
        {
          "name": "comment.line.documentation.lux",
          "match": "///.*$"
        },
        {
          "name": "comment.line.double-slash.lux",
          "match": "//.*$"
        },
        {
          "name": "comment.block.lux",
          "begin": "/\\*",
          "end": "\\*/"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.double.lux",
          "begin": "\"",
          "end": "\"",
          "patterns": [
            {
              "name": "constant.character.escape.lux",
              "match": "\\\\[nrt\\\\\"'0{}]"
            },
            {
              "name": "meta.embedded.interpolation.lux",
              "begin": "\\{",
              "end": "\\}",
              "beginCaptures": {
                "0": { "name": "punctuation.section.interpolation.begin.lux" }
              },
              "endCaptures": {
                "0": { "name": "punctuation.section.interpolation.end.lux" }
              },
              "patterns": [
                { "include": "$self" }
              ]
            }
          ]
        },
        {
          "name": "string.quoted.single.lux",
          "match": "'[^'\\\\]'"
        },
        {
          "name": "string.quoted.single.lux",
          "match": "'\\\\[nrt\\\\\"'0]'"
        }
      ]
    },
    "numbers": {
      "patterns": [
        {
          "name": "constant.numeric.float.lux",
          "match": "\\b\\d+\\.\\d+\\b"
        },
        {
          "name": "constant.numeric.hex.lux",
          "match": "\\b0x[0-9a-fA-F]+\\b"
        },
        {
          "name": "constant.numeric.binary.lux",
          "match": "\\b0b[01]+\\b"
        },
        {
          "name": "constant.numeric.integer.lux",
          "match": "\\b\\d+\\b"
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "name": "keyword.control.lux",
          "match": "\\b(if|then|else|match|with|run|resume)\\b"
        },
        {
          "name": "keyword.declaration.lux",
          "match": "\\b(fn|let|type|effect|handler|trait|impl|for)\\b"
        },
        {
          "name": "keyword.other.lux",
          "match": "\\b(import|export|is)\\b"
        },
        {
          "name": "constant.language.boolean.lux",
          "match": "\\b(true|false)\\b"
        },
        {
          "name": "constant.language.unit.lux",
          "match": "\\(\\)"
        },
        {
          "name": "constant.language.option.lux",
          "match": "\\b(None|Some)\\b"
        },
        {
          "name": "constant.language.result.lux",
          "match": "\\b(Ok|Err)\\b"
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "name": "keyword.operator.arrow.lux",
          "match": "=>|->|<-"
        },
        {
          "name": "keyword.operator.pipe.lux",
          "match": "\\|>"
        },
        {
          "name": "keyword.operator.comparison.lux",
          "match": "==|!=|<=|>=|<|>"
        },
        {
          "name": "keyword.operator.logical.lux",
          "match": "&&|\\|\\||!"
        },
        {
          "name": "keyword.operator.arithmetic.lux",
          "match": "[+\\-*/%]"
        },
        {
          "name": "keyword.operator.assignment.lux",
          "match": "="
        },
        {
          "name": "keyword.operator.type.lux",
          "match": ":"
        },
        {
          "name": "punctuation.separator.variant.lux",
          "match": "\\|"
        }
      ]
    },
    "types": {
      "patterns": [
        {
          "name": "support.type.primitive.lux",
          "match": "\\b(Int|Float|Bool|String|Char|Unit)\\b"
        },
        {
          "name": "support.type.builtin.lux",
          "match": "\\b(Option|Result|List)\\b"
        },
        {
          "name": "entity.name.type.lux",
          "match": "\\b[A-Z][a-zA-Z0-9_]*\\b"
        }
      ]
    },
    "functions": {
      "patterns": [
        {
          "name": "entity.name.function.definition.lux",
          "match": "(?<=fn\\s+)[a-z_][a-zA-Z0-9_]*"
        },
        {
          "name": "entity.name.function.call.lux",
          "match": "\\b[a-z_][a-zA-Z0-9_]*(?=\\s*\\()"
        },
        {
          "name": "entity.name.function.method.lux",
          "match": "(?<=\\.)[a-z_][a-zA-Z0-9_]*(?=\\s*\\()"
        }
      ]
    },
    "variables": {
      "patterns": [
        {
          "name": "variable.parameter.lux",
          "match": "(?<=[(:,]\\s*)[a-z_][a-zA-Z0-9_]*(?=\\s*:)"
        },
        {
          "name": "variable.other.lux",
          "match": "\\b[a-z_][a-zA-Z0-9_]*\\b"
        }
      ]
    }
  }
}
