Repository navigation
feat(ide-diagnostics): быстрые исправления для устаревших Найти/ТекущаяДата, недопустимых символов и серверного экспорта в форме - #425
Merged
Conversation
…illegal characters and server form exports DeprecatedPlatformApi (deprecated global functions): - Найти -> СтрНайти: same two leading parameters and the same result, so the rename is safe for source.fixAll. Offered only where the replacement compiles: not when the configuration's compatibility mode hides СтрНайти (below 8.3.6), nor when the project's min_platform_version predates it. - ТекущаяДата -> ТекущаяДатаСеанса: manual. The two differ by time zone (the computer's local time vs the session's), so the edit may change a stored or compared value. InvalidCharacterInFile: replace the token's illegal characters (non-breaking space -> space, dashes -> "-", soft hyphen removed). Safe in whitespace and comments; manual in string literals and error tokens, where the program text or value changes. ServerSideExportFormMethod: remove "Экспорт" from the header, manual (a call through ЭтаФорма./ЭтотОбъект. compiles but fails at run time without it). The compatibility mode reaches diagnostics through a new AnalysisProvider::compatibility_mode (default None) and AnalysisContext::compatibility_mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Начата автоматическая приёмка — этот pull request взят в работу ИИ-агентом: |
added 6 commits
October 15, 2026 18:32
Перенос головы e252140 (flamber-dev/bsl-analyzer pr/diagnostic-quick-fixes) поверх origin/develop.
ТекущаяДатаСеанса нет на тонком и веб-клиенте, поэтому переименование ТекущаяДата не предлагается, если вызов компилируется в такую среду. Одноимённый метод модуля владеет голым вызовом — его не переименовываем.
…рять среду перехватчика Имя замены тоже может принадлежать методу модуля: после правки голый вызов уйдёт в него, а не в платформенную функцию. Перехватчик без своей директивы компилируется в базовую среду модуля, её нельзя подменять неизвестной.
…не терять среду директивы Строка // между частями многострочного литерала — текст строки, а не комментарий: замена символа в ней ручная. Неразобранный модульный #Если не должен затирать уже известную среду директивы.
…нировать серию // Неразрывный пробел в разделителе «Имя - Тип» под «Параметры:» прячет тип; безопасная замена его создаёт. Длинная серия комментариев не требует повторного прохода до границы строки.
Owner
|
🤖 Автоматическая приёмка завершена: изменения приняты, PR влит коммитом b4986a1. |
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у них пуст - правку приходится набирать руками:DeprecatedPlatformApiнаНайти(...)DeprecatedPlatformApiнаТекущаяДата()InvalidCharacterInFileServerSideExportFormMethodЭкспортИсправление
Исправления подключены тем же путём, что и в #324: заполняется
Diagnostic::fixes, флагsafe_for_fix_allрешает,войдёт ли правка в
source.fixAll.Найти->СтрНайти,Fix::safe, «Заменить на "СтрНайти"». По справке платформы у обеих функций одинаковыепервые два параметра (
Строка,ПодстрокаПоиска), поиск с учётом регистра и одинаковый результат (0 - не найдено,1 - пустая подстрока), остальные параметры
СтрНайтинеобязательны. Английское имя даётStrFind.Исправление НЕ предлагается там, где
СтрНайтине скомпилируется: режим совместимости конфигурации ниже 8.3.6(платформа прячет
СтрНайти, порог берётся изhir::compat_mode::hidden_global) илиmin_platform_versionпроектаниже версии, в которой функция появилась (
hir::min_platform::global_function). Сама диагностика в этих случаяхостаётся как есть - меняется только наличие исправления. Чтобы режим совместимости был виден диагностикам, в
AnalysisProviderдобавленcompatibility_mode()(по умолчаниюNone), вAnalysisContext- разобранныйcompatibility_mode(). Та же проверка стоит и наТекущаяДатаСеанса, хотя её сейчас ни один режим не прячет.ТекущаяДата->ТекущаяДатаСеанса,Fix::manual, «Заменить на "ТекущаяДатаСеанса" (время в часовом поясесеанса)». Функции отличаются часовым поясом:
ТекущаяДата()- местное время компьютера, на котором выполняется код,ТекущаяДатаСеанса()- время в часовом поясе сеанса. Замена может изменить записываемое или сравниваемое значение,поэтому в
source.fixAllона не входит, а пояснение вынесено в заголовок исправления.InvalidCharacterInFile, «Заменить недопустимые символы». Все недопустимые символы токена заменяются: неразрывныйпробел - на пробел, тире и знак минус - на
-, мягкий перенос (U+00AD) удаляется (он невидим, и превращать его в видимыйдефис значило бы менять текст). В пробелах и комментариях программа этого текста не видит -
Fix::safe. В строковомлитерале замена меняет значение (неразрывный пробел бывает ровно тем, что код ищет, например в
СтрЗаменить(Текст, " ", "")), а в токене ошибки меняет разбор строки - тамFix::manualс пометкой«(меняет текст программы)».
ServerSideExportFormMethod,Fix::manual, «Убрать "Экспорт"». Удаляется ключевое слово и пробелы перед ним на тойже строке; комментарий после него остаётся.
Исправление ручное: вызов этого метода через
ЭтаФорма./ЭтотОбъект.после правки по-прежнему компилируется, нопадает при выполнении - платформа ищет метод объекта только среди экспортных.
Доказательство
Новый файл
crates/ide-diagnostics/tests/diagnostic_quick_fixes.rs(11 тестов, через публичныйfile_diagnostics): для каждой диагностики печатается заголовок исправления, флагfix_allи текст после примененияправки, либо
no fix. Файл скопирован в рабочую копиюdevelop(4467ba9) и прогнан там:Выдержки с
develop:Три теста, которые проходят и на
develop, - контрольные: они проверяют ОТСУТСТВИЕ исправления (режим совместимости8.3.5,
min_platform_version = 8.3.5) и отсутствие диагностики у клиентского экспорта. Наdevelopони зелёныетривиально, на ветке доказывают, что исправление не предлагается там, где замена не скомпилируется.
На ветке:
Проверка
cargo test -p ide-db -p ide-diagnostics --no-fail-fast:ide-diagnosticslib 2128 passed / 0 failed на обеихсторонах, плюс 11 новых на ветке.
ide-dblib 171 passed / 4 failed на обеих сторонах, список упавших совпадает(
database_impl_tests::an_external_root_binds_its_files_through_the_snapshot_not_the_disk,extension_metadata_substrate_reacts_to_common_module_and_document_edits,extension_metadata_substrate_rejects_wrong_adoption_target_and_own_namesake,per_file_lookups_serve_an_extension_only_project_from_its_chain- сравнение путей под Windows, к правке неотносятся).
cargo fmt --all --check: чисто.cargo clippy -p ide-db -p ide-diagnostics --all-targets: предупреждений нет ни наdevelop, ни на ветке.Вне этого PR
Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;дляDataExchangeLoading.UnusedLocalMethod.🤖 Generated with Claude Code