Repository navigation
feat(ide-diagnostics): быстрые исправления для DataExchangeLoading и UnusedLocalMethod - #427
Merged
Merged
Conversation
…LocalMethod DataExchangeLoading: insert "Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;" (or "If DataExchange.Load Then Return; EndIf;" in an English handler) as the first statement, after the local Перем declarations, indented like the body and using the file's line breaks. Manual: the handler stops running its logic during data exchange. UnusedLocalMethod: delete the method with its compilation directive, the doc comment directly above it and the rest of its closing line; one blank line below goes too when a blank line stays above. Manual: the method may still be reached by name from a string. Not offered at all when the name appears as a whole identifier in a string literal of the module. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Начата автоматическая приёмка — этот pull request взят в работу ИИ-агентом: |
…io/accept-pr-427
…directives The DataExchangeLoading guard went above a leading `#Область`/`#Если`, i.e. before the local `Перем` declarations it must follow; it now goes before the first top-level statement past the last declaration, and is not offered when declarations share a directive with statements. The UnusedLocalMethod deletion took the byte order mark for code on line 1, so a method or doc comment on the first line of a BOM file kept its comment or got no fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… body statement The guard position took the end of every `Перем` in the body, at any depth, and the first top-level node after it. A `Перем` nested in an ordinary block pushed the guard past that block, and a `#Если` holding declarations and statements was skipped in favour of a later statement, so code ran before the check. Only declarations at the level of the body (directly or through `#Если` branches) now bound the guard; when the first statement starts before the last of them, no fix is offered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Автоматическая приёмка завершена: изменения приняты, PR влит коммитом 2adc8f1. |
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.
Проблема
Две диагностики точно называют, что сделать, но
fixesу них пуст:DataExchangeLoadingЕсли ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;в начало обработчикаUnusedLocalMethodЭто продолжение #425 (там исправления для
DeprecatedPlatformApi,InvalidCharacterInFileиServerSideExportFormMethod); PR независимы, ветка этого основана наdevelop, общих строк с #425 нет.Исправление
Механизм тот же, что в #324 и #425: заполняется
Diagnostic::fixes, оба исправления -Fix::manual, вsource.fixAllне входят.DataExchangeLoading, «Добавить проверку ОбменДанными.Загрузка». Проверка вставляется первым операторомобработчика - после локальных
Перем(они обязаны стоять до любого оператора), с отступом тела. Единицавложенного отступа - табуляция, если тело отступлено табуляцией (или не отступлено вовсе), иначе отступ самого
тела. Перевод строки берётся из файла (CRLF сохраняется). Для обработчика на английском синтаксисе вставляется
If DataExchange.Load Then Return; EndIf;.Пустой обработчик получает проверку с отступом в одну табуляцию. Если первый оператор стоит на одной строке с
заголовком или с другим оператором, своей строки для вставки нет - исправление не предлагается.
Почему ручное: при обмене данными обработчик после правки перестаёт выполнять свою логику. Именно этого
требует стандарт, но это изменение поведения, которое автор должен принять сам (бывает, что часть логики обязана
отработать и при загрузке - тогда проверку ставят ниже).
UnusedLocalMethod, «Удалить неиспользуемый метод "X"». Удаляется весь метод вместе с директивойкомпиляции (она входит в узел метода), с комментарием-описанием непосредственно над ним (строки
//,занимающие свою строку, без пустой строки между ними и методом) и с остатком строки
КонецПроцедуры/КонецФункции(хвостовой комментарий, перевод строки). Если над удаляемым блоком пустая строка (или началофайла), удаляется и одна пустая строка под ним - чтобы не осталось двух пустых строк подряд; если над ним код,
пустая строка под ним остаётся разделителем.
Почему ручное: удаление необратимо, а метод может вызываться по имени из строки, которую анализ не видит
(
Выполнить, обработчик, подключённый по имени из другого модуля). Поэтому исправление не предлагается вовсе,если имя метода встречается как целый идентификатор в любом строковом литерале модуля (
Выполнить("Пересчитать()")).Сама диагностика при этом остаётся как на
develop. Имя внутри более длинного идентификатора(
"ПересчитатьВсё"для методаПересчитать) исправлению не мешает. Обработчики, которые диагностика ужераспознаёт (
ОписаниеОповещения,ПодключитьОбработчикОжидания, привязки событий формы,УстановитьДействиеи т.д.), диагностику не получают - и исправления тоже.
Доказательство
Новый файл
crates/ide-diagnostics/tests/data_exchange_and_unused_method_fixes.rs(13 тестов, через публичныйfile_diagnostics, модуль объекта справочника и общий модуль): для каждой диагностики печатается заголовокисправления, флаг
fix_allи текст после применения правки, либоno fix. Файл скопирован в рабочую копиюdevelop(4467ba9) и прогнан там:Выдержки с
develop:Три теста, которые проходят и на
develop, - контрольные: обработчик с проверкой не получает диагностику;метод, названный в
ОписаниеОповещения, не получает диагностику; метод, названный в строкеВыполнить(...),получает диагностику без исправления. На
developони зелёные тривиально, на ветке доказывают, чтоисправление не появляется там, где его быть не должно.
На ветке:
Проверка
cargo test -p ide-diagnostics --no-fail-fast: lib 2128 passed / 0 failed / 72 ignored на обеих сторонах, всеинтеграционные тесты зелёные на обеих сторонах (списки упавших пусты и совпадают); на ветке плюс 13 новых.
cargo fmt --all --check: чисто.cargo clippy -p ide-diagnostics --all-targets: предупреждений нет ни наdevelop, ни на ветке.git merge-tree --write-tree- код 0).Вне этого PR
просто не предлагается, если имя есть в строке этого модуля; иначе оно ручное).
🤖 Generated with Claude Code