{
  "displayName": "R",
  "fileTypes": [
    "R",
    "r",
    "Rprofile"
  ],
  "foldingStartMarker": "\\{\\s*(?:#|$)",
  "foldingStopMarker": "^\\s*}",
  "name": "r",
  "patterns": [
    {
      "include": "#roxygen-example"
    },
    {
      "include": "#basic"
    }
  ],
  "repository": {
    "basic": {
      "patterns": [
        {
          "include": "#roxygen"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "basic-roxygen-example": {
      "patterns": [
        {
          "match": "^\\s*#+'",
          "name": "comment.line"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "brackets": {
      "patterns": [
        {
          "begin": "\\{",
          "end": "}",
          "name": "meta.bracket",
          "patterns": [
            {
              "include": "#basic"
            }
          ]
        },
        {
          "begin": "\\[",
          "end": "]",
          "name": "meta.bracket",
          "patterns": [
            {
              "captures": {
                "1": {
                  "name": "variable.parameter"
                }
              },
              "match": "([.\\w]+)\\s*(?==[^=])"
            },
            {
              "include": "#basic"
            }
          ]
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "name": "meta.bracket",
          "patterns": [
            {
              "captures": {
                "1": {
                  "name": "variable.parameter"
                }
              },
              "match": "([.\\w]+)\\s*(?==[^=])"
            },
            {
              "include": "#basic"
            }
          ]
        }
      ]
    },
    "comment": {
      "match": "#.*",
      "name": "comment.line"
    },
    "escape-code": {
      "match": "\\\\[\"'\\\\`abefnrtv]",
      "name": "constant.character.escape"
    },
    "escape-hex": {
      "match": "\\\\x\\h+",
      "name": "constant.numeric"
    },
    "escape-invalid": {
      "match": "\\\\.",
      "name": "invalid"
    },
    "escape-octal": {
      "match": "\\\\\\d{1,3}",
      "name": "constant.character.escape"
    },
    "escape-unicode": {
      "match": "\\\\[Uu](?:\\h+|\\{\\h+})",
      "name": "constant.character.escape"
    },
    "escapes": {
      "patterns": [
        {
          "include": "#escape-code"
        },
        {
          "include": "#escape-hex"
        },
        {
          "include": "#escape-octal"
        },
        {
          "include": "#escape-unicode"
        },
        {
          "include": "#escape-invalid"
        }
      ]
    },
    "expression": {
      "patterns": [
        {
          "include": "#brackets"
        },
        {
          "include": "#raw-strings"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#function-definition"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#function-call"
        },
        {
          "include": "#identifiers"
        },
        {
          "include": "#numbers"
        },
        {
          "include": "#operators"
        }
      ]
    },
    "function-call": {
      "captures": {
        "0": {
          "name": "meta.function-call"
        },
        "1": {
          "name": "entity.name.function"
        }
      },
      "match": "([.\\w]+)(?=\\()"
    },
    "function-definition": {
      "begin": "(function)\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.other"
        },
        "2": {
          "name": "meta.bracket"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "meta.bracket"
        }
      },
      "name": "meta.function.definition",
      "patterns": [
        {
          "begin": "([.\\w]+)",
          "beginCaptures": {
            "1": {
              "name": "variable.parameter"
            }
          },
          "end": "(?=[),])",
          "patterns": [
            {
              "include": "#basic"
            }
          ]
        },
        {
          "include": "#basic"
        }
      ]
    },
    "identifier-quoted": {
      "begin": "`",
      "end": "`",
      "name": "variable.object",
      "patterns": [
        {
          "match": "\\\\`"
        }
      ]
    },
    "identifier-syntactic": {
      "match": "[.\\p{L}\\p{Nl}][.\\p{L}\\p{Nl}\\p{Mn}\\p{Mc}\\d\\p{Pc}]*",
      "name": "variable.object"
    },
    "identifiers": {
      "patterns": [
        {
          "include": "#identifier-syntactic"
        },
        {
          "include": "#identifier-quoted"
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "include": "#keywords-control"
        },
        {
          "include": "#keywords-builtin"
        },
        {
          "include": "#keywords-constant"
        }
      ]
    },
    "keywords-builtin": {
      "match": "(?:setGroupGeneric|setRefClass|setGeneric|NextMethod|setMethod|UseMethod|tryCatch|setClass|warning|require|library|R6Class|return|switch|attach|detach|source|stop|try)(?=\\()",
      "name": "keyword.other"
    },
    "keywords-constant": {
      "match": "(?:NA_character_|NA_integer_|NA_complex_|NA_real_|TRUE|FALSE|NULL|Inf|NaN|NA)\\b",
      "name": "constant.language"
    },
    "keywords-control": {
      "match": "(?:\\\\|function|if|else|in|break|next|repeat|for|while)\\b",
      "name": "keyword"
    },
    "latex": {
      "patterns": [
        {
          "match": "\\\\\\w+",
          "name": "keyword.other"
        }
      ]
    },
    "markdown": {
      "patterns": [
        {
          "begin": "(`{3,})\\s*(.*)",
          "beginCaptures": {
            "1": {
              "name": "comment.line"
            },
            "2": {
              "name": "entity.name.section"
            }
          },
          "end": "(\\1)",
          "endCaptures": {
            "1": {
              "name": "comment.line"
            }
          },
          "patterns": [
            {
              "match": "^\\s*#+'",
              "name": "comment.line"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "meta.bracket"
            },
            "2": {
              "name": "variable.object"
            },
            "3": {
              "name": "keyword.operator"
            },
            "4": {
              "name": "entity.name.function"
            },
            "5": {
              "name": "meta.bracket"
            },
            "6": {
              "name": "meta.bracket"
            }
          },
          "match": "(\\[)(?:(\\w+)(:{2,3}))?(\\w+)(\\(\\))?(])"
        },
        {
          "match": "(\\s+|^)(__.+?__)\\b",
          "name": "markdown.bold"
        },
        {
          "match": "(\\s+|^)(_(?=[^_])(?:\\\\.|[^\\\\_])*?_)\\b",
          "name": "markdown.italic"
        },
        {
          "match": "(\\*\\*.+?\\*\\*)",
          "name": "markdown.bold"
        },
        {
          "match": "(\\*(?=[^*\\s])(?:\\\\.|[^*\\\\])*?\\*)",
          "name": "markdown.italic"
        },
        {
          "match": "(`(?:[^\\\\`]|\\\\.)*`)",
          "name": "markup.quote"
        },
        {
          "match": "(<)([^>]*)(>)",
          "name": "markup.underline.link"
        }
      ]
    },
    "numbers": {
      "patterns": [
        {
          "match": "0[Xx]\\h+(?:p[-+]?\\d+)?[Li]?",
          "name": "constant.numeric"
        },
        {
          "match": "(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][-+]?\\d*)?[Li]?",
          "name": "constant.numeric"
        }
      ]
    },
    "operators": {
      "match": "%.*?%|:::?|:=|\\|>|=>|%%|>=|<=|==|!=|<<-|->>?|<-|\\|\\||&&|[-+=]|\\*\\*?|[!$\\&,/:<>?@^|~]",
      "name": "keyword.operator"
    },
    "qqstring": {
      "begin": "\"",
      "end": "\"",
      "name": "string.quoted.double",
      "patterns": [
        {
          "include": "#escapes"
        }
      ]
    },
    "qstring": {
      "begin": "'",
      "end": "'",
      "name": "string.quoted.single",
      "patterns": [
        {
          "include": "#escapes"
        }
      ]
    },
    "raw-strings": {
      "name": "string.quoted.other",
      "patterns": [
        {
          "begin": "[Rr]\"(-*)\\{",
          "end": "}\\1\"",
          "name": "string.quoted.other"
        },
        {
          "begin": "[Rr]'(-*)\\{",
          "end": "}\\1'",
          "name": "string.quoted.other"
        },
        {
          "begin": "[Rr]\"(-*)\\[",
          "end": "]\\1\"",
          "name": "string.quoted.other"
        },
        {
          "begin": "[Rr]'(-*)\\[",
          "end": "]\\1'",
          "name": "string.quoted.other"
        },
        {
          "begin": "[Rr]\"(-*)\\(",
          "end": "\\)\\1\"",
          "name": "string.quoted.other"
        },
        {
          "begin": "[Rr]'(-*)\\(",
          "end": "\\)\\1'",
          "name": "string.quoted.other"
        }
      ]
    },
    "roxygen": {
      "begin": "^(\\s*#+')",
      "beginCaptures": {
        "1": {
          "name": "comment.line.roxygen"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#markdown"
        },
        {
          "include": "#roxygen-tokens"
        },
        {
          "include": "#latex"
        },
        {
          "match": ".",
          "name": "comment.line"
        }
      ]
    },
    "roxygen-example": {
      "begin": "^(\\s*#+')\\s*(?:(@examples)\\s*|(@examplesIf)\\s+(.*))$",
      "beginCaptures": {
        "1": {
          "name": "comment.line"
        },
        "2": {
          "name": "keyword.other"
        },
        "3": {
          "name": "keyword.other"
        },
        "4": {
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        }
      },
      "end": "^(?:\\s*(?=#+'\\s*@)|\\s*(?!#+'))",
      "patterns": [
        {
          "match": "^\\s*#+'",
          "name": "comment.line"
        },
        {
          "match": "[]()\\[{}]",
          "name": "meta.bracket"
        },
        {
          "include": "#latex"
        },
        {
          "include": "#roxygen-tokens"
        },
        {
          "include": "#basic-roxygen-example"
        }
      ]
    },
    "roxygen-tokens": {
      "patterns": [
        {
          "match": "@@",
          "name": "constant.character.escape"
        },
        {
          "begin": "(@(?:param|field|slot))\\s*",
          "beginCaptures": {
            "1": {
              "name": "keyword.other"
            }
          },
          "end": "\\s|$",
          "patterns": [
            {
              "match": "([.\\w]+)",
              "name": "variable.parameter"
            },
            {
              "match": ",",
              "name": "keyword.operator"
            }
          ]
        },
        {
          "match": "@(?!@)\\w*",
          "name": "keyword.other"
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "include": "#qstring"
        },
        {
          "include": "#qqstring"
        }
      ]
    }
  },
  "scopeName": "source.r"
}
