Merge pull request #296 from steelsojka/feat-is-predicate

feat(highlights): add is predicate
This commit is contained in:
Steven Sojka 2020-08-16 11:27:15 -05:00 committed by GitHub
commit 4a747aa30c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 102 additions and 39 deletions

View file

@ -109,6 +109,7 @@ are optional and will not have any effect for now.
builtin builtin
macro macro
@parameter @parameter
reference references to parameters
@method @method
@field or @property @field or @property

View file

@ -358,6 +358,10 @@ Rust.
*hl-TSParameter* *hl-TSParameter*
For parameters of a function. For parameters of a function.
`TSParameterReference`
*hl-TSParameterReference*
For references to parameters of a function.
`TSMethod` `TSMethod`
*hl-TSMethod* *hl-TSMethod*
For method calls and definitions. For method calls and definitions.

View file

@ -5,6 +5,9 @@ local info = require'nvim-treesitter.info'
local configs = require'nvim-treesitter.configs' local configs = require'nvim-treesitter.configs'
local parsers = require'nvim-treesitter.parsers' local parsers = require'nvim-treesitter.parsers'
-- Registers all query predicates
require"nvim-treesitter.query_predicates"
local M = {} local M = {}
function M.setup() function M.setup()

View file

@ -35,6 +35,7 @@ hlmap["function"] = "TSFunction"
hlmap["function.builtin"] = "TSFuncBuiltin" hlmap["function.builtin"] = "TSFuncBuiltin"
hlmap["function.macro"] = "TSFuncMacro" hlmap["function.macro"] = "TSFuncMacro"
hlmap["parameter"] = "TSParameter" hlmap["parameter"] = "TSParameter"
hlmap["parameter.reference"] = "TSParameterReference"
hlmap["method"] = "TSMethod" hlmap["method"] = "TSMethod"
hlmap["field"] = "TSField" hlmap["field"] = "TSField"
hlmap["property"] = "TSProperty" hlmap["property"] = "TSProperty"

View file

@ -4,12 +4,25 @@ local function error(str)
vim.api.nvim_err_writeln(str) vim.api.nvim_err_writeln(str)
end end
query.add_predicate("nth?", function(match, pattern, bufnr, pred) local function valid_args(name, pred, count, strict_count)
if #pred ~= 3 then local arg_count = #pred - 1
error("nth? must hav exactly two arguments")
return 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 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 node = match[pred[2]]
local n = pred[3] - 1 local n = pred[3] - 1
if node and node:parent() and node:named_child_count() > n then 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) end)
query.add_predicate('has-ancestor?', function(match, pattern, bufnr, pred) 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 node = match[pred[2]]
local ancestor_type = pred[3] local ancestor_type = pred[3]
@ -35,3 +48,18 @@ query.add_predicate('has-ancestor?', function(match, pattern, bufnr, pred)
end end
return false return false
end) 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)

View file

@ -43,6 +43,7 @@ highlight default link TSFunction Function
highlight default link TSFuncBuiltin Special highlight default link TSFuncBuiltin Special
highlight default link TSFuncMacro Macro highlight default link TSFuncMacro Macro
highlight default link TSParameter Identifier highlight default link TSParameter Identifier
highlight default link TSParameterReference TSParameter
highlight default link TSMethod Function highlight default link TSMethod Function
highlight default link TSField Identifier highlight default link TSField Identifier
highlight default link TSProperty Identifier highlight default link TSProperty Identifier

View file

@ -1,4 +1,4 @@
[ [
"const" "const"
"default" "default"
"enum" "enum"
@ -131,8 +131,10 @@
(comment) @comment (comment) @comment
;; Parameters ;; Parameters
(parameter_list (parameter_declaration
(parameter_declaration) @parameter) declarator: (identifier) @parameter)
((identifier) @parameter.reference
(#is? @parameter.reference parameter))
(preproc_params (preproc_params
(identifier)) @parameter (identifier)) @parameter

View file

@ -9,7 +9,7 @@
(pointer_declarator (pointer_declarator
declarator: (identifier) @definition.var) declarator: (identifier) @definition.var)
(parameter_declaration (parameter_declaration
declarator: (identifier) @definition.var) declarator: (identifier) @definition.parameter)
(init_declarator (init_declarator
declarator: (identifier) @definition.var) declarator: (identifier) @definition.var)
(array_declarator (array_declarator

View file

@ -8,7 +8,12 @@
(#match? @field "_$")) (#match? @field "_$"))
; function(Foo ...foo) ; 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? ;(field_expression) @parameter ;; How to highlight this?
(template_function (template_function
@ -42,20 +47,20 @@
(#match? @constructor "^[A-Z]")) (#match? @constructor "^[A-Z]"))
(call_expression (call_expression
function: (scoped_identifier function: (scoped_identifier
name: (identifier) @function)) name: (identifier) @function))
(call_expression (call_expression
function: (field_expression function: (field_expression
field: (field_identifier) @function)) field: (field_identifier) @function))
((call_expression ((call_expression
function: (scoped_identifier function: (scoped_identifier
name: (identifier) @constructor)) name: (identifier) @constructor))
(#match? @constructor "^[A-Z]")) (#match? @constructor "^[A-Z]"))
((call_expression ((call_expression
function: (field_expression function: (field_expression
field: (field_identifier) @constructor)) field: (field_identifier) @constructor))
(#match? @constructor "^[A-Z]")) (#match? @constructor "^[A-Z]"))

View file

@ -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 / struct defintions
(class_specifier) @scope (class_specifier) @scope
@ -10,14 +16,14 @@
(identifier) @definition.var) (identifier) @definition.var)
(struct_specifier (struct_specifier
name: (type_identifier) @definition.type) name: (type_identifier) @definition.type)
(struct_specifier (struct_specifier
name: (scoped_type_identifier name: (scoped_type_identifier
name: (type_identifier) @definition.type)) name: (type_identifier) @definition.type))
(class_specifier (class_specifier
name: (type_identifier) @definition.type) name: (type_identifier) @definition.type)
(class_specifier (class_specifier
name: (scoped_type_identifier name: (scoped_type_identifier
@ -32,7 +38,7 @@
(template_declaration) @scope (template_declaration) @scope
;; Namespaces ;; Namespaces
(namespace_definition (namespace_definition
name: (identifier) @definition.namespace name: (identifier) @definition.namespace
body: (_) @scope) body: (_) @scope)

View file

@ -1,9 +1,17 @@
; Types ; Types
; Javascript ; Javascript
; Properties
;-----------
(property_identifier) @property
; Special identifiers ; Special identifiers
;-------------------- ;--------------------
(identifier) @variable
((identifier) @constant ((identifier) @constant
(#match? @constant "^[A-Z_][A-Z\\d_]+$")) (#match? @constant "^[A-Z_][A-Z\\d_]+$"))
@ -14,11 +22,17 @@
(#match? @constructor "^[A-Z]")) (#match? @constructor "^[A-Z]"))
((identifier) @variable.builtin ((identifier) @variable.builtin
(#not-is? @variable.builtin import var parameter)
(#match? @variable.builtin "^(arguments|module|console|window|document)$")) (#match? @variable.builtin "^(arguments|module|console|window|document)$"))
((identifier) @function.builtin ((identifier) @function.builtin
(#not-is? @function.builtin import var parameter)
(#eq? @function.builtin "require")) (#eq? @function.builtin "require"))
((identifier) @parameter.reference
(#is? @parameter.reference parameter))
; Function and method definitions ; Function and method definitions
;-------------------------------- ;--------------------------------
@ -78,13 +92,6 @@
(rest_parameter (rest_parameter
(identifier) @parameter)) (identifier) @parameter))
(identifier) @variable
; Properties
;-----------
(property_identifier) @property
; Literals ; Literals
;--------- ;---------

View file

@ -14,28 +14,28 @@
;------------ ;------------
(formal_parameters (formal_parameters
(identifier) @definition.var) (identifier) @definition.parameter)
(formal_parameters (formal_parameters
(object_pattern (object_pattern
(identifier) @definition.var)) (identifier) @definition.parameter))
; function(arg = []) { ; function(arg = []) {
(formal_parameters (formal_parameters
(assignment_pattern (assignment_pattern
(shorthand_property_identifier) @definition.var)) (shorthand_property_identifier) @definition.parameter))
(formal_parameters (formal_parameters
(object_pattern (object_pattern
(shorthand_property_identifier) @definition.var)) (shorthand_property_identifier) @definition.parameter))
(formal_parameters (formal_parameters
(array_pattern (array_pattern
(identifier) @definition.var)) (identifier) @definition.parameter))
(formal_parameters (formal_parameters
(rest_parameter (rest_parameter
(identifier) @definition.var)) (identifier) @definition.parameter))
(variable_declarator (variable_declarator
name: (identifier) @definition.var) name: (identifier) @definition.var)

View file

@ -93,5 +93,8 @@
(number) @number (number) @number
(label_statement) @label (label_statement) @label
((identifier) @parameter.reference
(#is? @parameter.reference parameter))
;; Error ;; Error
(ERROR) @error (ERROR) @error

View file

@ -8,7 +8,7 @@
(field_expression object:(*) @definition.associated (property_identifier) @definition.var))) (field_expression object:(*) @definition.associated (property_identifier) @definition.var)))
;; Parameters ;; Parameters
(parameters (identifier) @definition.var) (parameters (identifier) @definition.parameter)
;; Loops ;; Loops
((loop_expression ((loop_expression

View file

@ -80,6 +80,8 @@
; Normal parameters ; Normal parameters
(parameters (parameters
(identifier) @parameter) (identifier) @parameter)
((identifier) @parameter.reference
(#is? @parameter.reference parameter))
; Lambda parameters ; Lambda parameters
(lambda_parameters (lambda_parameters
(identifier) @parameter) (identifier) @parameter)

View file

@ -18,16 +18,16 @@
; Function with parameters, defines parameters ; Function with parameters, defines parameters
(parameters (parameters
(identifier) @definition.var) (identifier) @definition.parameter)
(default_parameter (default_parameter
(identifier) @definition.var) (identifier) @definition.parameter)
(typed_parameter (typed_parameter
(identifier) @definition.var) (identifier) @definition.parameter)
(typed_default_parameter (typed_default_parameter
(identifier) @definition.var) (identifier) @definition.parameter)
(with_statement (with_statement
(with_item (with_item
@ -36,12 +36,12 @@
; *args parameter ; *args parameter
(parameters (parameters
(list_splat (list_splat
(identifier) @definition.var)) (identifier) @definition.parameter))
; **kwargs parameter ; **kwargs parameter
(parameters (parameters
(dictionary_splat (dictionary_splat
(identifier) @definition.var)) (identifier) @definition.parameter))
; Function defines function and scope ; Function defines function and scope
(function_definition (function_definition
@ -52,10 +52,10 @@
(class_definition (class_definition
name: (identifier) @definition.type) @scope name: (identifier) @definition.type) @scope
(class_definition (class_definition
body: (block body: (block
(function_definition (function_definition
name: (identifier) @definition.method))) name: (identifier) @definition.method)))
;;; Loops ;;; Loops
; not a scope! ; not a scope!