bsl-language-server
bsl-language-server copied to clipboard
[FN] UnusedLocalVariable после вставки в структуру
Диагностика
UnusedLocalVariable
Версия
Описание ложного НЕ срабатывания диагностики
Создана структура, в нее добавлены ключи, но структура никуда не передана
Пример кода
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("Проблема", Проблема);
ПараметрыПроцедуры.Вставить("ПараметрыПроверки", ПараметрыПроверки);
Скриншоты
Дополнительная информация
Тут прям сложно... Надо понимать, что это именно структура, что при вставке значений нет побочных эффектов от вызовов методов...
Да здравствует выведение типов! https://github.com/1c-syntax/bsl-language-server/issues/269
Сводная задача по "потерянным" переменным https://github.com/1c-syntax/bsl-language-server/issues/1088
Мысль где то в недрах референс индекса помечать "самоиспользование".
Да, проверка самоиспользования внутри реф-индекса будет очень полезной.
без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи
- Значение = Значение
@qtLex что скажешь?
Да, проверка самоиспользования внутри реф-индекса будет очень полезной.
без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи
- Значение = Значение
@qtLex что скажешь?
Да, проверка самоиспользования внутри реф-индекса будет очень полезной. без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи
- Значение = Значение
Чтоб хранить признак "самоиспользование", нужно понять что такое "самоиспользование". Только присвоение самой себе или любое использование значения переменной при инициализации нового значения?
Мне добавление признака кажется очень сомнительным.
- Работать он будет только для локальных переменных. Для реквизитов, глобальных переменных, параметров функций обновление значения на основе предыдущего значения может быть обусловлено логикой. А хранить в символе признак используемый только для одного вида переменных кажется плохим решением.
- Диагностика с потерянными переменными будет сильно завязана на контекст.
Лучше реализовать утилити метод определяющий, что является ли конкретное присваивание самоиспользованием. А находить такие определения уже через референс индекс.
Примеры где необходим контекст для определения
Значение = Значение;
Тут вроде все понятно. Присваиваем переменную саму себе. Лишнее действие. Но на это уже есть диагностика.
Значение = Действие();
Значение = Действие();
Тут тоже вроде понятно. Дважды одно значение
Значение = Значение + 1;
Тут уже сложнее. Будет ли это ошибкой или нет сильно зависит от контекста. Это может быть глобальная переменная. Может что-то считать в цикле.
Значение = Действие(Значение);
Значение = Действие2(Значение);
Такое написание нам диктует стандарт запрещающий вложенные методы.
Я на днях реализовал 2 правила
- https://github.com/1c-syntax/bsl-language-server/pull/2810 (готово)
- https://github.com/1c-syntax/bsl-language-server/issues/1088 (заканчиваю)
в обоих случаях мне понадобилось различать
- самоприсвание
Значение = Значение; - самоприсваивание с переиспользованием -
Значение = ЛюбоеВыражениеВКоторомЕстьЗначение; - использование идет уже после присваивания
Значение = 10; ЛюбоеВыражениеВКоторомЕстьЗначение...;
минусы
- пока приходится дублировать код
- главный минус в том, что нужно повторно бегать по дереву и определять каждый из этих признаков
по опыту написания различных хитрых правил я знаю, что подобные проверки часто приходится повторять
- например, в правиле для ЖР, СтрШаблон и т.п.
т.е. было бы хорошо, чтобы была возможность определения указанных признаков связи определения и использовния
- и кажется, что эти признаки не зависят от вида переменной