{
  "displayName": "Elm",
  "fileTypes": [
    "elm"
  ],
  "name": "elm",
  "patterns": [
    {
      "include": "#import"
    },
    {
      "include": "#module"
    },
    {
      "include": "#debug"
    },
    {
      "include": "#comments"
    },
    {
      "match": "\\b(_)\\b",
      "name": "keyword.unused.elm"
    },
    {
      "include": "#type-signature"
    },
    {
      "include": "#type-declaration"
    },
    {
      "include": "#type-alias-declaration"
    },
    {
      "include": "#string-triple"
    },
    {
      "include": "#string-quote"
    },
    {
      "include": "#char"
    },
    {
      "match": "\\b([0-9]+\\.[0-9]+([Ee][-+]?[0-9]+)?|[0-9]+[Ee][-+]?[0-9]+)\\b",
      "name": "constant.numeric.float.elm"
    },
    {
      "match": "\\b([0-9]+)\\b",
      "name": "constant.numeric.elm"
    },
    {
      "match": "\\b(0x\\h+)\\b",
      "name": "constant.numeric.elm"
    },
    {
      "include": "#glsl"
    },
    {
      "include": "#record-prefix"
    },
    {
      "include": "#module-prefix"
    },
    {
      "include": "#constructor"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.bracket.elm"
        },
        "2": {
          "name": "record.name.elm"
        },
        "3": {
          "name": "keyword.pipe.elm"
        },
        "4": {
          "name": "entity.name.record.field.elm"
        }
      },
      "match": "(\\{)\\s+([a-z][0-9A-Z_a-z]*)\\s+(\\|)\\s+([a-z][0-9A-Z_a-z]*)",
      "name": "meta.record.field.update.elm"
    },
    {
      "captures": {
        "1": {
          "name": "keyword.pipe.elm"
        },
        "2": {
          "name": "entity.name.record.field.elm"
        },
        "3": {
          "name": "keyword.operator.assignment.elm"
        }
      },
      "match": "(\\|)\\s+([a-z][0-9A-Z_a-z]*)\\s+(=)",
      "name": "meta.record.field.update.elm"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.bracket.elm"
        },
        "2": {
          "name": "record.name.elm"
        }
      },
      "match": "(\\{)\\s+([a-z][0-9A-Z_a-z]*)\\s+$",
      "name": "meta.record.field.update.elm"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.bracket.elm"
        },
        "2": {
          "name": "entity.name.record.field.elm"
        },
        "3": {
          "name": "keyword.operator.assignment.elm"
        }
      },
      "match": "(\\{)\\s+([a-z][0-9A-Z_a-z]*)\\s+(=)",
      "name": "meta.record.field.elm"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.separator.comma.elm"
        },
        "2": {
          "name": "entity.name.record.field.elm"
        },
        "3": {
          "name": "keyword.operator.assignment.elm"
        }
      },
      "match": "(,)\\s+([a-z][0-9A-Z_a-z]*)\\s+(=)",
      "name": "meta.record.field.elm"
    },
    {
      "match": "([{}])",
      "name": "punctuation.bracket.elm"
    },
    {
      "include": "#unit"
    },
    {
      "include": "#comma"
    },
    {
      "include": "#parens"
    },
    {
      "match": "(->)",
      "name": "keyword.operator.arrow.elm"
    },
    {
      "include": "#infix_op"
    },
    {
      "match": "([:=\\\\|])",
      "name": "keyword.other.elm"
    },
    {
      "match": "\\b(type|as|port|exposing|alias|infixl|infixr?)\\s+",
      "name": "keyword.other.elm"
    },
    {
      "match": "\\b(if|then|else|case|of|let|in)\\s+",
      "name": "keyword.control.elm"
    },
    {
      "include": "#record-accessor"
    },
    {
      "include": "#top_level_value"
    },
    {
      "include": "#value"
    },
    {
      "include": "#period"
    },
    {
      "include": "#square_brackets"
    }
  ],
  "repository": {
    "block_comment": {
      "applyEndPatternLast": 1,
      "begin": "\\{-(?!#)",
      "captures": {
        "0": {
          "name": "punctuation.definition.comment.elm"
        }
      },
      "end": "-}",
      "name": "comment.block.elm",
      "patterns": [
        {
          "include": "#block_comment"
        }
      ]
    },
    "char": {
      "begin": "'",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.char.begin.elm"
        }
      },
      "end": "'",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.char.end.elm"
        }
      },
      "name": "string.quoted.single.elm",
      "patterns": [
        {
          "match": "\\\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv]|x\\h{1,5})",
          "name": "constant.character.escape.elm"
        },
        {
          "match": "\\^[@-_]",
          "name": "constant.character.escape.control.elm"
        }
      ]
    },
    "comma": {
      "match": "(,)",
      "name": "punctuation.separator.comma.elm"
    },
    "comments": {
      "patterns": [
        {
          "begin": "--",
          "captures": {
            "1": {
              "name": "punctuation.definition.comment.elm"
            }
          },
          "end": "$",
          "name": "comment.line.double-dash.elm"
        },
        {
          "include": "#block_comment"
        }
      ]
    },
    "constructor": {
      "match": "\\b[A-Z][0-9A-Z_a-z]*\\b",
      "name": "constant.type-constructor.elm"
    },
    "debug": {
      "match": "\\b(Debug)\\b",
      "name": "invalid.illegal.debug.elm"
    },
    "glsl": {
      "begin": "(\\[)(glsl)(\\|)",
      "beginCaptures": {
        "1": {
          "name": "entity.glsl.bracket.elm"
        },
        "2": {
          "name": "entity.glsl.name.elm"
        },
        "3": {
          "name": "entity.glsl.bracket.elm"
        }
      },
      "end": "(\\|])",
      "endCaptures": {
        "1": {
          "name": "entity.glsl.bracket.elm"
        }
      },
      "name": "meta.embedded.block.glsl",
      "patterns": [
        {
          "include": "source.glsl"
        }
      ]
    },
    "import": {
      "begin": "^\\b(import)\\s+",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.import.elm"
        }
      },
      "end": "\\n(?!\\s)",
      "name": "meta.import.elm",
      "patterns": [
        {
          "match": "(as|exposing)",
          "name": "keyword.control.elm"
        },
        {
          "include": "#module_chunk"
        },
        {
          "include": "#period"
        },
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "include": "#module-exports"
        }
      ]
    },
    "infix_op": {
      "match": "(</>|<\\?>|<\\||<=|\\|\\||&&|>=|\\|>|\\|=|\\|\\.|\\+\\+|::|/=|==|//|>>|<<|[-*+/<>^])",
      "name": "keyword.operator.elm"
    },
    "module": {
      "begin": "^\\b((port |effect )?module)\\s+",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.elm"
        }
      },
      "end": "\\n(?!\\s)",
      "endCaptures": {
        "1": {
          "name": "keyword.other.elm"
        }
      },
      "name": "meta.declaration.module.elm",
      "patterns": [
        {
          "include": "#module_chunk"
        },
        {
          "include": "#period"
        },
        {
          "match": "(exposing)",
          "name": "keyword.other.elm"
        },
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "include": "#module-exports"
        }
      ]
    },
    "module-exports": {
      "begin": "(\\()",
      "beginCaptures": {
        "1": {
          "name": "punctuation.parens.module-export.elm"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "punctuation.parens.module-export.elm"
        }
      },
      "name": "meta.declaration.exports.elm",
      "patterns": [
        {
          "match": "\\b[a-z]['0-9A-Z_a-z]*",
          "name": "entity.name.function.elm"
        },
        {
          "match": "\\b[A-Z]['0-9A-Z_a-z]*",
          "name": "storage.type.elm"
        },
        {
          "match": ",",
          "name": "punctuation.separator.comma.elm"
        },
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "include": "#comma"
        },
        {
          "match": "\\(\\.\\.\\)",
          "name": "punctuation.parens.ellipses.elm"
        },
        {
          "match": "\\.\\.",
          "name": "punctuation.parens.ellipses.elm"
        },
        {
          "include": "#infix_op"
        },
        {
          "match": "\\(.*?\\)",
          "name": "meta.other.unknown.elm"
        }
      ]
    },
    "module-prefix": {
      "captures": {
        "1": {
          "name": "support.module.elm"
        },
        "2": {
          "name": "keyword.other.period.elm"
        }
      },
      "match": "([A-Z][0-9A-Z_a-z]*)(\\.)",
      "name": "meta.module.name.elm"
    },
    "module_chunk": {
      "match": "[A-Z][0-9A-Z_a-z]*",
      "name": "support.module.elm"
    },
    "parens": {
      "match": "([()])",
      "name": "punctuation.parens.elm"
    },
    "period": {
      "match": "\\.",
      "name": "keyword.other.period.elm"
    },
    "record-accessor": {
      "captures": {
        "1": {
          "name": "keyword.other.period.elm"
        },
        "2": {
          "name": "entity.name.record.field.accessor.elm"
        }
      },
      "match": "(\\.)([a-z][0-9A-Z_a-z]*)",
      "name": "meta.record.accessor"
    },
    "record-prefix": {
      "captures": {
        "1": {
          "name": "record.name.elm"
        },
        "2": {
          "name": "keyword.other.period.elm"
        },
        "3": {
          "name": "entity.name.record.field.accessor.elm"
        }
      },
      "match": "([a-z][0-9A-Z_a-z]*)(\\.)([a-z][0-9A-Z_a-z]*)",
      "name": "record.accessor.elm"
    },
    "square_brackets": {
      "match": "[]\\[]",
      "name": "punctuation.definition.list.elm"
    },
    "string-quote": {
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.elm"
        }
      },
      "end": "\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.elm"
        }
      },
      "name": "string.quoted.double.elm",
      "patterns": [
        {
          "match": "\\\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv]|x\\h{1,5})",
          "name": "constant.character.escape.elm"
        },
        {
          "match": "\\^[@-_]",
          "name": "constant.character.escape.control.elm"
        }
      ]
    },
    "string-triple": {
      "begin": "\"\"\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.elm"
        }
      },
      "end": "\"\"\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.elm"
        }
      },
      "name": "string.quoted.triple.elm",
      "patterns": [
        {
          "match": "\\\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv]|x\\h{1,5})",
          "name": "constant.character.escape.elm"
        },
        {
          "match": "\\^[@-_]",
          "name": "constant.character.escape.control.elm"
        }
      ]
    },
    "top_level_value": {
      "match": "^[a-z][0-9A-Z_a-z]*\\b",
      "name": "entity.name.function.top_level.elm"
    },
    "type-alias-declaration": {
      "begin": "^(type\\s+)(alias\\s+)([A-Z]['0-9A-Z_a-z]*)\\s+",
      "beginCaptures": {
        "1": {
          "name": "keyword.type.elm"
        },
        "2": {
          "name": "keyword.type-alias.elm"
        },
        "3": {
          "name": "storage.type.elm"
        }
      },
      "end": "^(?=\\S)",
      "name": "meta.function.type-declaration.elm",
      "patterns": [
        {
          "match": "\\n\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "match": "=",
          "name": "keyword.operator.assignment.elm"
        },
        {
          "include": "#module-prefix"
        },
        {
          "match": "\\b[A-Z][0-9A-Z_a-z]*\\b",
          "name": "storage.type.elm"
        },
        {
          "match": "\\b[a-z][0-9A-Z_a-z]*\\b",
          "name": "variable.type.elm"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#type-record"
        }
      ]
    },
    "type-declaration": {
      "begin": "^(type\\s+)([A-Z]['0-9A-Z_a-z]*)\\s+",
      "beginCaptures": {
        "1": {
          "name": "keyword.type.elm"
        },
        "2": {
          "name": "storage.type.elm"
        }
      },
      "end": "^(?=\\S)",
      "name": "meta.function.type-declaration.elm",
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "constant.type-constructor.elm"
            }
          },
          "match": "^\\s*([A-Z][0-9A-Z_a-z]*)\\b",
          "name": "meta.record.field.elm"
        },
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.assignment.elm"
            },
            "2": {
              "name": "constant.type-constructor.elm"
            }
          },
          "match": "([=|])\\s+([A-Z][0-9A-Z_a-z]*)\\b",
          "name": "meta.record.field.elm"
        },
        {
          "match": "=",
          "name": "keyword.operator.assignment.elm"
        },
        {
          "match": "->",
          "name": "keyword.operator.arrow.elm"
        },
        {
          "include": "#module-prefix"
        },
        {
          "match": "\\b[a-z][0-9A-Z_a-z]*\\b",
          "name": "variable.type.elm"
        },
        {
          "match": "\\b[A-Z][0-9A-Z_a-z]*\\b",
          "name": "storage.type.elm"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#type-record"
        }
      ]
    },
    "type-record": {
      "begin": "(\\{)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.braces.begin"
        }
      },
      "end": "(})",
      "endCaptures": {
        "1": {
          "name": "punctuation.section.braces.end"
        }
      },
      "name": "meta.function.type-record.elm",
      "patterns": [
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "match": "->",
          "name": "keyword.operator.arrow.elm"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.record.field.elm"
            },
            "2": {
              "name": "keyword.other.elm"
            }
          },
          "match": "([a-z][0-9A-Z_a-z]*)\\s+(:)",
          "name": "meta.record.field.elm"
        },
        {
          "match": ",",
          "name": "punctuation.separator.comma.elm"
        },
        {
          "include": "#module-prefix"
        },
        {
          "match": "\\b[a-z][0-9A-Z_a-z]*\\b",
          "name": "variable.type.elm"
        },
        {
          "match": "\\b[A-Z][0-9A-Z_a-z]*\\b",
          "name": "storage.type.elm"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#type-record"
        }
      ]
    },
    "type-signature": {
      "begin": "^(port\\s+)?([_a-z]['0-9A-Z_a-z]*)\\s+(:)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.port.elm"
        },
        "2": {
          "name": "entity.name.function.elm"
        },
        "3": {
          "name": "keyword.other.colon.elm"
        }
      },
      "end": "^(((?=[a-z]))|$)",
      "name": "meta.function.type-declaration.elm",
      "patterns": [
        {
          "include": "#type-signature-chunk"
        }
      ]
    },
    "type-signature-chunk": {
      "patterns": [
        {
          "match": "->",
          "name": "keyword.operator.arrow.elm"
        },
        {
          "match": "\\s+",
          "name": "punctuation.spaces.elm"
        },
        {
          "include": "#module-prefix"
        },
        {
          "match": "\\b[a-z][0-9A-Z_a-z]*\\b",
          "name": "variable.type.elm"
        },
        {
          "match": "\\b[A-Z][0-9A-Z_a-z]*\\b",
          "name": "storage.type.elm"
        },
        {
          "match": "\\(\\)",
          "name": "constant.unit.elm"
        },
        {
          "include": "#comma"
        },
        {
          "include": "#parens"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#type-record"
        }
      ]
    },
    "unit": {
      "match": "\\(\\)",
      "name": "constant.unit.elm"
    },
    "value": {
      "match": "\\b[a-z][0-9A-Z_a-z]*\\b",
      "name": "meta.value.elm"
    }
  },
  "scopeName": "source.elm"
}
