aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md1
-rw-r--r--doc/nvim-treesitter.txt4
-rw-r--r--lua/nvim-treesitter.lua3
-rw-r--r--lua/nvim-treesitter/highlight.lua1
-rw-r--r--lua/nvim-treesitter/query_predicates.lua38
-rw-r--r--plugin/nvim-treesitter.vim1
-rw-r--r--queries/c/highlights.scm8
-rw-r--r--queries/c/locals.scm2
-rw-r--r--queries/cpp/highlights.scm15
-rw-r--r--queries/cpp/locals.scm12
-rw-r--r--queries/javascript/highlights.scm21
-rw-r--r--queries/javascript/locals.scm12
-rw-r--r--queries/lua/highlights.scm3
-rw-r--r--queries/lua/locals.scm2
-rw-r--r--queries/python/highlights.scm2
-rw-r--r--queries/python/locals.scm16
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!