189 lines
3.7 KiB
Scheme

; TODO: supported by official Tree-sitter if (_)* is more than one node
; Neovim: will only match if (_) is exactly one node
;(function_definition
;body: (compound_statement
;("{" (_)* @function.inner "}"))?) @function.outer
(declaration
declarator: (function_declarator)) @function.outer
(function_definition
body: (compound_statement)) @function.outer
(function_definition
body: (compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "function.inner" @_start @_end)))
(struct_specifier
body: (_) @class.inner) @class.outer
(enum_specifier
body: (_) @class.inner) @class.outer
; conditionals
(if_statement
consequence: (compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "conditional.inner" @_start @_end))) @conditional.outer
(if_statement
alternative: (else_clause
(compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "conditional.inner" @_start @_end)))) @conditional.outer
(if_statement) @conditional.outer
(if_statement
condition: (_) @conditional.inner
(#offset! @conditional.inner 0 1 0 -1))
(while_statement
condition: (_) @conditional.inner
(#offset! @conditional.inner 0 1 0 -1))
(do_statement
condition: (_) @conditional.inner
(#offset! @conditional.inner 0 1 0 -1))
(for_statement
condition: (_) @conditional.inner)
; loops
(while_statement) @loop.outer
(while_statement
body: (compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "loop.inner" @_start @_end))) @loop.outer
(for_statement) @loop.outer
(for_statement
body: (compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "loop.inner" @_start @_end))) @loop.outer
(do_statement) @loop.outer
(do_statement
body: (compound_statement
.
"{"
.
(_) @_start @_end
(_)? @_end
.
"}"
(#make-range! "loop.inner" @_start @_end))) @loop.outer
(compound_statement) @block.outer
(comment) @comment.outer
(call_expression) @call.outer
(call_expression
arguments: (argument_list
.
"("
.
(_) @_start
(_)? @_end
.
")"
(#make-range! "call.inner" @_start @_end)))
(return_statement
(_)? @return.inner) @return.outer
; Statements
;(expression_statement ;; this is what we actually want to capture in most cases (";" is missing) probably
;(_) @statement.inner) ;; the other statement like node type is declaration but declaration has a ";"
(compound_statement
(_) @statement.outer)
(field_declaration_list
(_) @statement.outer)
(preproc_if
(_) @statement.outer)
(preproc_elif
(_) @statement.outer)
(preproc_else
(_) @statement.outer)
((parameter_list
"," @_start
.
(parameter_declaration) @parameter.inner)
(#make-range! "parameter.outer" @_start @parameter.inner))
((parameter_list
.
(parameter_declaration) @parameter.inner
.
","? @_end)
(#make-range! "parameter.outer" @parameter.inner @_end))
((argument_list
"," @_start
.
(_) @parameter.inner)
(#make-range! "parameter.outer" @_start @parameter.inner))
((argument_list
.
(_) @parameter.inner
.
","? @_end)
(#make-range! "parameter.outer" @parameter.inner @_end))
(number_literal) @number.inner
(declaration
declarator: (init_declarator
declarator: (_) @assignment.lhs
value: (_) @assignment.rhs) @assignment.inner) @assignment.outer
(declaration
type: (primitive_type)
declarator: (_) @assignment.inner)
(expression_statement
(assignment_expression
left: (_) @assignment.lhs
right: (_) @assignment.rhs) @assignment.inner) @assignment.outer