Repository navigation
feat(ide): подсветка парных ключевых слов блоков и директив #Область - #431
Open
flamber-dev wants to merge 1 commit into
Open
flamber-dev wants to merge 1 commit into
flamber-dev wants to merge 1 commit into
Conversation
On a structural keyword textDocument/documentHighlight now answers the keywords of that one construct, the way an editor matches a bracket: Если/Тогда/ИначеЕсли/Иначе/КонецЕсли, Пока|Для|Для Каждого ... Цикл/ КонецЦикла, Попытка/Исключение/КонецПопытки, Процедура/КонецПроцедуры, Функция/КонецФункции and #Если/#ИначеЕсли/#Иначе/#КонецЕсли. A region directive answers itself and its balanced partner. English spellings share the token kinds and work the same way. Only a keyword standing in the construct node or one of its branch nodes counts, so nested constructs keep their own keywords. A construct left without its closing keyword, and a region marker without a partner, answer nothing. Identifiers keep the symbol highlight. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Начата автоматическая приёмка — этот pull request взят в работу ИИ-агентом: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что видит пользователь
Сейчас курсор на
Если,Цикл,Попытка,Процедураили#Областьне подсвечивает ничего:document_highlightsотвечает только на имя (идентификатор), а на ключевом слове возвращает пустой список. В длинном методе, где
КонецЕслистоит на два экрана ниже, найти конец блока можно только глазами по отступам.
После правки курсор на любом структурном слове конструкции подсвечивает все структурные слова этой одной конструкции -
как редактор подсвечивает парную скобку:
Подсвечиваются:
Если,Тогда,ИначеЕсли,Тогда,Иначе,КонецЕсливнешнего блока; курсор на вложенномЕслиподсвечивает только его тройку.
Какие пары
ЕслиЕсли,Тогда,ИначеЕсли(+ егоТогда),Иначе,КонецЕслиПокаПока,Цикл,КонецЦиклаДля ... ПоДля,Цикл,КонецЦиклаДля КаждогоДля,Каждого,Цикл,КонецЦиклаПопыткаПопытка,Исключение,КонецПопыткиПроцедура/ФункцияПроцедура/КонецПроцедуры,Функция/КонецФункции(в том числе под&НаСервереи т.п.)#Если#Если,Тогда,#ИначеЕсли(+ егоТогда),#Иначе,#КонецЕсли#Область#Областьи парная ей#КонецОбласти(и наоборот)Ответ одинаковый с любого слова конструкции, в том числе с закрывающего. Английские написания (
If/Then/ElsIf/Else/EndIf,While/Do/EndDo,Try/Except/EndTry,Procedure/EndProcedure,#If/#EndIf,#Region/#EndRegion) дают те же виды токенов и работают так же. Вид подсветки -Text.Исправление
Метод LSP -
textDocument/documentHighlight; обработчик вbsl-analyzerне меняется, вся правка вcrates/ide/src/document_highlight.rs, до прежнего поиска символа:IF_STMT,WHILE_STMT,FOR_STMT,FOR_EACH_STMT,TRY_STMT,PROCEDURE_DEF,FUNCTION_DEF,PRE_IF_DIR) или в его узле-ветке(
ELSIF_CLAUSE,ELSE_CLAUSE,EXCEPT_CLAUSE,PRE_ELSIF_CLAUSE,PRE_ELSE_CLAUSE). Собираются слова из набора этойконструкции только с этих двух уровней, поэтому вложенные конструкции в ответ не попадают, а то же слово в другой
позиции (например, в узле ошибки разбора) не считается структурным и уходит в прежнюю ветку поиска символа.
#Область/#КонецОбласти- плоские маркеры, не контейнеры (см.grammar::preprocessor_region), поэтому паравосстанавливается стеком в порядке исходного текста - так же, как её строит
hir-def::region_tree. Своё сопоставление,а не
RegionTree, потому что дерево областей не хранит безымянные#Область, а пару нужно найти и для них.пустым списком: половина пары указывала бы на конец блока, которого нет.
Единственный существующий тест, который менялся:
no_symbol_returns_empty_highlightsставил курсор наПроцедураиждал пустой ответ - теперь там законная пара, курсор перенесён на
(, смысл теста (нет символа - нет подсветки)сохранён.
Доказательство
Новый файл
crates/ide/tests/document_highlight_paired_keywords.rs(через публичныйAnalysis::document_highlights,полное сравнение списка
(строка, текст); в каждом входе рядом стоит вложенная конструкция того же вида):if_keywords_light_every_branch_but_not_the_nested_if- курсор на каждом из шести слов внешнегоЕслидаёт один и тотже ответ; вложенный
Если- только свою тройку, в том числе сКонецЕсли;keyword_highlights_are_text_kind- вид подсветкиText;loop_keywords_pair_with_their_end_do-Для Каждого/Для ... По/Пока, вложенные друг в друга, каждыйс начала и с
КонецЦикла;try_keywords_pair_and_skip_the_nested_try- внешний и вложенныйПопытка, курсор наИсключение/КонецПопытки;method_keywords_pair_under_an_annotation-&НаСервере Функция ... КонецФункциисЕсливнутри, затем процедура;nested_regions_pair_with_the_balanced_partner- внешняя область и две вложенные: с каждого конца пара - сбалансированныйпартнёр, а не ближайший маркер;
preprocessor_if_lights_its_branches_not_the_code_inside-#Если/#ИначеЕсли/#Иначе/#КонецЕсливокруг процедуры сЕсли: ответ с каждой директивы и с еёТогдане задевает код внутри;ТогдаобычногоЕсливнутри - его тройка;english_keywords_pair_like_russian_ones-If,While,Try,Procedure,#If,#Region;identifier_inside_a_block_keeps_its_symbol_highlight- контроль: идентификатор внутри блока подсвечивается как раньше(
Textна объявлении,Writeна присваивании);unfinished_pairs_answer_nothing- контроль:ЕслибезКонецЕсли,#Областьбез пары, лишняя#КонецОбласти,процедура без
КонецПроцедуры- пустой ответ, без паники.Тесты лежат отдельным интеграционным файлом, чтобы их можно было прогнать на
developбез правки.На
develop(34a3fba), только тесты:На
developпроходят только два контрольных теста -identifier_inside_a_block_keeps_its_symbol_highlightиunfinished_pairs_answer_nothing.На ветке:
Проверка
cargo test -p ide --no-fail-fast: списки упавших тестов наdevelopи на ветке совпадают, кроме 8 новых тестов,которые падают только на
develop(9 упавших на ветке, все из-за окружения Windows:graph::tests::method_graph_id_*,name_lookup::tests::the_address_phases_observe_a_cancelled_request,a_self_qualified_call_*и соседние с ними);на ветке 1342 прошедших против 1334 на
develop.cargo fmt -p ide --check: чисто.cargo clippy -p ide --all-targets: замечаний поideнет ни наdevelop, ни на ветке.Вне рамок
#Вставка/#КонецВставкии#Удаление/#КонецУдаления(расширения) - не подсвечиваются; их легко добавить тем жеспособом, если нужно.
ПовДля ... По,ИзвДля Каждого ... Из,Асинхперед методом,Возврат/Прервать/Продолжитьвнутриблока в пару не входят.
#Еслиоткрывается внутриЕсли, аИначеЕслистоит внутри области#Если: ответследует дереву разбора как есть, отдельной обработки нет.
Тогда/Цикл, которые разбор восстановил в узел ошибки, - пустой ответ, как раньше.🤖 Generated with Claude Code