Skip to content

native: Новый(ИмяТипа) с типом в переменной не компилируется #1741

Description

@nixel2007

Описание

Динамический Новый, где имя типа лежит в переменной, не компилируется в #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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    nativeКомпиляция в CLR в движке 2.0

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions