{
  "displayName": "Polar",
  "name": "polar",
  "patterns": [
    {
      "include": "#comment"
    },
    {
      "include": "#rule"
    },
    {
      "include": "#rule-type"
    },
    {
      "include": "#inline-query"
    },
    {
      "include": "#resource-block"
    },
    {
      "include": "#test-block"
    },
    {
      "include": "#fixture"
    }
  ],
  "repository": {
    "boolean": {
      "match": "\\b(true|false)\\b",
      "name": "constant.language.boolean"
    },
    "comment": {
      "match": "#.*",
      "name": "comment.line.number-sign"
    },
    "fixture": {
      "patterns": [
        {
          "match": "\\bfixture\\b",
          "name": "keyword.control"
        },
        {
          "begin": "\\btest\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "end": "\\bfixture\\b",
          "endCaptures": {
            "0": {
              "name": "keyword.control"
            }
          }
        }
      ]
    },
    "inline-query": {
      "begin": "\\?=",
      "beginCaptures": {
        "0": {
          "name": "keyword.control"
        }
      },
      "end": ";",
      "name": "meta.inline-query",
      "patterns": [
        {
          "include": "#term"
        }
      ]
    },
    "keyword": {
      "patterns": [
        {
          "match": "\\b(cut|or|debug|print|in|forall|if|and|of|not|matches|type|on|global)\\b",
          "name": "constant.character"
        }
      ]
    },
    "number": {
      "patterns": [
        {
          "match": "\\b[-+]?\\d+(?:(\\.)\\d+(?:e[-+]?\\d+)?|e[-+]?\\d+)\\b",
          "name": "constant.numeric.float"
        },
        {
          "match": "\\b([-+])\\d+\\b",
          "name": "constant.numeric.integer"
        },
        {
          "match": "\\b\\d+\\b",
          "name": "constant.numeric.natural"
        }
      ]
    },
    "object-literal": {
      "begin": "([A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*)\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "entity.name.type.resource"
        }
      },
      "end": "}",
      "name": "constant.other.object-literal",
      "patterns": [
        {
          "include": "#string"
        },
        {
          "include": "#number"
        },
        {
          "include": "#boolean"
        }
      ]
    },
    "operator": {
      "captures": {
        "1": {
          "name": "keyword.control"
        }
      },
      "match": "([-!*+/<=>])"
    },
    "resource-block": {
      "begin": "(?<resourceType>[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*){0}((resource|actor)\\s+(\\g<resourceType>)(?:\\s+(extends)\\s+(\\g<resourceType>(?:\\s*,\\s*\\g<resourceType>)*)\\s*,?\\s*)?|(global))\\s*\\{",
      "beginCaptures": {
        "3": {
          "name": "keyword.control"
        },
        "4": {
          "name": "entity.name.type"
        },
        "5": {
          "name": "keyword.control"
        },
        "6": {
          "patterns": [
            {
              "match": "([A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*)",
              "name": "entity.name.type"
            }
          ]
        },
        "7": {
          "name": "keyword.control"
        }
      },
      "end": "}",
      "name": "meta.resource-block",
      "patterns": [
        {
          "match": ";",
          "name": "punctuation.separator.sequence.declarations"
        },
        {
          "begin": "\\{",
          "end": "}",
          "name": "meta.relation-declaration",
          "patterns": [
            {
              "include": "#specializer"
            },
            {
              "include": "#comment"
            },
            {
              "match": ",",
              "name": "punctuation.separator.sequence.dict"
            }
          ]
        },
        {
          "include": "#term"
        }
      ]
    },
    "rule": {
      "name": "meta.rule",
      "patterns": [
        {
          "include": "#rule-functor"
        },
        {
          "begin": "\\bif\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.if"
            }
          },
          "end": ";",
          "patterns": [
            {
              "include": "#term"
            }
          ]
        },
        {
          "match": ";"
        }
      ]
    },
    "rule-functor": {
      "begin": "([A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*)\\s*\\(",
      "beginCaptures": {
        "1": {
          "name": "support.function.rule"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "include": "#specializer"
        },
        {
          "match": ",",
          "name": "punctuation.separator.sequence.list"
        },
        {
          "include": "#term"
        }
      ]
    },
    "rule-type": {
      "begin": "\\btype\\b",
      "beginCaptures": {
        "0": {
          "name": "keyword.other.type-decl"
        }
      },
      "end": ";",
      "name": "meta.rule-type",
      "patterns": [
        {
          "include": "#rule-functor"
        }
      ]
    },
    "specializer": {
      "captures": {
        "1": {
          "name": "entity.name.type.resource"
        }
      },
      "match": "[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*\\s*:\\s*([A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*)"
    },
    "string": {
      "begin": "\"",
      "end": "\"",
      "name": "string.quoted.double",
      "patterns": [
        {
          "match": "\\\\.",
          "name": "constant.character.escape"
        }
      ]
    },
    "term": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#string"
        },
        {
          "include": "#number"
        },
        {
          "include": "#keyword"
        },
        {
          "include": "#operator"
        },
        {
          "include": "#boolean"
        },
        {
          "include": "#object-literal"
        },
        {
          "begin": "\\[",
          "end": "]",
          "name": "meta.bracket.list",
          "patterns": [
            {
              "include": "#term"
            },
            {
              "match": ",",
              "name": "punctuation.separator.sequence.list"
            }
          ]
        },
        {
          "begin": "\\{",
          "end": "}",
          "name": "meta.bracket.dict",
          "patterns": [
            {
              "include": "#term"
            },
            {
              "match": ",",
              "name": "punctuation.separator.sequence.dict"
            }
          ]
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "name": "meta.parens",
          "patterns": [
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "test-block": {
      "begin": "(test)\\s+(\"[^\"]*\")\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.control"
        },
        "2": {
          "name": "string.quoted.double"
        }
      },
      "end": "}",
      "name": "meta.test-block",
      "patterns": [
        {
          "begin": "(setup)\\s*\\{",
          "beginCaptures": {
            "1": {
              "name": "keyword.control"
            }
          },
          "end": "}",
          "name": "meta.test-setup",
          "patterns": [
            {
              "include": "#rule"
            },
            {
              "include": "#comment"
            },
            {
              "include": "#fixture"
            }
          ]
        },
        {
          "include": "#rule"
        },
        {
          "match": "\\b(assert(?:|_not))\\b",
          "name": "keyword.other"
        },
        {
          "include": "#comment"
        },
        {
          "name": "meta.iff-rule",
          "patterns": [
            {
              "include": "#rule-functor"
            },
            {
              "begin": "\\biff\\b",
              "beginCaptures": {
                "0": {
                  "name": "keyword.control"
                }
              },
              "end": ";",
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            },
            {
              "match": ";"
            }
          ]
        }
      ]
    }
  },
  "scopeName": "source.polar"
}
