{
  "name": "Grace",
  "scopeName": "source.grace",
  "fileTypes": [
    "grace"
  ],
  "patterns": [
    {
      "include": "#comment"
    },
    {
      "include": "#comma"
    },
    {
      "name": "meta.import.grace",
      "match": "(import)\\s*(\".*\")\\s*(as)\\s+([A-z][A-z\\d']*)",
      "captures": {
        "1": {
          "name": "keyword.import.grace"
        },
        "2": {
          "name": "string.path.grace"
        },
        "3": {
          "name": "keyword.as.grace"
        },
        "4": {
          "name": "entity.identifier.grace"
        }
      }
    },
    {
      "name": "meta.type.literal.grace",
      "begin": "(?:(?<![A-z\\d'])(type)|(=))\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.type.grace"
        },
        "2": {
          "name": "keyword.operator.grace"
        }
      },
      "end": "\\}",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signature"
        },
        {
          "include": "#bad_names"
        },
        {
          "name": "entity.function.grace",
          "match": "[A-z][A-z\\d']*|[-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]*"
        }
      ]
    },
    {
      "name": "meta.type.grace",
      "begin": "(?<![A-z\\d'])(type)(?![A-z\\d'])(?!\\s*\\{)",
      "beginCaptures": {
        "1": {
          "name": "keyword.type.grace"
        }
      },
      "end": "(?==)",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.grace"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "name": "meta.type.generic.grace",
          "begin": "([A-z][A-z\\d']*)(<)",
          "end": "(>)",
          "beginCaptures": {
            "1": {
              "name": "entity.type.grace"
            },
            "2": {
              "name": "keyword.operator.grace"
            }
          },
          "endCaptures": {
            "1": {
              "name": "keyword.type.generic.grace"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#bad_names"
            },
            {
              "include": "#bad_operators"
            },
            {
              "include": "#comma"
            },
            {
              "name": "entity.type.generic.grace",
              "match": "[A-z][A-z\\d']*"
            }
          ]
        },
        {
          "begin": "(?<![A-z\\d'])(is)(?![A-z\\d'])",
          "beginCaptures": {
            "1": {
              "name": "keyword.grace"
            }
          },
          "end": "(?==)",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "name": "support.type.annotation.grace",
              "match": "[A-z][A-z\\d']*"
            }
          ]
        },
        {
          "include": "#bad_names"
        },
        {
          "name": "entity.type.grace",
          "match": "[A-z][A-z\\d']*"
        },
        {
          "include": "$self"
        }
      ]
    },
    {
      "name": "meta.method.grace",
      "begin": "(?<![A-z\\d'])(method)(?![A-z\\d'])",
      "beginCaptures": {
        "1": {
          "name": "keyword.grace"
        }
      },
      "end": "(?=\\{)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signature"
        },
        {
          "name": "entity.function.grace",
          "match": "[A-z][A-z\\d']*|[-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]*"
        }
      ]
    },
    {
      "name": "meta.class.grace",
      "begin": "\\b(class)(?![A-z\\d'])",
      "beginCaptures": {
        "1": {
          "name": "keyword.class.grace"
        }
      },
      "end": "(?=\\{)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signature"
        },
        {
          "name": "keyword.operator.class.grace",
          "match": "\\."
        },
        {
          "name": "meta.name.class.grace",
          "match": "(?<=class)\\s*([A-z][A-z\\d']*)\\s*(\\.)",
          "captures": {
            "1": {
              "name": "entity.class.grace"
            },
            "2": {
              "name": "keyword.operator.grace"
            }
          }
        },
        {
          "name": "entity.class.grace",
          "match": "[A-z][A-z\\d']*|[-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]*"
        }
      ]
    },
    {
      "name": "meta.definition.grace",
      "begin": "(?<![A-z\\d'])(def)(?![A-z\\d'])",
      "beginCaptures": {
        "1": {
          "name": "keyword.definition.grace"
        }
      },
      "end": "(?<![^\\w\\d'\\s])(?:(=)|(:=))(?![^\\w\\s])|$",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.grace"
        },
        "2": {
          "name": "invalid.illegal.grace"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signature_args"
        },
        {
          "begin": "(?<![A-z\\d'])(is)(?![A-z\\d'])",
          "beginCaptures": {
            "1": {
              "name": "keyword.grace"
            }
          },
          "end": "(?=(?<![^\\w\\d'\\s])(?:(=)|(:=))(?![^\\w\\d'\\s]))|$",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "name": "support.type.annotation.grace",
              "match": "[A-z][A-z\\d']*"
            }
          ]
        },
        {
          "include": "#bad_names"
        },
        {
          "name": "entity.definition.grace",
          "match": "\\b_\\b|[A-z][A-z\\d']*"
        }
      ]
    },
    {
      "name": "meta.variable.grace",
      "begin": "(?<![A-z\\d'])(var)(?![A-z\\d'])",
      "beginCaptures": {
        "1": {
          "name": "keyword.variable.grace"
        }
      },
      "end": "(?<![^\\w\\d'\\s])(?:(:=)|(=))(?![^\\w\\d'\\s])|$",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.grace"
        },
        "2": {
          "name": "invalid.illegal.grace"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<![^\\w\\d'\\s\\(,])(:)(?![^\\w\\d'\\s\\),])",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.grace"
            }
          },
          "end": "(?=$|,|\\)|(?<=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|^)(:|=|:=|->)(?=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|$))",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<![A-z\\d'])(is)(?![A-z\\d'])",
          "beginCaptures": {
            "1": {
              "name": "keyword.grace"
            }
          },
          "end": "(?=(?<![^\\w\\d'\\s])(?:(=)|(:=))(?![^\\w\\d'\\s]))|$",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "name": "support.type.annotation.grace",
              "match": "[A-z][A-z\\d']*"
            }
          ]
        },
        {
          "include": "#bad_names"
        },
        {
          "include": "#bad_operators"
        },
        {
          "name": "entity.variable.grace",
          "match": "\\b_\\b|[A-z][A-z\\d']*"
        }
      ]
    },
    {
      "name": "meta.block.grace",
      "begin": "\\{",
      "end": "\\}",
      "patterns": [
        {
          "include": "$self"
        }
      ]
    },
    {
      "name": "meta.parameters.block.grace",
      "begin": "(?<=\\{)(?=[^{}]*[^-|@#!%$?&=:\\.\\*~+\\</>\\\\}]->[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^])",
      "end": "(->)",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.grace"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signature_args"
        },
        {
          "include": "#comma"
        },
        {
          "include": "#number"
        },
        {
          "include": "#string"
        },
        {
          "include": "#bad_names"
        },
        {
          "include": "#bad_operators"
        },
        {
          "match": "[A-z][A-z\\d']*",
          "name": "entity.parameter.grace"
        }
      ]
    },
    {
      "include": "#string"
    },
    {
      "include": "#generic"
    },
    {
      "name": "keyword.control.grace",
      "match": "(?<![A-z\\d'])(return)(?![A-z\\d'])"
    },
    {
      "name": "keyword.operator.grace",
      "match": "(?<=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|^)(:|=|:=|\\.|->)(?=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|$)"
    },
    {
      "name": "support.function.operator.grace",
      "match": "[-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]*"
    },
    {
      "name": "keyword.grace",
      "match": "(?<![A-z\\d'])(dialect|import|as|object|method|class|type|def|var|where|is|inherits)(?![A-z\\d'])"
    },
    {
      "include": "#number"
    },
    {
      "name": "variable.language.self.grace",
      "match": "(?<![A-z\\d'])(super|self|outer)(?![A-z\\d'])"
    },
    {
      "name": "constant.language.boolean.true.grace",
      "match": "(?<![A-z\\d'])true(?![A-z\\d'])"
    },
    {
      "name": "constant.language.boolean.false.grace",
      "match": "(?<![A-z\\d'])false(?![A-z\\d'])"
    },
    {
      "name": "support.type.grace",
      "match": "(?<![A-z\\d'])[A-Z][A-z\\d']*(?![A-z\\d']|\\s*\\.\\s*[A-z])"
    }
  ],
  "repository": {
    "comment": {
      "match": "//.*$",
      "name": "comment.line.grace"
    },
    "comma": {
      "name": "keyword.grace",
      "match": ","
    },
    "number": {
      "name": "constant.numeric.grace",
      "match": "\\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\\.[0-9]+)?))\\b"
    },
    "string": {
      "name": "string.quoted.double.grace",
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.grace"
        }
      },
      "end": "(\")|(\\n)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.grace"
        },
        "2": {
          "name": "invalid.illegal.grace"
        }
      },
      "patterns": [
        {
          "match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)",
          "name": "constant.character.escape.grace"
        },
        {
          "name": "source.embedded.grace",
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "keyword.interpolation.begin.grace"
            }
          },
          "end": "\\}",
          "endCaptures": {
            "0": {
              "name": "keyword.interpolation.end.grace"
            }
          },
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "bad_names": {
      "name": "invalid.illegal.grace",
      "match": "(?<![A-z\\d'])(dialect|import|as|object|method|class|type|def|var|where|is|inherits|self|super|outer)(?![A-z\\d'])"
    },
    "bad_operators": {
      "name": "invalid.illegal.grace",
      "match": "[-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]+"
    },
    "generic": {
      "name": "meta.type.generic.grace",
      "begin": "(?:([A-Z][A-z\\d']*)|[a-z][A-z\\d']*)(<)(?![-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^])",
      "end": "(>)",
      "beginCaptures": {
        "1": {
          "name": "support.type.grace"
        },
        "2": {
          "name": "keyword.operator.grace"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.grace"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#generic"
        },
        {
          "include": "$self"
        },
        {
          "include": "#type"
        }
      ]
    },
    "type": {
      "name": "support.type.grace",
      "match": "[A-z][A-z\\d']*(?![A-z\\d']|\\s*\\.\\s*[A-z])"
    },
    "signature_args": {
      "name": "meta.signature.grace",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "match": "\\*",
          "name": "keyword.variadic.grace"
        },
        {
          "begin": "(?<![^\\w\\d'\\s\\(,])(:)(?![^\\w\\d'\\s\\),])",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.grace"
            }
          },
          "end": "(?=,|\\)|(?<=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|^)(:|=|:=|->)(?=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|$))",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "match": "[A-z][A-z\\d']*(?=\\s*[,\\:\\)])",
          "name": "entity.function.grace"
        },
        {
          "include": "#comma"
        }
      ]
    },
    "signature": {
      "name": "meta.signature.grace",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|^)(->)(?=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]|$)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.grace"
            }
          },
          "end": "(?=(?<![A-z\\d'])is(?![A-z\\d'])|\\{|\\}|(?<=[A-z\\d'\">)])(?<!->)\\s+$)",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "name": "meta.signature.prefix.grace",
          "match": "(prefix)\\s*(?:(:(?:=?)(?=[^-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]))|([-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]*))",
          "captures": {
            "1": {
              "name": "keyword.grace"
            },
            "2": {
              "name": "invalid.illegal.grace"
            },
            "3": {
              "name": "entity.function.grace"
            }
          }
        },
        {
          "name": "meta.signature.assign.grace",
          "match": "([A-z][A-z0-9']*)\\s*(:=)\\s*(?=\\()",
          "captures": {
            "1": {
              "name": "entity.function.grace"
            },
            "2": {
              "name": "keyword.operator.grace"
            }
          }
        },
        {
          "name": "meta.signature.binary.grace",
          "match": "(?:(:(?:=?))|([-|@#!%$?&=:\\.\\*~+\\</>\\\\\\^]+))\\s*(?=\\()",
          "captures": {
            "1": {
              "name": "invalid.illegal.grace"
            },
            "2": {
              "name": "entity.function.grace"
            }
          }
        },
        {
          "begin": "(?<![A-z\\d'])(is)(?![A-z\\d'])",
          "beginCaptures": {
            "1": {
              "name": "keyword.grace"
            }
          },
          "end": "(?=\\{|\\}|(?<=[A-z\\d'\">)])(?<!is)\\s+$)",
          "patterns": [
            {
              "include": "$self"
            },
            {
              "name": "support.annotation.grace",
              "match": "[A-z][A-z\\d']*"
            }
          ]
        },
        {
          "name": "meta.signature.parameters.grace",
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#signature_args"
            }
          ]
        },
        {
          "begin": "(?<=\\w)(<)",
          "end": "(>)",
          "beginCaptures": {
            "1": {
              "name": "keyword.generic.grace"
            }
          },
          "endCaptures": {
            "1": {
              "name": "keyword.generic.grace"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#comma"
            },
            {
              "name": "support.type.grace",
              "match": "[A-z][A-z0-9']*"
            }
          ]
        },
        {
          "include": "#bad_names"
        },
        {
          "include": "#bad_operators"
        },
        {
          "match": "[A-z][A-z\\d']*(?=\\s*[,\\:\\)])",
          "name": "entity.function.grace"
        }
      ]
    }
  },
  "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c419"
}