bsl-language-server
bsl-language-server copied to clipboard
DRAFT Правило LostVariable - Затираемая\скрываемая переменная
Описание
- реализация правила
- типизированный метод Trees::getRootNode
- Метод Trees::findContextContainsPosition
- Метод Trees::findNodeSuchThat
- ускорен метод ReferenceIndex::getReferencesTo(SourceDefinedSymbol symbol) .
- проверено на БСП 3.1, 3.0, КА 2.5
Учтены кейсы из исходной задачи
- 0
- 1
- 3 (частично?)
- 4 Есть FP, смотреть комментарии
Связанные задачи
Closes #1088
Чеклист
Общие
- [x] Ветка PR обновлена из develop
- [x] Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
- [x] Изменения покрыты тестами
- [x] Обязательные действия перед коммитом выполнены (запускал команду
gradlew precommit)
Для диагностик
- [x] Описание диагностики заполнено для обоих языков (присутствуют файлы для обоих языков, для русского заполнено все подробно, перевод на английский можно опустить)
Дополнительно
- проверено на БСП 3.1, 3.0, КА 2.5
- на внутреннем Сонаре Инфостарт правило работает уже в течение нескольких месяцев
Упал шаг javadoc на обращении к https://javadoc.io/ - остальные шаги отработали верно.
В шапку добавил
- типизированный метод Trees::getRootNode
- Метод Trees::findNodeSuchThat
- ускорен метод ReferenceIndex::getReferencesTo(SourceDefinedSymbol symbol)
FP 1
<Для Каждого ТабличнаяЧасть Из СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
СтрокаТабличнойЧасти = Параметры.Объект[ТабличнаяЧасть.Имя].Найти(Ссылка, Реквизит.Имя);
Пока СтрокаТабличнойЧасти <> Неопределено Цикл
СтрокаТабличнойЧасти[Реквизит.Имя] = ПравильныйЭлемент;
// выдается ошибка ниже
СтрокаТабличнойЧасти = Параметры.Объект[ТабличнаяЧасть.Имя].Найти(Ссылка, Реквизит.Имя);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;

Еще FP 2
- на атрибуты объектов
- на реквизиты форм
к сожалению, пока эту проблему простым способом не порешать
Еще FP 2
- на атрибуты объектов
- на реквизиты форм
к сожалению, пока эту проблему простым способом не порешать
варианты решения
- или проверять только те модули, в которых нет обращения к подобным атрибутам\реквизитам
- или сделать спец.флаг для того, чтобы пользователи могли выбирать - проверять все модули, но с ФП на этих объектах, или проверять только модули без атрибутов\реквизитов
- или проверять атрибуты\реквизиты в правиле, т.к. они доступны через мдклассы
FP 3
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ПервуюПропускаем Тогда
ПервуюПропускаем = Ложь; // тут FP
Продолжить;
КонецЕсли;
Если ВыборкаДетальныеЗаписи.НеобходимоОбновить Тогда
МассивБазКонфигурации.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЕсли;
КонецЦикла;

На некоторых конфигурациях падает, т.к. в методе могут быть несколько методов с одним названием, которые находятся внутри разных блоков препроцессора например,
#Если НЕ МобильныйАвтономныйСервер Тогда
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// код
КонецПроцедуры
#Иначе
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// код
КонецПроцедуры
#КонецЕсли
ошибка
File: file:///.../src/cf/Catalogs/Номенклатура/Ext/ManagerModule.bsl
Diagnostic: Either [
left = LostVariable
right = null
]
java.lang.IllegalStateException: Duplicate key ОбработкаПолученияПолейПредставления (attempted merging values [428 223] and [428 223])
at java.base/java.util.stream.Collectors.duplicateKeyException(Unknown Source)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Unknown Source)
at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
at com.github._1c_syntax.bsl.languageserver.diagnostics.LostVariableDiagnostic.lambda$getMethodContextsByMethodName$1(LostVariableDiagnostic.java:117)
at java.base/java.util.Optional.map(Unknown Source)
at com.github._1c_syntax.bsl.languageserver.diagnostics.LostVariableDiagnostic.getMethodContextsByMethodName(LostVariableDiagnostic.java:115)
at com.github._1c_syntax.bsl.languageserver.diagnostics.LostVariableDiagnostic.check(LostVariableDiagnostic.java:97)







