{
  "name": "Opa",
  "scopeName": "source.opa",
  "patterns": [
    {
      "include": "#code"
    }
  ],
  "repository": {
    "code": {
      "patterns": [
        {
          "include": "#xml-literal"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#declarations"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#directive"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "name": "comment.block.opa",
          "begin": "/\\*(\\*)?",
          "end": "\\*/",
          "patterns": [
            {
              "name": "keyword.annotation.opa",
              "match": "@\\w*"
            },
            {
              "include": "#comments"
            }
          ]
        },
        {
          "name": "comment.single.opa",
          "match": "\\/\\/.*$"
        }
      ]
    },
    "constants": {
      "patterns": [
        {
          "name": "constant.language",
          "match": "\\b(void|false|true)\\b"
        },
        {
          "name": "constant.numeric.opa",
          "match": "\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDd]|UL|ul)?\\b"
        }
      ]
    },
    "declarations": {
      "patterns": [
        {
          "match": "([\\w_]*)\\s*=\\s*{{",
          "captures": {
            "1": {
              "name": "entity.name.module"
            }
          }
        },
        {
          "match": "\\b(type)\\b\\s*([a-zA-Z_][a-zA-Z0-9_]*|`[^`\\n\\r]`)",
          "captures": {
            "1": {
              "name": "keyword.opa"
            },
            "2": {
              "name": "entity.name.type"
            }
          }
        },
        {
          "begin": "^\\s*(@[\\w_]*)?\\s*([\\w_]*)\\((?=.*\\)\\s*(:\\s(\\w*))?\\s*=)",
          "end": "\\)\\s*(:\\s(\\w*))?\\s*=",
          "beginCaptures": {
            "1": {
              "name": "keyword.directive.opa"
            },
            "2": {
              "name": "entity.name.function"
            }
          }
        },
        {
          "match": "(\\w*)(:.*)?\\s*=[^=]",
          "captures": {
            "1": {
              "name": "variable.other.opa"
            }
          }
        }
      ]
    },
    "directive": {
      "name": "keyword.directive.opa",
      "match": "@[\\w_]*"
    },
    "embedded-source": {
      "patterns": [
        {
          "name": "source.opa.embeded.block",
          "begin": "{",
          "end": "}",
          "patterns": [
            {
              "include": "#code"
            },
            {
              "include": "#embedded-source"
            }
          ]
        }
      ]
    },
    "keywords": {
      "name": "keyword.opa",
      "match": "\\b(_|as|do|else|if|match|then|type|with|and|begin|css|db|end|external|forall|import|package|parser|rec|server|val|xml_parser)\\b"
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.double.scala",
          "begin": "(?\u003c!\\\\)\"",
          "end": "\"",
          "patterns": [
            {
              "name": "constant.character.escape.scala",
              "match": "\\\\."
            }
          ]
        }
      ]
    },
    "xml-attribute": {
      "patterns": [
        {
          "match": "(\\w+)=((\"[^\"]*\")|(#\\w*))",
          "captures": {
            "1": {
              "name": "entity.other.attribute-name"
            },
            "3": {
              "name": "string.quoted.double"
            },
            "4": {
              "name": "variable.other.opa"
            }
          }
        }
      ]
    },
    "xml-literal": {
      "patterns": [
        {
          "name": "text.xml",
          "begin": "\u003c/?([a-zA-Z0-9]+)",
          "end": "/?\u003e",
          "patterns": [
            {
              "include": "#xml-literal"
            },
            {
              "include": "#xml-attribute"
            },
            {
              "include": "#embedded-source"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "entity.name.tag"
            }
          }
        }
      ]
    }
  }
}