@@ -1026,25 +1026,14 @@ private bool IsPrimitiveValueThatShouldBeNamedArgument(TranslatedExpression arg,
10261026 }
10271027
10281028 private bool TransformParamsArgument ( ExpectedTargetDetails expectedTargetDetails , ResolveResult targetResolveResult ,
1029- IMethod method , IParameter parameter , TranslatedExpression arg , ref List < IParameter > expectedParameters ,
1029+ IMethod method , IParameter parameter , TranslatedExpression paramsArgument , ref List < IParameter > expectedParameters ,
10301030 ref List < TranslatedExpression > arguments )
10311031 {
1032- if ( CheckArgument ( out int length , out IType elementType ) )
1032+ var expressionBuilder = this . expressionBuilder ;
1033+ if ( ExtractArguments ( out IType elementType , out var expandedParameters , out var expandedArguments ) )
10331034 {
1034- var expandedParameters = new List < IParameter > ( expectedParameters ) ;
1035- var expandedArguments = new List < TranslatedExpression > ( arguments ) ;
1036- if ( length > 0 )
1037- {
1038- var arrayElements = ( ( ArrayCreateExpression ) arg . Expression ) . Initializer . Elements . ToArray ( ) ;
1039- for ( int j = 0 ; j < length ; j ++ )
1040- {
1041- expandedParameters . Add ( new DefaultParameter ( elementType , parameter . Name + j ) ) ;
1042- if ( j < arrayElements . Length )
1043- expandedArguments . Add ( new TranslatedExpression ( arrayElements [ j ] ) ) ;
1044- else
1045- expandedArguments . Add ( expressionBuilder . GetDefaultValueExpression ( elementType ) . WithoutILInstruction ( ) ) ;
1046- }
1047- }
1035+ expandedParameters . InsertRange ( 0 , expectedParameters ) ;
1036+ expandedArguments . InsertRange ( 0 , arguments ) ;
10481037 if ( IsUnambiguousCall ( expectedTargetDetails , method , targetResolveResult , Empty < IType > . Array ,
10491038 expandedArguments . SelectArray ( a => a . ResolveResult ) , argumentNames : null ,
10501039 firstOptionalArgumentIndex : - 1 , out _ ,
@@ -1057,30 +1046,46 @@ private bool TransformParamsArgument(ExpectedTargetDetails expectedTargetDetails
10571046 }
10581047 return false ;
10591048
1060- bool CheckArgument ( out int len , out IType t )
1049+ bool ExtractArguments ( out IType elementType , out List < IParameter > parameters , out List < TranslatedExpression > arguments )
10611050 {
1062- len = 0 ;
1063- t = null ;
1064- if ( arg . ResolveResult is CSharpInvocationResolveResult csirr &&
1065- csirr . Arguments . Count == 0 && csirr . Member is IMethod emptyMethod &&
1066- emptyMethod . IsStatic &&
1067- "System.Array.Empty" == emptyMethod . FullName &&
1068- emptyMethod . TypeArguments . Count == 1 )
1051+ elementType = null ;
1052+ parameters = null ;
1053+ arguments = null ;
1054+ switch ( paramsArgument . ResolveResult )
10691055 {
1070- t = emptyMethod . TypeArguments [ 0 ] ;
1071- return true ;
1072- }
1073-
1074- if ( arg . ResolveResult is ArrayCreateResolveResult acrr &&
1075- acrr . SizeArguments . Count == 1 &&
1076- acrr . SizeArguments [ 0 ] . IsCompileTimeConstant &&
1077- acrr . SizeArguments [ 0 ] . ConstantValue is int l )
1078- {
1079- len = l ;
1080- t = ( ( ArrayType ) acrr . Type ) . ElementType ;
1081- return true ;
1056+ case CSharpInvocationResolveResult { Member : IMethod method , Arguments : var args } :
1057+ // match System.Array.Empty<T>()
1058+ if ( args is [ ] && method is { IsStatic : true , FullName : "System.Array.Empty" , TypeArguments : [ var type ] } )
1059+ {
1060+ elementType = type ;
1061+ arguments = new ( ) ;
1062+ parameters = new ( ) ;
1063+ return true ;
1064+ }
1065+ if ( paramsArgument . Expression is ObjectCreateExpression oce
1066+ && method is { IsConstructor : true , DeclaringType : { TypeArguments : [ var type2 ] } declaringType }
1067+ && declaringType . IsKnownType ( KnownTypeCode . ReadOnlySpanOfT ) )
1068+ {
1069+ elementType = type2 ;
1070+ arguments = new ( ) { new TranslatedExpression ( oce . Arguments . Single ( ) ) } ;
1071+ parameters = new ( ) { new DefaultParameter ( type2 , string . Empty ) } ;
1072+ return true ;
1073+ }
1074+ return false ;
1075+ case ArrayCreateResolveResult { Type : ArrayType { ElementType : var type3 } , SizeArguments : [ { ConstantValue : int arrayLength } ] } :
1076+ elementType = type3 ;
1077+ arguments = new ( ( ( ArrayCreateExpression ) paramsArgument . Expression ) . Initializer . Elements . Select ( e => new TranslatedExpression ( e ) ) ) ;
1078+ parameters = new List < IParameter > ( arrayLength ) ;
1079+ for ( int i = 0 ; i < arrayLength ; i ++ )
1080+ {
1081+ parameters . Add ( new DefaultParameter ( type3 , string . Empty ) ) ;
1082+ if ( arguments . Count <= i )
1083+ arguments . Add ( new TranslatedExpression ( expressionBuilder . GetDefaultValueExpression ( type3 ) . WithoutILInstruction ( ) ) ) ;
1084+ }
1085+ return true ;
1086+ default :
1087+ return false ;
10821088 }
1083- return false ;
10841089 }
10851090 }
10861091
0 commit comments