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
macro
@parameter
reference references to parameters
@method
@field or @property

View file

@ -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.

View file

@ -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()

View file

@ -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"

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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]"))

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_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)

View file

@ -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
;---------

View file

@ -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)

View file

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

View file

@ -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

View file

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

View file

@ -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!