{
  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  "name": "routes",
  "scopeName": "source.routes",
  "fileTypes": ["routes"],
  "patterns": [
    { "include": "#comments" },
    { "include": "#modifiers" },
    { "include": "#http-methods" },
    { "include": "#endpoints" },
    { "include": "#controller-routes" }
  ],
  "repository": {
    "comments": {
      "patterns": [
        {
          "match": "#.*$",
          "name": "comment.line.number-sign.routes"
        }
      ]
    },
    "modifiers": {
      "patterns": [
        {
          "match": "^\\+\\s*[A-Za-z_][A-Za-z0-9_]*",
          "name": "storage.modifier.routes"
        }
      ]
    },
    "http-methods": {
      "patterns": [
        {
          "match": "^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\b|^->",
          "name": "keyword.control.routes"
        }
      ]
    },
    "endpoints": {
      "patterns": [
        {
          "match": "/[A-Za-z0-9._-]*",
          "name": "string.unquoted.path.segment.routes"
        },
        {
          "match": ":[A-Za-z_][A-Za-z0-9_]*",
          "name": "variable.parameter.path.routes"
        },
        {
          "match": "\\*[A-Za-z_][A-Za-z0-9_]*",
          "name": "variable.parameter.wildcard.routes"
        }
      ]
    },
    "parentheses-group": {
      "begin": "\\(",
      "end": "\\)",
      "name": "meta.group.arguments.routes",
      "patterns": [
        { "include": "#parentheses-group" },
        { "include": "#bracket-generic" },
        {
          "match": "\\b[A-Za-z_][A-Za-z0-9_]*\\s*=",
          "name": "variable.parameter.routes"
        },
        {
          "match": "\\\".*?\\\"|'.*?'",
          "name": "string.quoted.routes"
        },
        {
          "match": "\\b([A-Za-z_][A-Za-z0-9_]*)(\\.[A-Za-z_][A-Za-z0-9_]*)+(?!\\s*=)",
          "name": "entity.name.type.class.routes"
        },
        {
          "match": "\\b[A-Za-z_][A-Za-z0-9_]*\\b(?!\\s*=)",
          "name": "variable.other.argument.routes"
        }
      ]
    },
    "bracket-generic": {
      "begin": "\\b([A-Za-z_][A-Za-z0-9_]*)\\[",
      "beginCaptures": {
        "1": { "name": "storage.type.generic.routes" }
      },
      "end": "\\]",
      "patterns": [
        { "include": "#bracket-generic" },
        { "include": "#parentheses-group" },
        {
          "match": "\\b[A-Za-z_][A-Za-z0-9_]*\\b",
          "name": "storage.type.parameter.routes"
        },
        {
          "match": ",",
          "name": "punctuation.separator.comma.routes"
        }
      ]
    },
    "controller-routes": {
      "patterns": [
        {
          "match": "\\.[A-Za-z_][A-Za-z0-9_]*\\s*(?=\\()",
          "name": "entity.name.function.routes"
        },
        {
          "match": "\\b[A-Za-z_][A-Za-z0-9_]*\\s*(?=\\()",
          "name": "entity.name.function.routes"
        },
        { "include": "#parentheses-group" }
      ]
    }
  }
}
