{
  "displayName": "MoonBit",
  "fileTypes": [
    "mbt"
  ],
  "name": "moonbit",
  "patterns": [
    {
      "include": "#strings"
    },
    {
      "include": "#comments"
    },
    {
      "include": "#constants"
    },
    {
      "include": "#keywords"
    },
    {
      "include": "#functions"
    },
    {
      "include": "#support"
    },
    {
      "include": "#attribute"
    },
    {
      "include": "#types"
    },
    {
      "include": "#modules"
    },
    {
      "include": "#variables"
    }
  ],
  "repository": {
    "attribute": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.control.directive"
            },
            "2": {
              "patterns": [
                {
                  "include": "#strings"
                },
                {
                  "match": "[ .0-9A-Z_a-z]+",
                  "name": "entity.name.tag"
                },
                {
                  "match": "=",
                  "name": "keyword.operator.attribute.moonbit"
                }
              ]
            }
          },
          "match": "(#[a-z][ .0-9A-Z_a-z]*)(.*)"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "match": "//[^/].*",
          "name": "comment.line"
        },
        {
          "begin": "///",
          "name": "comment.block.documentation.moonbit",
          "patterns": [
            {
              "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(mbt\\s+test|mbt\\s+test(async)|mbt|moonbit\\s+test|moonbit\\s+test(async)|moonbit|)(\\s+[^`~]*)?$)",
              "beginCaptures": {
                "3": {
                  "name": "punctuation.definition.markdown"
                },
                "5": {
                  "name": "fenced_code.block.language"
                },
                "6": {
                  "name": "fenced_code.block.language.attributes"
                }
              },
              "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
              "endCaptures": {
                "3": {
                  "name": "punctuation.definition.markdown"
                }
              },
              "name": "markup.fenced_code.block.markdown",
              "patterns": [
                {
                  "begin": "(^|\\G)(\\s*)(.*)",
                  "contentName": "meta.embedded.block.moonbit",
                  "patterns": [
                    {
                      "include": "$self"
                    }
                  ],
                  "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
                }
              ]
            }
          ],
          "while": "///"
        }
      ]
    },
    "constants": {
      "patterns": [
        {
          "match": "\\b\\d([_\\d])*(?!\\.)((U)?(L)?|N?)\\b",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "(?<=\\.)\\d((?=\\.)|\\b)",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "\\b\\d+(?=\\.\\.)",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "\\b\\d[_\\d]*\\.[_\\d]*([Ee][-+]?\\d[_\\d]*\\b)?",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "\\b0[Oo][0-7][0-7]*((U)?(L)?|N?)\\b",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "\\b0[Xx][A-Fa-f\\d][A-F_a-f\\d]*(([LU]|UL|N)\\b|\\.[A-F_a-f\\d]*([Pp][-+]?[A-F_a-f\\d]+\\b)?)?",
          "name": "constant.numeric.moonbit"
        },
        {
          "match": "\\b(true|false)\\b",
          "name": "constant.language.moonbit"
        }
      ]
    },
    "escape": {
      "patterns": [
        {
          "match": "\\\\[\"'0\\\\bnrt]",
          "name": "constant.character.escape.moonbit"
        },
        {
          "match": "\\\\x\\h{2}",
          "name": "constant.character.escape.moonbit"
        },
        {
          "match": "\\\\o[0-3][0-7]{2}",
          "name": "constant.character.escape.moonbit"
        },
        {
          "match": "\\\\u\\h{4}",
          "name": "constant.character.escape.unicode.moonbit"
        },
        {
          "match": "\\\\u\\{\\h*}",
          "name": "constant.character.escape.unicode.moonbit"
        }
      ]
    },
    "functions": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.moonbit"
            },
            "2": {
              "name": "entity.name.type.moonbit"
            },
            "3": {
              "name": "entity.name.function.moonbit"
            }
          },
          "match": "\\b(fn)\\b\\s*(?:([A-Z][0-9A-Z_a-z]*)::)?([0-9_a-z][0-9A-Z_a-z]*)?\\b"
        },
        {
          "begin": "(?!\\bfn\\s+)(?:\\.|::)?([0-9_a-z][0-9A-Z_a-z]*([!?]|!!)?)\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.moonbit"
            },
            "2": {
              "name": "punctuation.brackets.round.moonbit"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.brackets.round.moonbit"
            }
          },
          "name": "meta.function.call.moonbit",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#constants"
            },
            {
              "include": "#keywords"
            },
            {
              "include": "#functions"
            },
            {
              "include": "#support"
            },
            {
              "include": "#types"
            },
            {
              "include": "#modules"
            },
            {
              "include": "#strings"
            },
            {
              "include": "#variables"
            }
          ]
        }
      ]
    },
    "interpolation": {
      "patterns": [
        {
          "begin": "\\\\\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.embedded.begin.moonbit"
            }
          },
          "contentName": "source.moonbit",
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.embedded.end.moonbit"
            }
          },
          "name": "meta.embedded.line.moonbit",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "match": "\\b(async)\\b",
          "name": "keyword.control.moonbit.async"
        },
        {
          "match": "\\b(guard|if|while|break|continue|return|try|catch|except|raise|noraise|match|lexmatch|using|else|as|in|is|loop|for|async|defer)\\b",
          "name": "keyword.control.moonbit"
        },
        {
          "match": "\\b(type!|lexmatch\\?|(type|typealias|let|const|enum|struct|import|trait|traitalias|derive|test|impl|with|fnalias|recur|suberror|letrec|and|where|declare)\\b)",
          "name": "keyword.moonbit"
        },
        {
          "match": "\\b(mut|pub|priv|readonly|extern)\\b",
          "name": "storage.modifier.moonbit"
        },
        {
          "match": "->",
          "name": "storage.type.function.arrow.moonbit"
        },
        {
          "match": "=>",
          "name": "storage.type.function.arrow.moonbit"
        },
        {
          "match": "=",
          "name": "keyword.operator.assignment.moonbit"
        },
        {
          "match": "\\|>",
          "name": "keyword.operator.other.moonbit"
        },
        {
          "match": "(===?|!=|>=|<=|(?<!-)(?<!\\|)>(?!>)|<(?!<))",
          "name": "keyword.operator.comparison.moonbit"
        },
        {
          "match": "(\\bnot\\b|&&|\\|\\|)",
          "name": "keyword.operator.logical.moonbit"
        },
        {
          "match": "(\\|(?!\\|)(?!>)|&(?!&)|\\^|<<|>>)",
          "name": "keyword.operator.bitwise.moonbit"
        },
        {
          "match": "(\\+|-(?!>)|[%*/])",
          "name": "keyword.operator.math.moonbit"
        }
      ]
    },
    "modules": {
      "patterns": [
        {
          "match": "@[A-Za-z][/-9A-Z_a-z]*",
          "name": "entity.name.namespace.moonbit"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.other.moonbit"
            }
          },
          "match": "(#\\|).*",
          "name": "string.line"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.other.moonbit"
            },
            "2": {
              "patterns": [
                {
                  "include": "#escape"
                },
                {
                  "include": "#interpolation"
                }
              ]
            }
          },
          "match": "(\\$\\|)(.*)",
          "name": "string.line"
        },
        {
          "begin": "'",
          "end": "'",
          "name": "string.quoted.single.moonbit",
          "patterns": [
            {
              "include": "#escape"
            }
          ]
        },
        {
          "begin": "\"",
          "end": "\"",
          "name": "string.quoted.double.moonbit",
          "patterns": [
            {
              "include": "#escape"
            },
            {
              "include": "#interpolation"
            }
          ]
        }
      ]
    },
    "support": {
      "patterns": [
        {
          "match": "\\b(Eq|Compare|Hash|Show|Default|ToJson|FromJson)\\b",
          "name": "support.class.moonbit"
        }
      ]
    },
    "types": {
      "patterns": [
        {
          "match": "\\b(?<!@)[A-Z][0-9A-Z_a-z]*((\\?)+|\\b)",
          "name": "entity.name.type.moonbit"
        }
      ]
    },
    "variables": {
      "patterns": [
        {
          "match": "\\b(?<!\\.|::)[_a-z][0-9A-Z_a-z]*\\b",
          "name": "variable.other.moonbit"
        }
      ]
    }
  },
  "scopeName": "source.moonbit"
}
