@@ -1101,11 +1101,23 @@ protected override void VisitObjectProcedureCall(BslSyntaxNode node)
11011101 if ( targetType . IsObjectValue ( ) )
11021102 {
11031103 var methodInfo = FindMethodOfType ( node , targetType , name ) ;
1104- var args = PrepareCallArguments ( call . ArgumentList , methodInfo . GetParameters ( ) ) ;
1104+ var args = PrepareCallArguments ( call . ArgumentList , methodInfo . GetParameters ( ) , methodInfo is ContextMethodInfo { InjectsProcess : true } ) ;
11051105
11061106 _blocks . Add ( Expression . Call ( target , methodInfo , args ) ) ;
11071107 }
1108- else if ( targetType . IsValue ( ) || target is DynamicExpression )
1108+ else if ( targetType . IsContext ( ) )
1109+ {
1110+ var contextCall = ExpressionHelpers . CallContextMethod ( target , name , _processParameter ,
1111+ PrepareDynamicCallArguments ( call . ArgumentList ) ) ;
1112+ _blocks . Add ( contextCall ) ;
1113+ }
1114+ else if ( targetType . IsValue ( ) )
1115+ {
1116+ var contextCall = ExpressionHelpers . TryCallContextMethod ( target , name , _processParameter ,
1117+ PrepareDynamicCallArguments ( call . ArgumentList ) ) ;
1118+ _blocks . Add ( contextCall ) ;
1119+ }
1120+ else if ( target is DynamicExpression )
11091121 {
11101122 var args = new List < Expression > ( ) ;
11111123 args . Add ( target ) ;
@@ -1156,14 +1168,20 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node)
11561168 $ "Method { targetType } .{ name } is not a function") , ToCodePosition ( node . Location ) ) ;
11571169 }
11581170
1159- var args = PrepareCallArguments ( call . ArgumentList , methodInfo . GetParameters ( ) ) ;
1171+ var args = PrepareCallArguments ( call . ArgumentList , methodInfo . GetParameters ( ) , methodInfo is ContextMethodInfo { InjectsProcess : true } ) ;
11601172 _statementBuildParts . Push ( Expression . Call ( target , methodInfo , args ) ) ;
11611173 }
11621174 else if ( targetType . IsContext ( ) )
11631175 {
11641176 _statementBuildParts . Push ( ExpressionHelpers . CallContextMethod ( target , name , _processParameter , PrepareDynamicCallArguments ( call . ArgumentList ) ) ) ;
11651177 }
1166- else if ( targetType . IsValue ( ) || target is DynamicExpression )
1178+ else if ( targetType . IsValue ( ) )
1179+ {
1180+ var contextCall = ExpressionHelpers . TryCallContextMethod ( target , name , _processParameter ,
1181+ PrepareDynamicCallArguments ( call . ArgumentList ) ) ;
1182+ _statementBuildParts . Push ( contextCall ) ;
1183+ }
1184+ else if ( target is DynamicExpression )
11671185 {
11681186 var args = new List < Expression > ( ) ;
11691187 args . Add ( target ) ;
@@ -1247,7 +1265,7 @@ private Expression CreateMethodCall(CallNode node)
12471265 }
12481266
12491267 var symbol = Symbols . GetScope ( binding . ScopeNumber ) . Methods [ binding . MemberNumber ] ;
1250- var args = PrepareCallArguments ( node . ArgumentList , symbol . Method . GetParameters ( ) ) ;
1268+ var args = PrepareCallArguments ( node . ArgumentList , symbol . Method . GetParameters ( ) , symbol . Method is ContextMethodInfo { InjectsProcess : true } ) ;
12511269
12521270 var methodInfo = symbol . Method ;
12531271 if ( methodInfo is ContextMethodInfo contextMethod )
@@ -1316,7 +1334,7 @@ private Expression CreateBuiltInFunctionCall(CallNode node)
13161334 var method = _builtInFunctions . GetMethod ( methodName ) ;
13171335 var declaredParameters = method . GetParameters ( ) ;
13181336
1319- var args = PrepareCallArguments ( node . ArgumentList , declaredParameters ) ;
1337+ var args = PrepareCallArguments ( node . ArgumentList , declaredParameters , false ) ;
13201338
13211339 result = Expression . Call ( method , args ) ;
13221340 break ;
@@ -1385,7 +1403,7 @@ private Expression DirectConversionCall(CallNode node, Type type)
13851403 type ) ;
13861404 }
13871405
1388- private List < Expression > PrepareCallArguments ( BslSyntaxNode argList , ParameterInfo [ ] declaredParameters )
1406+ private List < Expression > PrepareCallArguments ( BslSyntaxNode argList , ParameterInfo [ ] declaredParameters , bool injectsProcess )
13891407 {
13901408 var factArguments = new List < Expression > ( ) ;
13911409
@@ -1395,7 +1413,8 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
13951413 : null ) . ToArray ( ) ;
13961414
13971415 var parametersToProcess = declaredParameters . Length ;
1398- for ( int i = 0 ; i < parameters . Length ; i ++ )
1416+ var declStart = injectsProcess ? 1 : 0 ;
1417+ for ( int i = 0 , decl = declStart ; i < parameters . Length ; i ++ , decl ++ )
13991418 {
14001419 if ( parametersToProcess == 0 )
14011420 {
@@ -1405,7 +1424,7 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
14051424 }
14061425
14071426 var passedArg = parameters [ i ] ;
1408- var declaredParam = declaredParameters [ i ] ;
1427+ var declaredParam = declaredParameters [ decl ] ;
14091428
14101429 if ( declaredParam . GetCustomAttribute < ParamArrayAttribute > ( ) != null )
14111430 {
@@ -1448,7 +1467,7 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
14481467
14491468 if ( parametersToProcess > 0 )
14501469 {
1451- foreach ( var declaredParam in declaredParameters . Skip ( parameters . Length ) )
1470+ foreach ( var declaredParam in declaredParameters . Skip ( parameters . Length + declStart ) )
14521471 {
14531472 if ( declaredParam . HasDefaultValue )
14541473 {
0 commit comments