diff options
| -rw-r--r-- | CONTRIBUTING.md | 1 | ||||
| -rw-r--r-- | doc/nvim-treesitter.txt | 4 | ||||
| -rw-r--r-- | lua/nvim-treesitter.lua | 3 | ||||
| -rw-r--r-- | lua/nvim-treesitter/highlight.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-treesitter/query_predicates.lua | 38 | ||||
| -rw-r--r-- | plugin/nvim-treesitter.vim | 1 | ||||
| -rw-r--r-- | queries/c/highlights.scm | 8 | ||||
| -rw-r--r-- | queries/c/locals.scm | 2 | ||||
| -rw-r--r-- | queries/cpp/highlights.scm | 15 | ||||
| -rw-r--r-- | queries/cpp/locals.scm | 12 | ||||
| -rw-r--r-- | queries/javascript/highlights.scm | 21 | ||||
| -rw-r--r-- | queries/javascript/locals.scm | 12 | ||||
| -rw-r--r-- | queries/lua/highlights.scm | 3 | ||||
| -rw-r--r-- | queries/lua/locals.scm | 2 | ||||
| -rw-r--r-- | queries/python/highlights.scm | 2 | ||||
| -rw-r--r-- | queries/python/locals.scm | 16 |
16 files changed, 102 insertions, 39 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0e72dcb66..ec02d41c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -109,6 +109,7 @@ are optional and will not have any effect for now. builtin macro @parameter + reference references to parameters @method @field or @property diff --git a/doc/nvim-treesitter.txt b/doc/nvim-treesitter.txt index aa3ca2043..6862a7bff 100644 --- a/doc/nvim-treesitter.txt +++ b/doc/nvim-treesitter.txt @@ -358,6 +358,10 @@ Rust. *hl-TSParameter* For parameters of a function. +`TSParameterReference` + *hl-TSParameterReference* +For references to parameters of a function. + `TSMethod` *hl-TSMethod* For method calls and definitions. diff --git a/lua/nvim-treesitter.lua b/lua/nvim-treesitter.lua index 0e7b85a9a..343a037bb 100644 --- a/lua/nvim-treesitter.lua +++ b/lua/nvim-treesitter.lua @@ -5,6 +5,9 @@ local info = require'nvim-treesitter.info' local configs = require'nvim-treesitter.configs' local parsers = require'nvim-treesitter.parsers' +-- Registers all query predicates +require"nvim-treesitter.query_predicates" + local M = {} function M.setup() diff --git a/lua/nvim-treesitter/highlight.lua b/lua/nvim-treesitter/highlight.lua index 965eccbe3..1fbc6621d 100644 --- a/lua/nvim-treesitter/highlight.lua +++ b/lua/nvim-treesitter/highlight.lua @@ -35,6 +35,7 @@ hlmap["function"] = "TSFunction" hlmap["function.builtin"] = "TSFuncBuiltin" hlmap["function.macro"] = "TSFuncMacro" hlmap["parameter"] = "TSParameter" +hlmap["parameter.reference"] = "TSParameterReference" hlmap["method"] = "TSMethod" hlmap["field"] = "TSField" hlmap["property"] = "TSProperty" diff --git a/lua/nvim-treesitter/query_predicates.lua b/lua/nvim-treesitter/query_predicates.lua index 67850deaf..f6a21f28c 100644 --- a/lua/nvim-treesitter/query_predicates.lua +++ b/lua/nvim-treesitter/query_predicates.lua @@ -4,12 +4,25 @@ local function error(str) vim.api.nvim_err_writeln(str) end -query.add_predicate("nth?", function(match, pattern, bufnr, pred) - if #pred ~= 3 then - error("nth? must hav exactly two arguments") - return +local function valid_args(name, pred, count, strict_count) + local arg_count = #pred - 1 + + if strict_count then + if arg_count ~= count then + error(string.format("%s must have exactly %d arguments", name, count)) + return false + end + elseif arg_count < count then + error(string.format("%s must have at least %d arguments", name, count)) + return false end + return true +end + +query.add_predicate("nth?", function(match, pattern, bufnr, pred) + if not valid_args("nth?", pred, 2, true) then return end + local node = match[pred[2]] local n = pred[3] - 1 if node and node:parent() and node:named_child_count() > n then @@ -20,7 +33,7 @@ query.add_predicate("nth?", function(match, pattern, bufnr, pred) end) query.add_predicate('has-ancestor?', function(match, pattern, bufnr, pred) - if #pred ~= 3 then error("has-ancestor? must have exactly two arguments!") return end + if not valid_args("has-ancestor?", pred, 2, true) then return end local node = match[pred[2]] local ancestor_type = pred[3] @@ -35,3 +48,18 @@ query.add_predicate('has-ancestor?', function(match, pattern, bufnr, pred) end return false end) + +query.add_predicate('is?', function(match, pattern, bufnr, pred) + if not valid_args("is?", pred, 2) then return end + + -- Avoid circular dependencies + local locals = require"nvim-treesitter.locals" + local node = match[pred[2]] + local types = {unpack(pred, 3)} + + if not node then return true end + + local _, _, kind = locals.find_definition(node, bufnr) + + return vim.tbl_contains(types, kind) +end) diff --git a/plugin/nvim-treesitter.vim b/plugin/nvim-treesitter.vim index c7138ffba..5b4f72901 100644 --- a/plugin/nvim-treesitter.vim +++ b/plugin/nvim-treesitter.vim @@ -43,6 +43,7 @@ highlight default link TSFunction Function highlight default link TSFuncBuiltin Special highlight default link TSFuncMacro Macro highlight default link TSParameter Identifier +highlight default link TSParameterReference TSParameter highlight default link TSMethod Function highlight default link TSField Identifier highlight default link TSProperty Identifier diff --git a/queries/c/highlights.scm b/queries/c/highlights.scm index 7f3e4a5bc..ffd6bcad1 100644 --- a/queries/c/highlights.scm +++ b/queries/c/highlights.scm @@ -1,4 +1,4 @@ -[ +[ "const" "default" "enum" @@ -131,8 +131,10 @@ (comment) @comment ;; Parameters -(parameter_list - (parameter_declaration) @parameter) +(parameter_declaration + declarator: (identifier) @parameter) +((identifier) @parameter.reference + (#is? @parameter.reference parameter)) (preproc_params (identifier)) @parameter diff --git a/queries/c/locals.scm b/queries/c/locals.scm index 89fc684e2..fe6e9408c 100644 --- a/queries/c/locals.scm +++ b/queries/c/locals.scm @@ -9,7 +9,7 @@ (pointer_declarator declarator: (identifier) @definition.var) (parameter_declaration - declarator: (identifier) @definition.var) + declarator: (identifier) @definition.parameter) (init_declarator declarator: (identifier) @definition.var) (array_declarator diff --git a/queries/cpp/highlights.scm b/queries/cpp/highlights.scm index 0eb541269..fe7283136 100644 --- a/queries/cpp/highlights.scm +++ b/queries/cpp/highlights.scm @@ -8,7 +8,12 @@ (#match? @field "_$")) ; function(Foo ...foo) -(variadic_parameter_declaration) @parameter +(variadic_parameter_declaration + declarator: (variadic_declarator + (identifier) @parameter)) +; int foo = 0 +(optional_parameter_declaration + declarator: (identifier) @parameter) ;(field_expression) @parameter ;; How to highlight this? (template_function @@ -42,20 +47,20 @@ (#match? @constructor "^[A-Z]")) (call_expression - function: (scoped_identifier + function: (scoped_identifier name: (identifier) @function)) (call_expression - function: (field_expression + function: (field_expression field: (field_identifier) @function)) ((call_expression - function: (scoped_identifier + function: (scoped_identifier name: (identifier) @constructor)) (#match? @constructor "^[A-Z]")) ((call_expression - function: (field_expression + function: (field_expression field: (field_identifier) @constructor)) (#match? @constructor "^[A-Z]")) diff --git a/queries/cpp/locals.scm b/queries/cpp/locals.scm index c625e9ce3..2108f7caf 100644 --- a/queries/cpp/locals.scm +++ b/queries/cpp/locals.scm @@ -1,3 +1,9 @@ +;; Parameters +(variadic_parameter_declaration + declarator: (variadic_declarator + (identifier) @definition.parameter)) +(optional_parameter_declaration + declarator: (identifier) @definition.parameter) ;; Class / struct defintions (class_specifier) @scope @@ -10,14 +16,14 @@ (identifier) @definition.var) (struct_specifier - name: (type_identifier) @definition.type) + name: (type_identifier) @definition.type) (struct_specifier name: (scoped_type_identifier name: (type_identifier) @definition.type)) (class_specifier - name: (type_identifier) @definition.type) + name: (type_identifier) @definition.type) (class_specifier name: (scoped_type_identifier @@ -32,7 +38,7 @@ (template_declaration) @scope ;; Namespaces -(namespace_definition +(namespace_definition name: (identifier) @definition.namespace body: (_) @scope) diff --git a/queries/javascript/highlights.scm b/queries/javascript/highlights.scm index fe373e617..6cc7ab43d 100644 --- a/queries/javascript/highlights.scm +++ b/queries/javascript/highlights.scm @@ -1,9 +1,17 @@ ; Types ; Javascript + +; Properties +;----------- + +(property_identifier) @property + ; Special identifiers ;-------------------- +(identifier) @variable + ((identifier) @constant (#match? @constant "^[A-Z_][A-Z\\d_]+$")) @@ -14,11 +22,17 @@ (#match? @constructor "^[A-Z]")) ((identifier) @variable.builtin + (#not-is? @variable.builtin import var parameter) (#match? @variable.builtin "^(arguments|module|console|window|document)$")) ((identifier) @function.builtin + (#not-is? @function.builtin import var parameter) (#eq? @function.builtin "require")) +((identifier) @parameter.reference + (#is? @parameter.reference parameter)) + + ; Function and method definitions ;-------------------------------- @@ -78,13 +92,6 @@ (rest_parameter (identifier) @parameter)) -(identifier) @variable - -; Properties -;----------- - -(property_identifier) @property - ; Literals ;--------- diff --git a/queries/javascript/locals.scm b/queries/javascript/locals.scm index ee4915929..1bcf3003a 100644 --- a/queries/javascript/locals.scm +++ b/queries/javascript/locals.scm @@ -14,28 +14,28 @@ ;------------ (formal_parameters - (identifier) @definition.var) + (identifier) @definition.parameter) (formal_parameters (object_pattern - (identifier) @definition.var)) + (identifier) @definition.parameter)) ; function(arg = []) { (formal_parameters (assignment_pattern - (shorthand_property_identifier) @definition.var)) + (shorthand_property_identifier) @definition.parameter)) (formal_parameters (object_pattern - (shorthand_property_identifier) @definition.var)) + (shorthand_property_identifier) @definition.parameter)) (formal_parameters (array_pattern - (identifier) @definition.var)) + (identifier) @definition.parameter)) (formal_parameters (rest_parameter - (identifier) @definition.var)) + (identifier) @definition.parameter)) (variable_declarator name: (identifier) @definition.var) diff --git a/queries/lua/highlights.scm b/queries/lua/highlights.scm index 0ea6f6355..514d004eb 100644 --- a/queries/lua/highlights.scm +++ b/queries/lua/highlights.scm @@ -93,5 +93,8 @@ (number) @number (label_statement) @label +((identifier) @parameter.reference + (#is? @parameter.reference parameter)) + ;; Error (ERROR) @error diff --git a/queries/lua/locals.scm b/queries/lua/locals.scm index d26575471..f27eca1b6 100644 --- a/queries/lua/locals.scm +++ b/queries/lua/locals.scm @@ -8,7 +8,7 @@ (field_expression object:(*) @definition.associated (property_identifier) @definition.var))) ;; Parameters -(parameters (identifier) @definition.var) +(parameters (identifier) @definition.parameter) ;; Loops ((loop_expression diff --git a/queries/python/highlights.scm b/queries/python/highlights.scm index d8dcf0266..e65a58aee 100644 --- a/queries/python/highlights.scm +++ b/queries/python/highlights.scm @@ -80,6 +80,8 @@ ; Normal parameters (parameters (identifier) @parameter) +((identifier) @parameter.reference + (#is? @parameter.reference parameter)) ; Lambda parameters (lambda_parameters (identifier) @parameter) diff --git a/queries/python/locals.scm b/queries/python/locals.scm index 7ff07957c..156b9036f 100644 --- a/queries/python/locals.scm +++ b/queries/python/locals.scm @@ -18,16 +18,16 @@ ; Function with parameters, defines parameters (parameters - (identifier) @definition.var) + (identifier) @definition.parameter) (default_parameter - (identifier) @definition.var) + (identifier) @definition.parameter) (typed_parameter - (identifier) @definition.var) + (identifier) @definition.parameter) (typed_default_parameter - (identifier) @definition.var) + (identifier) @definition.parameter) (with_statement (with_item @@ -36,12 +36,12 @@ ; *args parameter (parameters (list_splat - (identifier) @definition.var)) + (identifier) @definition.parameter)) ; **kwargs parameter (parameters (dictionary_splat - (identifier) @definition.var)) + (identifier) @definition.parameter)) ; Function defines function and scope (function_definition @@ -52,10 +52,10 @@ (class_definition name: (identifier) @definition.type) @scope -(class_definition +(class_definition body: (block (function_definition - name: (identifier) @definition.method))) + name: (identifier) @definition.method))) ;;; Loops ; not a scope! |
