如何编写仅在存在导入时才匹配的 treesitter 查询

问题描述 投票:0回答:0

我使用 nvim 和

nvim-treesitter
,我想对 elixir 文件中的 SQL 字符串应用语法高亮。但只有当相应的 SQL 函数被导入时,因为我不想匹配任何名为
execute
的 'ol 函数。例如

defmodule Hello do
  use Ecto.Migration

  def up do
    print "hello"
    execute """
      alter table foo
        add constraint foo_pos check (foo > 0),
        add constraint bar_neg check (bar < 0)
      """
  end
end

在这里,查询:

(call 
  target: (identifier) @fn-name (#eq? @fn-name "execute")
  (arguments
    (string
      (quoted_content) @str)))

匹配字符串的正确部分,并且不会触发

print
例如

但这也匹配:

defmodule Bar do
  def execute(str) do
    # This is my own function named execute
  end

  def do_bar do
    execute "not a SQL string"
  end
end

我想写这样的东西:

(call
  target: (identifier) @defmodule-fn (#eq? @defmodule-fn "defmodule")
  (do_block
    (call
      target: (identifier) @use-fn (#eq? @use-fn "use")
      (arguments
        (alias) @alias (#eq? @alias "Ecto.Migration"))) 
    (call 
      target: (identifier) @fn-name (#eq? @fn-name "execute")
      (arguments
        (string
          (quoted_content) @str)))))

所以它只会开始匹配

execute
函数,只有当
use Ecto.Migration
出现在模块中时。

该代码同时匹配,

use Ecto.Migration
作为
@use-fn
execute
参数作为
@str
。不是我想要的。

对于这个模式匹配问题,我期待某种“和”逻辑运算符

附言另外,如果只有当我在相应的项目目录中启动 nvim 时才能添加注入,知道那会很棒。我可以使用本地

.nvimrc.lua
文件在项目启动时运行代码

elixir neovim treesitter
© www.soinside.com 2019 - 2024. All rights reserved.