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

[FN] UnusedLocalVariable после вставки в структуру

Open asosnoviy opened this issue 3 years ago • 8 comments

Диагностика

UnusedLocalVariable

Версия

Описание ложного НЕ срабатывания диагностики

Создана структура, в нее добавлены ключи, но структура никуда не передана

Пример кода


	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("Проблема", Проблема);
	ПараметрыПроцедуры.Вставить("ПараметрыПроверки", ПараметрыПроверки);

Скриншоты

Дополнительная информация

asosnoviy avatar May 26 '22 15:05 asosnoviy

Тут прям сложно... Надо понимать, что это именно структура, что при вставке значений нет побочных эффектов от вызовов методов...

nixel2007 avatar May 26 '22 15:05 nixel2007

Да здравствует выведение типов! https://github.com/1c-syntax/bsl-language-server/issues/269

asosnoviy avatar May 26 '22 15:05 asosnoviy

Сводная задача по "потерянным" переменным https://github.com/1c-syntax/bsl-language-server/issues/1088

artbear avatar May 27 '22 15:05 artbear

Мысль где то в недрах референс индекса помечать "самоиспользование".

asosnoviy avatar Jun 02 '22 08:06 asosnoviy

Да, проверка самоиспользования внутри реф-индекса будет очень полезной.

без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи

  • Значение = Значение

artbear avatar Jun 13 '22 17:06 artbear

@qtLex что скажешь?

Да, проверка самоиспользования внутри реф-индекса будет очень полезной.

без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи

  • Значение = Значение

artbear avatar Jun 13 '22 17:06 artbear

@qtLex что скажешь?

Да, проверка самоиспользования внутри реф-индекса будет очень полезной. без нее мне уже в 2х или 3х правилах пришлось костылить и самому писать код проверки самозаписи

  • Значение = Значение

Чтоб хранить признак "самоиспользование", нужно понять что такое "самоиспользование". Только присвоение самой себе или любое использование значения переменной при инициализации нового значения?

Мне добавление признака кажется очень сомнительным.

  1. Работать он будет только для локальных переменных. Для реквизитов, глобальных переменных, параметров функций обновление значения на основе предыдущего значения может быть обусловлено логикой. А хранить в символе признак используемый только для одного вида переменных кажется плохим решением.
  2. Диагностика с потерянными переменными будет сильно завязана на контекст.

Лучше реализовать утилити метод определяющий, что является ли конкретное присваивание самоиспользованием. А находить такие определения уже через референс индекс.

Примеры где необходим контекст для определения

Значение = Значение;

Тут вроде все понятно. Присваиваем переменную саму себе. Лишнее действие. Но на это уже есть диагностика.

Значение = Действие();
Значение = Действие();

Тут тоже вроде понятно. Дважды одно значение

Значение = Значение + 1;

Тут уже сложнее. Будет ли это ошибкой или нет сильно зависит от контекста. Это может быть глобальная переменная. Может что-то считать в цикле.

Значение = Действие(Значение);
Значение = Действие2(Значение);

Такое написание нам диктует стандарт запрещающий вложенные методы.

qtLex avatar Jun 13 '22 19:06 qtLex

Я на днях реализовал 2 правила

  • https://github.com/1c-syntax/bsl-language-server/pull/2810 (готово)
  • https://github.com/1c-syntax/bsl-language-server/issues/1088 (заканчиваю)

в обоих случаях мне понадобилось различать

  • самоприсвание Значение = Значение;
  • самоприсваивание с переиспользованием - Значение = ЛюбоеВыражениеВКоторомЕстьЗначение;
  • использование идет уже после присваивания Значение = 10; ЛюбоеВыражениеВКоторомЕстьЗначение...;

минусы

  • пока приходится дублировать код
  • главный минус в том, что нужно повторно бегать по дереву и определять каждый из этих признаков

по опыту написания различных хитрых правил я знаю, что подобные проверки часто приходится повторять

  • например, в правиле для ЖР, СтрШаблон и т.п.

т.е. было бы хорошо, чтобы была возможность определения указанных признаков связи определения и использовния

  • и кажется, что эти признаки не зависят от вида переменной

artbear avatar Jun 14 '22 07:06 artbear