Update locals with support for deep pattern matches

This commit is contained in:
Connor Lay (Clay) 2021-10-06 22:11:09 -07:00 committed by Stephan Seitz
parent 259e3f6e64
commit 1413f62c88
2 changed files with 66 additions and 75 deletions

View file

@ -19,6 +19,9 @@
"%" "%"
] @punctuation.special ] @punctuation.special
; Parser errors
(ERROR) @error
; Identifiers ; Identifiers
(identifier) @variable (identifier) @variable
@ -201,7 +204,7 @@
quoted_end: _ @comment) @comment quoted_end: _ @comment) @comment
(boolean) @comment (boolean) @comment
])) ]))
(#any-of? @_identifier "moduledoc" "typedoc" "doc")) (#any-of? @_identifier "moduledoc" "typedoc" "shortdoc" "doc"))
; Sigils ; Sigils
(sigil (sigil
@ -220,5 +223,3 @@
((sigil_modifiers) @string)? ((sigil_modifiers) @string)?
(#any-of? @_sigil_name "s" "S")) @string (#any-of? @_sigil_name "s" "S")) @string
; Parser errors
(ERROR) @error

View file

@ -1,80 +1,70 @@
[ ; Scopes
(after_block) (call (do_block)) @scope
(catch_block) (stab_clause) @scope
(do_block)
(stab_expression)
(rescue_block)
] @scope
; References
(identifier) @reference (identifier) @reference
(alias) @reference
; Module Definitions
(call (call
function: (function_identifier) @_call-name target: ((identifier) @_identifier (#eq? @_identifier "defmodule"))
(module) @definition.type (arguments (alias) @definition.type))
(#eq? @_call-name "defmodule"))
; Function definition without arguments ; Local Function Definitions
(call (function_identifier) @_call-name ; TODO: add support for test blocks
(identifier) @definition.function ; test "foo", %{conn: conn} do
(#any-of? @_call-name "def" "defp" "defguard" "defguardp")) (call
target: ((identifier) @_identifier (#any-of? @_identifier "def" "defp" "defmacro" "defmacrop" "defguard" "defguardp" "defn" "defnp" "for"))
(arguments [
(identifier) @definition.function
(binary_operator left: (identifier) @definition.function)
(call target: (identifier) @definition.function (arguments [
(identifier) @definition.parameter
(_ (identifier) @definition.parameter)
(_ (_ (identifier) @definition.parameter))
(_ (_ (_ (identifier) @definition.parameter)))
(_ (_ (_ (_ (identifier) @definition.parameter))))
(_ (_ (_ (_ (_ (identifier) @definition.parameter)))))
(_ (_ (_ (_ (_ (_ (identifier) @definition.parameter))))))
(_ (_ (_ (_ (_ (_ (_ (identifier) @definition.parameter)))))))
]))
]?) (#set! definition.function.scope parent))
; Function definition with arguments ; Pattern Match Definitions
(call (function_identifier) @_call-name (binary_operator left: [
(call (identifier) @definition.var
function: (function_identifier) @definition.function (_ (identifier) @definition.var)
(arguments (_ (_ (identifier) @definition.var))
[(identifier) @definition.parameter (_ (_ (_ (identifier) @definition.var)))
(tuple (identifier) @definition.parameter) (_ (_ (_ (_ (identifier) @definition.var))))
(list (identifier) @definition.parameter) (_ (_ (_ (_ (_ (identifier) @definition.var)))))
(_ (_ (_ (_ (_ (_ (_ (identifier) @definition.var))))))
(keyword_list (identifier) @definition.parameter)) (_ (_ (_ (_ (_ (_ (_ (identifier) @definition.var)))))))
(binary_op ] operator: "=")
left: (identifier) @definition.parameter
operator: "\\\\")]))
(#any-of? @_call-name "def" "defp"))
; Function definition with (some) arguments and guard(s) ; Stab Clause Definitions
(call (function_identifier) @_call-name (stab_clause left: [
(binary_op (_ (identifier) @definition.var)
left: (_ (_ (identifier) @definition.var))
(call (_ (_ (_ (identifier) @definition.var)))
function: (function_identifier) @definition.function (_ (_ (_ (_ (identifier) @definition.var))))
(arguments (_ (_ (_ (_ (_ (identifier) @definition.var)))))
[(identifier) @definition.parameter (_ (_ (_ (_ (_ (_ (identifier) @definition.var))))))
(tuple (identifier) @definition.parameter) (_ (_ (_ (_ (_ (_ (_ (identifier) @definition.var)))))))
(list (identifier) @definition.parameter) ])
(_
(keyword_list (identifier) @definition.parameter))]))
operator: "when")
(#any-of? @_call-name "def" "defp" "defguard" "defguardp"))
; Variable assignment and simple pattern matching ; Aliases
(binary_op (call
left: target: ((identifier) @_identifier (#any-of? @_identifier "require" "alias" "use" "import"))
[(identifier) @definition.var (arguments [
(tuple (identifier) @definition.var) (alias) @definition.import
(list (identifier) @definition.var) (_ (alias) @definition.import)
(_ (_ (_ (alias) @definition.import))
(keyword_list (identifier) @definition.var))] (_ (_ (_ (alias) @definition.import)))
operator: "=") (_ (_ (_ (_ (alias) @definition.import))))
(_ (_ (_ (_ (_ (alias) @definition.import)))))
; Simple stab expression (ex. case pattern matching) without guard(s) (_ (_ (_ (_ (_ (_ (alias) @definition.import))))))
(stab_expression (_ (_ (_ (_ (_ (_ (_ (alias) @definition.import)))))))
left: ]
(bare_arguments ))
[(identifier) @definition.var
(tuple (identifier) @definition.var)
(list (identifier) @definition.var)
(_
(keyword_list (identifier) @definition.var))]))
; Simple stab expression (ex. case pattern matching) with guard(s)
(stab_expression
left:
(bare_arguments
(binary_op
left: [(identifier) @definition.var
(tuple (identifier) @definition.var)
(list (identifier) @definition.var)
(_
(keyword_list (identifier) @definition.var))])))