1c-syntax / bsl-language-server

Реализация Language Server Protocol для языка 1C (BSL)
https://1c-syntax.github.io/bsl-language-server
Other
302 stars 105 forks source link

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

Open asosnoviy opened 2 years ago

asosnoviy commented 2 years ago

Диагностика

UnusedLocalVariable

Версия

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

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

Пример кода


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

Скриншоты

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

nixel2007 commented 2 years ago

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

asosnoviy commented 2 years ago

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

artbear commented 2 years ago

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

asosnoviy commented 2 years ago

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

artbear commented 2 years ago

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

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

artbear commented 2 years ago

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

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

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

  • Значение = Значение
qtLex commented 2 years ago

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

artbear commented 2 years ago

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

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

минусы

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

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