bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

DRAFT Правило LostVariable - Затираемая\скрываемая переменная

Open artbear opened this issue 3 years ago • 9 comments

Описание

  • реализация правила
  • типизированный метод 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
  • на внутреннем Сонаре Инфостарт правило работает уже в течение нескольких месяцев

artbear avatar Jun 19 '22 12:06 artbear

Упал шаг javadoc на обращении к https://javadoc.io/ - остальные шаги отработали верно.

artbear avatar Jun 19 '22 12:06 artbear

В шапку добавил

  • типизированный метод Trees::getRootNode
  • Метод Trees::findNodeSuchThat
  • ускорен метод ReferenceIndex::getReferencesTo(SourceDefinedSymbol symbol)

artbear avatar Jun 23 '22 20:06 artbear

FP 1

<Для Каждого ТабличнаяЧасть Из СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
    Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
        Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
            СтрокаТабличнойЧасти = Параметры.Объект[ТабличнаяЧасть.Имя].Найти(Ссылка, Реквизит.Имя);
            Пока СтрокаТабличнойЧасти <> Неопределено Цикл
                СтрокаТабличнойЧасти[Реквизит.Имя] = ПравильныйЭлемент;
// выдается ошибка ниже
                СтрокаТабличнойЧасти = Параметры.Объект[ТабличнаяЧасть.Имя].Найти(Ссылка, Реквизит.Имя);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

image

artbear avatar Nov 30 '22 13:11 artbear

Еще FP 2

  • на атрибуты объектов
  • на реквизиты форм

к сожалению, пока эту проблему простым способом не порешать

artbear avatar Nov 30 '22 13:11 artbear

Еще FP 2

  • на атрибуты объектов
  • на реквизиты форм

к сожалению, пока эту проблему простым способом не порешать

варианты решения

  • или проверять только те модули, в которых нет обращения к подобным атрибутам\реквизитам
  • или сделать спец.флаг для того, чтобы пользователи могли выбирать - проверять все модули, но с ФП на этих объектах, или проверять только модули без атрибутов\реквизитов
  • или проверять атрибуты\реквизиты в правиле, т.к. они доступны через мдклассы

artbear avatar Nov 30 '22 13:11 artbear

FP 3

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

image

artbear avatar Nov 30 '22 14:11 artbear

На некоторых конфигурациях падает, т.к. в методе могут быть несколько методов с одним названием, которые находятся внутри разных блоков препроцессора например,

#Если НЕ МобильныйАвтономныйСервер Тогда
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
  // код
КонецПроцедуры
#Иначе
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
  // код
КонецПроцедуры
#КонецЕсли

ошибка

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)

artbear avatar Jan 14 '23 13:01 artbear