Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

При использовании строгой типизации IDE не сигнализтрует о неправильных типах аргументов при вызове функции/процедуры #913

Closed
RedMammoth opened this issue Jan 7, 2022 · 5 comments · Fixed by #968
Assignees
Labels
bsl 1C Built-in Script Language bug Something isn't working strict-types Система строгой типизации

Comments

@RedMammoth
Copy link
Contributor

Описание ошибки

Если я включаю в модуле режим строгой типизации, то при вызове процедур/функций ide не проверяет соответствие типов передаваемых аргументов

Как воспроизвести

  1. Создать общий модуль
  2. Включить строгую типизации
  3. Создать процедуру с одним аргументом
  4. Задать тип аргумента, например, Число
  5. Создать второй модуль
  6. Включить в нём строгую типизацию
  7. Создать в нём процедуру, в теле которой есть вызов процедуры первого модуля, но в качестве аргумента передать объект отличного типа, напоимер, строку
  8. IDE никак не сигнализирует передачу объекта неправильного типа

Скриншоты

Screenshot_2022-01-07-10-30-47-337_com microsoft rdc androidx

Ожидаемое поведение

IDE выдаёт предупреждение, а лучше ошибку в месте передачи в функцию/процедуру объекта неправильного типа.

Лог рабочей области

Версия 1С:Code style V8

0.2.0.114

Версия 1С:EDT

2021.2.12, 2021.3.0

Операционная система

Linux

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

No response

@RedMammoth RedMammoth added the bug Something isn't working label Jan 7, 2022
@RedMammoth
Copy link
Contributor Author

Не знаю как быть со структурами. На мой взгляд нужно проверять наличие всех ключей (и правильность типов значений), определённых в описании аргумента вызываемой процедуры/функции.

@marmyshev
Copy link
Collaborator

На мой взгляд нужно проверять наличие всех ключей

Я тоже думал на эту тему. Но тут не всё так просто! Вот у тебя есть процедура (экспортная!!!) которая принимает на вход общую структуру без описания полей, универсально обрабатывает и передаёт ее дальше в другу процедуру в которой уже описаны поля. Проконтролировать поля структуры уже будет невозможно т.к. тип общий на входе первой экспортной процедуры без полей, а выше по стеку возможно всё правильно даже сформировано... но в этом месте мы об этом не узнаем...

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

Короче, я на такую не решился сразу, но надо ещё раз обдумать.

Есть аргументы ещё за или против проверки полей типа (Структура, ТЗ, Массив итд)?

@RedMammoth
Copy link
Contributor Author

Мне кажется надо исходить из философии строгой типизации. Если её философия избавляться от неожиданностей в рантайме, когда мы передаем не тот объект, под который разрабатывали функцию, то сценарий когда мы общую структуру передаем в функцию, ожидающую на вход конкретную структуру, не подойдёт, т. к. можем в рантайме словить, как минимум, ошибку "поле объекта не обнаружено", а может и не словим явной ошибки, но логика приложения не отработает так как нужно и будут более неприятные последствия.
Если же делаем строгую проверку, тогда у разработчика должна быть возможность написать/использовать функцию, аналогию каста, которая без лишних затрат будет гарантировать, что моя общая структура соответсвует частной структуре. Так как сейчас работает с простыми типами: оборачиваю общее значение в условие типзнч() = тип() и внутри ветви уже могу вызывать методы с частным типом. Но с этим уже проблема, потому что в случае структуры, анализатору кода уже будет сложно понять, что я гарантирую. Разве что попробовать пойти в сторону ssl- support и в БСП написать функцию, которая будет проверять общую структуру на соответствие частной, а разработчику также оборачивать в блок если.

@RedMammoth
Copy link
Contributor Author

Правда не хорошо привязываться к БСП

@DoublesunRUS
Copy link
Contributor

DoublesunRUS commented Jan 12, 2022

Если мы передаем структуру, то нужно жестко проверять что структура создана той же функцией конструктором, что и в указанном параметре. Иначе выдавать ошибку.
Не нужно пытаться какую-то универсальную структуру преобразовать в частную.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bsl 1C Built-in Script Language bug Something isn't working strict-types Система строгой типизации
Projects
None yet
3 participants