{
  "name": "Kotlin",
  "scopeName": "source.kotlin",
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "match": "^\\s*(package)\\b(?:\\s*([^ ;$]+)\\s*)?",
      "captures": {
        "1": {
          "name": "keyword.other.kotlin"
        },
        "2": {
          "name": "entity.name.package.kotlin"
        }
      }
    },
    {
      "include": "#imports"
    },
    {
      "include": "#statements"
    }
  ],
  "repository": {
    "annotations": {
      "patterns": [
        {
          "name": "meta.declaration.annotation.kotlin",
          "begin": "(@[^ (]+)(\\()",
          "end": "(\\))",
          "patterns": [
            {
              "match": "(\\w*)\\s*(=)",
              "captures": {
                "1": {
                  "name": "constant.other.key.kotlin"
                },
                "2": {
                  "name": "keyword.operator.assignment.kotlin"
                }
              }
            },
            {
              "include": "#statements"
            },
            {
              "name": "punctuation.seperator.property.kotlin",
              "match": ","
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.annotation.kotlin"
            },
            "2": {
              "name": "punctuation.definition.annotation-arguments.begin.kotlin"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.annotation-arguments.end.kotlin"
            }
          }
        },
        {
          "name": "storage.type.annotation.kotlin",
          "match": "@\\w*"
        }
      ]
    },
    "classes": {
      "begin": "(?\u003c!::)(?=\\b(?:companion|class|object|interface)\\b)",
      "end": "(?=$|\\})",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": "\\b(companion\\s*)?(class|object|interface)\\b",
          "end": "(?=\u003c|\\{|\\(|:|$)",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "name": "entity.name.type.class.kotlin",
              "match": "\\w+"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.modifier.kotlin"
            },
            "2": {
              "name": "storage.modifier.kotlin"
            }
          }
        },
        {
          "begin": "\u003c",
          "end": "\u003e",
          "patterns": [
            {
              "include": "#generics"
            }
          ]
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#parameters"
            }
          ]
        },
        {
          "begin": "(:)",
          "end": "(?={|$)",
          "patterns": [
            {
              "name": "entity.other.inherited-class.kotlin",
              "match": "\\w+"
            },
            {
              "begin": "\\(",
              "end": "\\)",
              "patterns": [
                {
                  "include": "#expressions"
                }
              ]
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "begin": "\\{",
          "end": "\\}",
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "name": "comment.block.empty.kotlin",
          "match": "/\\*\\*/",
          "captures": {
            "0": {
              "name": "punctuation.definition.comment.kotlin"
            }
          }
        },
        {
          "include": "text.html.javadoc"
        },
        {
          "include": "#comments-inline"
        }
      ]
    },
    "comments-inline": {
      "patterns": [
        {
          "name": "comment.block.kotlin",
          "begin": "/\\*",
          "end": "\\*/",
          "captures": {
            "0": {
              "name": "punctuation.definition.comment.kotlin"
            }
          }
        },
        {
          "match": "\\s*((//).*$\\n?)",
          "captures": {
            "1": {
              "name": "comment.line.double-slash.kotlin"
            },
            "2": {
              "name": "punctuation.definition.comment.kotlin"
            }
          }
        }
      ]
    },
    "constants": {
      "patterns": [
        {
          "name": "constant.language.kotlin",
          "match": "\\b(true|false|null|this|super)\\b"
        },
        {
          "name": "constant.numeric.kotlin",
          "match": "\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDd]|UL|ul)?\\b"
        },
        {
          "name": "constant.other.kotlin",
          "match": "\\b([A-Z][A-Z0-9_]+)\\b"
        }
      ]
    },
    "expressions": {
      "patterns": [
        {
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#expressions"
            }
          ]
        },
        {
          "include": "#types"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#keywords"
        }
      ]
    },
    "functions": {
      "begin": "(?=\\s*\\b(?:fun)\\b)",
      "end": "(?=$|\\})",
      "patterns": [
        {
          "begin": "\\b(fun)\\b",
          "end": "(?=\\()",
          "patterns": [
            {
              "begin": "\u003c",
              "end": "\u003e",
              "patterns": [
                {
                  "include": "#generics"
                }
              ]
            },
            {
              "match": "([\\.\u003c\\?\u003e\\w]+\\.)?(\\w+)",
              "captures": {
                "2": {
                  "name": "entity.name.function.kotlin"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.kotlin"
            }
          }
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#parameters"
            }
          ]
        },
        {
          "begin": "(:)",
          "end": "(?={|=|$)",
          "patterns": [
            {
              "include": "#types"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "begin": "\\{",
          "end": "(?=\\})",
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        },
        {
          "begin": "(=)",
          "end": "(?=$)",
          "patterns": [
            {
              "include": "#expressions"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.assignment.kotlin"
            }
          }
        }
      ]
    },
    "generics": {
      "patterns": [
        {
          "begin": "(:)",
          "end": "(?=,|\u003e)",
          "patterns": [
            {
              "include": "#types"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "include": "#keywords"
        },
        {
          "name": "storage.type.generic.kotlin",
          "match": "\\w+"
        }
      ]
    },
    "getters-and-setters": {
      "patterns": [
        {
          "begin": "\\b(get)\\b\\s*\\(\\s*\\)",
          "end": "\\}|(?=\\bset\\b)|$",
          "patterns": [
            {
              "begin": "(=)",
              "end": "(?=$|\\bset\\b)",
              "patterns": [
                {
                  "include": "#expressions"
                }
              ],
              "beginCaptures": {
                "1": {
                  "name": "keyword.operator.assignment.kotlin"
                }
              }
            },
            {
              "begin": "\\{",
              "end": "\\}",
              "patterns": [
                {
                  "include": "#expressions"
                }
              ]
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.kotlin"
            }
          }
        },
        {
          "begin": "\\b(set)\\b\\s*(?=\\()",
          "end": "\\}|(?=\\bget\\b)|$",
          "patterns": [
            {
              "begin": "\\(",
              "end": "\\)",
              "patterns": [
                {
                  "include": "#parameters"
                }
              ]
            },
            {
              "begin": "(=)",
              "end": "(?=$|\\bset\\b)",
              "patterns": [
                {
                  "include": "#expressions"
                }
              ],
              "beginCaptures": {
                "1": {
                  "name": "keyword.operator.assignment.kotlin"
                }
              }
            },
            {
              "begin": "\\{",
              "end": "\\}",
              "patterns": [
                {
                  "include": "#expressions"
                }
              ]
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.kotlin"
            }
          }
        }
      ]
    },
    "imports": {
      "patterns": [
        {
          "match": "^\\s*(import)\\s+[^ $.]+(\\.([`][^$`]+[`]|[^` $.]+))+\\s+(as)?",
          "captures": {
            "1": {
              "name": "keyword.other.kotlin"
            },
            "4": {
              "name": "keyword.other.kotlin"
            }
          }
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "name": "storage.modifier.kotlin",
          "match": "\\b(var|val|external|public|private|protected|abstract|final|sealed|enum|open|attribute|annotation|override|inline|vararg|in|out|internal|data|tailrec|operator|infix|const|yield|typealias|typeof|expect|actual|reified|suspend)\\b"
        },
        {
          "name": "keyword.control.catch-exception.kotlin",
          "match": "\\b(try|catch|finally|throw)\\b"
        },
        {
          "name": "keyword.control.kotlin",
          "match": "\\b(if|else|while|for|do|return|when|where|break|continue)\\b"
        },
        {
          "name": "keyword.operator.kotlin",
          "match": "\\b(in|is|as|assert)\\b"
        },
        {
          "name": "keyword.operator.comparison.kotlin",
          "match": "(==|!=|===|!==|\u003c=|\u003e=|\u003c|\u003e)"
        },
        {
          "name": "keyword.operator.assignment.kotlin",
          "match": "(=)"
        },
        {
          "name": "keyword.operator.reference.kotlin",
          "match": "(::)"
        },
        {
          "name": "keyword.operator.declaration.kotlin",
          "match": "(:)"
        },
        {
          "name": "keyword.operator.dot.kotlin",
          "match": "(\\.)"
        },
        {
          "name": "keyword.operator.dot.kotlin",
          "match": "(\\?\\.)"
        },
        {
          "name": "keyword.operator.elvis.kotlin",
          "match": "(\\?:)"
        },
        {
          "name": "keyword.operator.increment-decrement.kotlin",
          "match": "(\\-\\-|\\+\\+)"
        },
        {
          "name": "keyword.operator.arithmetic.kotlin",
          "match": "(\\-|\\+|\\*|\\/|%)"
        },
        {
          "name": "keyword.operator.arithmetic.assign.kotlin",
          "match": "(\\+=|\\-=|\\*=|\\/=)"
        },
        {
          "name": "keyword.operator.logical.kotlin",
          "match": "(!|\u0026\u0026|\\|\\|)"
        },
        {
          "name": "keyword.operator.range.kotlin",
          "match": "(\\.\\.)"
        },
        {
          "name": "punctuation.terminator.kotlin",
          "match": "(;)"
        }
      ]
    },
    "namespaces": {
      "patterns": [
        {
          "name": "keyword.other.kotlin",
          "match": "\\b(namespace)\\b"
        },
        {
          "begin": "\\{",
          "end": "\\}",
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        }
      ]
    },
    "parameters": {
      "patterns": [
        {
          "begin": "(:)",
          "end": "(?=,|\\)|=)",
          "patterns": [
            {
              "include": "#types"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "begin": "(=)",
          "end": "(?=,|\\))",
          "patterns": [
            {
              "include": "#expressions"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "include": "#keywords"
        },
        {
          "name": "variable.parameter.function.kotlin",
          "match": "\\w+"
        }
      ]
    },
    "statements": {
      "patterns": [
        {
          "include": "#namespaces"
        },
        {
          "include": "#annotations"
        },
        {
          "include": "#typedefs"
        },
        {
          "include": "#classes"
        },
        {
          "include": "#functions"
        },
        {
          "include": "#variables"
        },
        {
          "include": "#getters-and-setters"
        },
        {
          "include": "#expressions"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.third.kotlin",
          "begin": "\"\"\"",
          "end": "\"\"\"",
          "patterns": [
            {
              "name": "variable.parameter.template.kotlin",
              "match": "(\\$\\w+|\\$\\{[^\\}]+\\})"
            },
            {
              "name": "constant.character.escape.kotlin",
              "match": "\\\\."
            }
          ],
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.kotlin"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.kotlin"
            }
          }
        },
        {
          "name": "string.quoted.double.kotlin",
          "begin": "\"",
          "end": "\"",
          "patterns": [
            {
              "name": "variable.parameter.template.kotlin",
              "match": "(\\$\\w+|\\$\\{[^\\}]+\\})"
            },
            {
              "name": "constant.character.escape.kotlin",
              "match": "\\\\."
            }
          ],
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.kotlin"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.kotlin"
            }
          }
        },
        {
          "name": "string.quoted.single.kotlin",
          "begin": "'",
          "end": "'",
          "patterns": [
            {
              "name": "constant.character.escape.kotlin",
              "match": "\\\\."
            }
          ],
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.kotlin"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.kotlin"
            }
          }
        },
        {
          "name": "string.quoted.single.kotlin",
          "begin": "`",
          "end": "`",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.kotlin"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.kotlin"
            }
          }
        }
      ]
    },
    "typedefs": {
      "begin": "(?=\\s*(?:type))",
      "end": "(?=$)",
      "patterns": [
        {
          "name": "keyword.other.kotlin",
          "match": "\\b(type)\\b"
        },
        {
          "begin": "\u003c",
          "end": "\u003e",
          "patterns": [
            {
              "include": "#generics"
            }
          ]
        },
        {
          "include": "#expressions"
        }
      ]
    },
    "types": {
      "patterns": [
        {
          "name": "storage.type.builtin.kotlin",
          "match": "\\b(Nothing|Any|Unit|String|CharSequence|Int|Boolean|Char|Long|Double|Float|Short|Byte|dynamic)\\b"
        },
        {
          "name": "storage.type.builtin.array.kotlin",
          "match": "\\b(IntArray|BooleanArray|CharArray|LongArray|DoubleArray|FloatArray|ShortArray|ByteArray)\\b"
        },
        {
          "begin": "\\b(Array|List|Map)\u003c\\b",
          "end": "\u003e",
          "patterns": [
            {
              "include": "#types"
            },
            {
              "include": "#keywords"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.builtin.collection.kotlin"
            }
          }
        },
        {
          "begin": "\\w+\u003c",
          "end": "\u003e",
          "patterns": [
            {
              "include": "#types"
            },
            {
              "include": "#keywords"
            }
          ]
        },
        {
          "begin": "\\{",
          "end": "\\}",
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#types"
            }
          ]
        },
        {
          "name": "keyword.operator.declaration.kotlin",
          "match": "(-\u003e)"
        }
      ]
    },
    "variables": {
      "begin": "(?=\\s*\\b(?:var|val)\\b)",
      "end": "(?=:|=|(\\b(by)\\b)|$)",
      "patterns": [
        {
          "begin": "\\b(var|val)\\b",
          "end": "(?=:|=|(\\b(by)\\b)|$)",
          "patterns": [
            {
              "begin": "\u003c",
              "end": "\u003e",
              "patterns": [
                {
                  "include": "#generics"
                }
              ]
            },
            {
              "match": "([\\.\u003c\\?\u003e\\w]+\\.)?(\\w+)",
              "captures": {
                "2": {
                  "name": "entity.name.variable.kotlin"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.kotlin"
            }
          }
        },
        {
          "begin": "(:)",
          "end": "(?==|$)",
          "patterns": [
            {
              "include": "#types"
            },
            {
              "include": "#getters-and-setters"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.declaration.kotlin"
            }
          }
        },
        {
          "begin": "\\b(by)\\b",
          "end": "(?=$)",
          "patterns": [
            {
              "include": "#expressions"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.kotlin"
            }
          }
        },
        {
          "begin": "(=)",
          "end": "(?=$)",
          "patterns": [
            {
              "include": "#expressions"
            },
            {
              "include": "#getters-and-setters"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.assignment.kotlin"
            }
          }
        }
      ]
    }
  }
}