Как сделать запрос без учета регистра в 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, поэтому регулярные выражения немного длиннее.