Описание
Динамический Новый, где имя типа лежит в переменной, не компилируется в #native.
Наружу выходит необработанный System.ArgumentException из построителя деревьев
выражений: Expression of type 'OneScript.Values.BslValue' cannot be used for parameter of type 'System.String'.
В стековом режиме тот же код работает.
Воспроизведение
Один и тот же код в двух модулях, различаются ровно директивой #native.
Классы/СтековыйКласс.os:
Функция Создать(ИмяТипа) Экспорт
Возврат Новый(ИмяТипа);
КонецФункции
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Классы/НативныйКласс.os:
#native
Функция Создать(ИмяТипа) Экспорт
Возврат Новый(ИмяТипа);
КонецФункции
Процедура ПриСозданииОбъекта()
КонецПроцедуры
запуск.os:
#Использовать "."
Стек = Новый СтековыйКласс();
Сообщить("stack: " + ТипЗнч(Стек.Создать("Массив")));
Нат = Новый НативныйКласс();
Сообщить("native: " + ТипЗнч(Нат.Создать("Массив")));
Фактическое поведение
Стековый модуль отрабатывает. Нативный не компилируется:
{Модуль .../Классы/НативныйКласс.os / Error in line 4,2 / Error compiling static module
System.ArgumentException: Expression of type 'OneScript.Values.BslValue' cannot be used
for parameter of type 'System.String' of method 'OneScript.Values.BslValue ConstructorCall(
OneScript.Types.ITypeManager, OneScript.DependencyInjection.IServiceContainer, System.String,
OneScript.Execution.IBslProcess, OneScript.Values.BslValue[])' (Parameter 'arg2')
at System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arguments, ParameterInfo pi, String methodParamName, String argumentParamName, Int32 index)
at System.Linq.Expressions.Expression.Call(MethodInfo method, Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4)
at OneScript.Native.Compiler.ExpressionHelpers.ConstructorCall(ITypeManager typeManager, Expression services, Expression type, Expression process, Expression[] argsArray)
at OneScript.Native.Compiler.MethodCompiler.VisitNewObjectCreation(NewObjectNode node)
at OneScript.Language.SyntaxAnalysis.BslSyntaxWalker.<CreateVisitors>b__2_11(BslSyntaxNode x)
at OneScript.Language.SyntaxAnalysis.BslSyntaxWalker.DefaultVisit(BslSyntaxNode node)
Ожидаемое поведение
stack: Array
native: Array
То есть ConstructorCall должен принимать значение динамического типа и приводить его
к строке сам, как это делает стековый режим.
Если приведение к строке принципиально должно оставаться на стороне разработчика —
нужна нормальная ошибка компиляции с указанием на это, а не ArgumentException
из внутренностей построителя деревьев выражений: по текущему тексту совершенно
неочевидно, что делать.
Обход
Явное приведение компилируется и работает:
Возврат Новый(Строка(ИмяТипа));
Окружение
Воспроизводится одинаково на:
- 2.2.0, linux-x64
- 2.3.0-dev+6 (ночная сборка), linux-x64
Описание
Динамический
Новый, где имя типа лежит в переменной, не компилируется в#native.Наружу выходит необработанный
System.ArgumentExceptionиз построителя деревьеввыражений:
Expression of type 'OneScript.Values.BslValue' cannot be used for parameter of type 'System.String'.В стековом режиме тот же код работает.
Воспроизведение
Один и тот же код в двух модулях, различаются ровно директивой
#native.Классы/СтековыйКласс.os:Классы/НативныйКласс.os:запуск.os:Фактическое поведение
Стековый модуль отрабатывает. Нативный не компилируется:
Ожидаемое поведение
То есть
ConstructorCallдолжен принимать значение динамического типа и приводить егок строке сам, как это делает стековый режим.
Если приведение к строке принципиально должно оставаться на стороне разработчика —
нужна нормальная ошибка компиляции с указанием на это, а не
ArgumentExceptionиз внутренностей построителя деревьев выражений: по текущему тексту совершенно
неочевидно, что делать.
Обход
Явное приведение компилируется и работает:
Окружение
Воспроизводится одинаково на: