@@ -1820,13 +1820,11 @@ private Expression ParseMemberAccess(Type? type, Expression? expression, string?
1820
1820
var isStringWithStringMethod = type == typeof ( string ) && _methodFinder . ContainsMethod ( type , id , isStaticAccess ) ;
1821
1821
var isApplicableForEnumerable = ! isStaticAccess && ! isConstantString && ! isStringWithStringMethod ;
1822
1822
1823
- if ( isApplicableForEnumerable && TypeHelper . TryFindGenericType ( typeof ( IEnumerable < > ) , type , out var enumerableType ) )
1823
+ if ( isApplicableForEnumerable &&
1824
+ TypeHelper . TryFindGenericType ( typeof ( IEnumerable < > ) , type , out var enumerableType ) &&
1825
+ TryParseEnumerable ( expression ! , enumerableType , id , type , out args , out var enumerableExpression ) )
1824
1826
{
1825
- var elementType = enumerableType . GetTypeInfo ( ) . GetGenericTypeArguments ( ) [ 0 ] ;
1826
- if ( TryParseEnumerable ( expression ! , elementType , id , errorPos , type , out args , out var enumerableExpression ) )
1827
- {
1828
- return enumerableExpression ;
1829
- }
1827
+ return enumerableExpression ;
1830
1828
}
1831
1829
1832
1830
// If args is not set by TryParseEnumerable (in case when the expression is not an Enumerable), do parse the argument list here.
@@ -2061,8 +2059,10 @@ private Expression ParseAsEnumOrNestedClass(string id)
2061
2059
return ParseMemberAccess ( type , null , identifier ) ;
2062
2060
}
2063
2061
2064
- private bool TryParseEnumerable ( Expression instance , Type elementType , string methodName , int errorPos , Type ? type , out Expression [ ] ? args , [ NotNullWhen ( true ) ] out Expression ? expression )
2062
+ private bool TryParseEnumerable ( Expression instance , Type enumerableType , string methodName , Type ? type , out Expression [ ] ? args , [ NotNullWhen ( true ) ] out Expression ? expression )
2065
2063
{
2064
+ var elementType = enumerableType . GetTypeInfo ( ) . GetGenericTypeArguments ( ) [ 0 ] ;
2065
+
2066
2066
// Keep the current _parent.
2067
2067
var oldParent = _parent ;
2068
2068
@@ -2124,7 +2124,7 @@ private bool TryParseEnumerable(Expression instance, Type elementType, string me
2124
2124
// #633 - For Average without any arguments, try to find the non-generic Average method on the callType for the supplied parameter type.
2125
2125
if ( methodName == nameof ( Enumerable . Average ) && args . Length == 0 && _methodFinder . TryFindAverageMethod ( callType , theType , out var averageMethod ) )
2126
2126
{
2127
- expression = Expression . Call ( null , averageMethod , new [ ] { instance } ) ;
2127
+ expression = Expression . Call ( null , averageMethod , instance ) ;
2128
2128
return true ;
2129
2129
}
2130
2130
@@ -2136,56 +2136,56 @@ private bool TryParseEnumerable(Expression instance, Type elementType, string me
2136
2136
throw ParseError ( _textParser . CurrentToken . Pos , Res . FunctionRequiresOneArg , methodName ) ;
2137
2137
}
2138
2138
2139
- typeArgs = new [ ] { ResolveTypeFromArgumentExpression ( methodName , args [ 0 ] ) } ;
2140
- args = new Expression [ 0 ] ;
2139
+ typeArgs = [ ResolveTypeFromArgumentExpression ( methodName , args [ 0 ] ) ] ;
2140
+ args = [ ] ;
2141
2141
}
2142
2142
else if ( new [ ] { "Max" , "Min" , "Select" , "OrderBy" , "OrderByDescending" , "ThenBy" , "ThenByDescending" , "GroupBy" } . Contains ( methodName ) )
2143
2143
{
2144
2144
if ( args . Length == 2 )
2145
2145
{
2146
- typeArgs = new [ ] { elementType , args [ 0 ] . Type , args [ 1 ] . Type } ;
2146
+ typeArgs = [ elementType , args [ 0 ] . Type , args [ 1 ] . Type ] ;
2147
2147
}
2148
2148
else if ( args . Length == 1 )
2149
2149
{
2150
- typeArgs = new [ ] { elementType , args [ 0 ] . Type } ;
2150
+ typeArgs = [ elementType , args [ 0 ] . Type ] ;
2151
2151
}
2152
2152
else
2153
2153
{
2154
- typeArgs = new [ ] { elementType } ;
2154
+ typeArgs = [ elementType ] ;
2155
2155
}
2156
2156
}
2157
2157
else if ( methodName == "SelectMany" )
2158
2158
{
2159
2159
var bodyType = Expression . Lambda ( args [ 0 ] , innerIt ) . Body . Type ;
2160
- var interfaces = bodyType . GetInterfaces ( ) . Union ( new [ ] { bodyType } ) ;
2161
- Type interfaceType = interfaces . Single ( i => i . Name == typeof ( IEnumerable < > ) . Name ) ;
2162
- Type resultType = interfaceType . GetTypeInfo ( ) . GetGenericTypeArguments ( ) [ 0 ] ;
2163
- typeArgs = new [ ] { elementType , resultType } ;
2160
+ var interfaces = bodyType . GetInterfaces ( ) . Union ( [ bodyType ] ) ;
2161
+ var interfaceType = interfaces . Single ( i => i . Name == typeof ( IEnumerable < > ) . Name ) ;
2162
+ var resultType = interfaceType . GetTypeInfo ( ) . GetGenericTypeArguments ( ) [ 0 ] ;
2163
+ typeArgs = [ elementType , resultType ] ;
2164
2164
}
2165
2165
else
2166
2166
{
2167
- typeArgs = new [ ] { elementType } ;
2167
+ typeArgs = [ elementType ] ;
2168
2168
}
2169
2169
2170
2170
if ( args . Length == 0 )
2171
2171
{
2172
- args = new [ ] { instance } ;
2172
+ args = [ instance ] ;
2173
2173
}
2174
2174
else
2175
2175
{
2176
- if ( new [ ] { "Concat" , "Contains" , "ContainsKey" , "DefaultIfEmpty" , "Except" , "Intersect" , "Skip" , "Take" , "Union" } . Contains ( methodName ) )
2176
+ if ( new [ ] { "Concat" , "Contains" , "ContainsKey" , "DefaultIfEmpty" , "Except" , "Intersect" , "Skip" , "Take" , "Union" , "SequenceEqual" } . Contains ( methodName ) )
2177
2177
{
2178
- args = new [ ] { instance , args [ 0 ] } ;
2178
+ args = [ instance , args [ 0 ] ] ;
2179
2179
}
2180
2180
else
2181
2181
{
2182
2182
if ( args . Length == 2 )
2183
2183
{
2184
- args = new [ ] { instance , Expression . Lambda ( args [ 0 ] , innerIt ) , Expression . Lambda ( args [ 1 ] , innerIt ) } ;
2184
+ args = [ instance , Expression . Lambda ( args [ 0 ] , innerIt ) , Expression . Lambda ( args [ 1 ] , innerIt ) ] ;
2185
2185
}
2186
2186
else
2187
2187
{
2188
- args = new [ ] { instance , Expression . Lambda ( args [ 0 ] , innerIt ) } ;
2188
+ args = [ instance , Expression . Lambda ( args [ 0 ] , innerIt ) ] ;
2189
2189
}
2190
2190
}
2191
2191
}
0 commit comments