OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

[BUG] При загрузке внешней компоненты не объявляются имена перечислений

Open yukon39 opened this issue 4 years ago • 6 comments

Опишите ошибку При загрузке внешней компоненты нельзя задать в коде значение перечисления, выдается исключение: Неизвестный символ: <ИмяПеречисления>. При этом уже присвоенные значения имеют корректный тип:

ModuleId.ModuleType: ConfigModule
TypeOf(ModuleId.ModuleType): CoverageModuleType
CoverageModuleType.ConfigModule: Неизвестный символ: CoverageModuleType

Окружение

  • ОС: Windows 10 21H1 x64
  • CLR: 4.0.30319.0
  • Версия: 1.6.0.213 x64

yukon39 avatar Jun 10 '21 07:06 yukon39

А можно пример компоненты и скрипт, которым грузим? Судя по коду - должно подключаться

EvilBeaver avatar Jun 10 '21 10:06 EvilBeaver

Да, я тоже посмотрел по коду, что перечисления должны подключаться.

Конечно: компонента https://github.com/yukon39/CoverageBSL Код bug.os:

AttachAddIn("src\CoverageBSL.AddIn\bin\Debug\net48\CoverageBSL.AddIn.dll");
ConfigModule = CoverageModuleType.ConfigModule;

Исключение: {Модуль D:\GitHUB\yukon39\CoverageBSL\src\CoverageBSL.os\bug.os / Ошибка в строке: 2,35 / Неизвестный символ: CoverageModuleType}

yukon39 avatar Jun 10 '21 12:06 yukon39

Или чистый пример: https://t.me/oscript_library/42515

yukon39 avatar Jun 10 '21 12:06 yukon39

Пример воспроизведения (Из того самого сообщения выше): bug.zip

asosnoviy avatar Jun 10 '21 12:06 asosnoviy

Пример воспроизведения в свою очередь содержит ошибку: BugEnum.cs

        [EnumItem("EnumValue")] // <--- или здесь BugValue
        EnumValue

bug.os

BugValue = BugEnum.BugValue; // <--- или здесь EnumValue

Mr-Rm avatar Sep 23 '22 11:09 Mr-Rm

По существу issue:

  • перечисления из загруженных библиотек действительно подключаются, но не передаются в MachineInstance (несложно исправить);
  • такое исправление всё равно не поможет, т.к. обращения к перечислениям вида ConfigModule = CoverageModuleType.ConfigModule; обрабатываются как ошибочные еще при компиляции, а не после запуска скрипта. Работающий вариант будет ConfigModule = eval(CoverageModuleType.ConfigModule);. Перечисления из внешних компонент, загружаемые из библиотек, подключаемых через #Использовать (см. https://github.com/EvilBeaver/OneScript/issues/1147#issuecomment-1000918931) также будут работать.
  • возможно изменение компилятора, которое позволит использовать подключаемые перечисления напрямую, но тогда ошибки в скрипте при обращении к свойствам объекта, например
Массив = Новый Массив();
К = Масив.Количество;

будут выявляться только в рантайме, а не при компиляции. Это худший вариант. Отслеживать обращения к функции AttachAddIn - вообще не вариант.

Mr-Rm avatar Sep 23 '22 11:09 Mr-Rm