Как сделать запрос без учета регистра в tree-sitter

Я пытаюсь создать и использовать древовидную грамматику на языковом сервере, который я реализую, чтобы поддерживать такие функции, как поиск всех ссылок на переменную. Учитывая грамматику, я мог бы написать запрос, чтобы найти все ссылки на переменную с определенным именем (например). Однако язык, на котором я пишу языковой сервер, использует переменные, нечувствительные к регистру (например, на него можно ссылаться как MYVAR, MyVaR, myvar, так далее.).

Как я могу написать древовидный запрос для соответствия шаблону, в котором токен должен без учета регистра совпадать с определенной строкой?

Я мог бы написать запрос, чтобы не фильтровать по имени переменной и реализовать свою собственную фильтрацию результатов, но мне было интересно, есть ли способ справиться с этим в самом запросе, а не реализовывать собственный код фильтрации.

Пример

Вот упрощенный пример, чтобы показать, что я имею в виду.

Учитывая следующую грамматику, я хочу запросить все set_statements которые устанавливают новое значение переменной.

      module.exports = grammar({
  name: 'mylang',

  rules: {
    source_file: $ => repeat($._statement),
    _statement: $ => choice(
      $.set_statement,
    ),
    set_statement: $ => seq(
      'set',
      field("variable", $.identifier),
      field("value", $._expression),
    ),
    _expression: $ => choice(
      $.integer_literal
    ),

    identifier: $ => /[a-zA-Z0-9]+/,
    integer_literal: $ => /[0-9]+/,
  }
});

Обычно я мог бы сделать это с помощью следующего запроса.

      (
    (set_statement
        variable: (identifier) @variable)
    (#eq? @variable "myVar")
)

Однако, как мы видим из следующего примера выполнения запроса, это касается только ссылок на myVar которые используют тот же регистр, что и запрос.

      $ cat set_testing.txt 
set myVar 0
set MYVAR 23
set myVar2 72
set MyVaR 14
$ tree-sitter query find_variable.query set_testing.txt
set_testing.txt
  pattern: 0
    capture: variable, start: (0, 4), text: "myVar"

Я хочу создать запрос, который вместо этого найдет:

      tree-sitter query find_variable.query set_testing.txt
set_testing.txt
  pattern: 0
    capture: variable, start: (0, 4), text: "myVar"
  pattern: 0
    capture: variable, start: (1, 4), text: "MYVAR"
  pattern: 0
    capture: variable, start: (3, 4), text: "MyVaR"

1 ответ

Решение

Измените свой запрос, чтобы он соответствовал регулярному выражению, соответствующему всем возможным комбинациям верхнего / нижнего идентификатора, в этом случае myvar.

Если вы измените find_variable.query на использование совпадения с регулярным выражением для всех комбинаций регистра:

      (
    (set_statement
        variable: (identifier) @variable)
    (#match? @variable "^[mM][yY][vV][aA][rR]$")
)

Сейчас работает tree-sitter query find_variable.query set_testing.txt возвращает:

      set_testing.txt
  pattern: 0
    capture: variable, start: (0, 4), text: "myVar"
  pattern: 0
    capture: variable, start: (1, 4), text: "MYVAR"
  pattern: 0
    capture: variable, start: (3, 4), text: "MyVaR"

Tree-sitter не поддерживает поиск по регулярным выражениям без учета регистра. Проблема № 261, поэтому регулярные выражения немного длиннее.

Другие вопросы по тегам