@@ -30,12 +30,14 @@ public OrderingOperation(in LinqGenExpression expression, int id,
3030 {
3131 WithSelector = true ;
3232 SelectorInterfaceType = ParseTypeName ( selectorType ) ;
33- SelectorKeyType = ParseTypeName ( selectorType . TypeArguments [ 1 ] ) ;
33+ SelectorKeySymbol = selectorType . TypeArguments [ 1 ] ;
34+ SelectorKeyType = ParseTypeName ( SelectorKeySymbol ) ;
3435 }
3536 else
3637 {
3738 WithSelector = false ;
3839 SelectorInterfaceType = null ;
40+ SelectorKeySymbol = null ;
3941 SelectorKeyType = null ;
4042 }
4143 }
@@ -48,16 +50,25 @@ public OrderingOperation(in LinqGenExpression expression, int id,
4850 protected OrderingOperation RootOrder => UpstreamOrder ? . RootOrder ?? this ;
4951
5052 private TypeSyntax ? SelectorInterfaceType { get ; }
53+ private ITypeSymbol ? SelectorKeySymbol { get ; }
5154 private TypeSyntax ? SelectorKeyType { get ; }
5255
5356 private TypeSyntax KeyType => WithSelector ? SelectorKeyType ! : OutputElementType ;
5457
58+ private TypeSyntax KeyListType => WithSelector
59+ ? PooledListType ( SelectorKeyType ! , SelectorKeySymbol ! . IsUnmanagedType )
60+ : ElementListType ;
61+
5562 private TypeSyntax ComparerInterfaceType =>
5663 GenericName ( Identifier ( "IComparer" ) , TypeArgumentList ( KeyType ) ) ;
5764
5865 public override TypeSyntax EnumerableInterfaceType =>
5966 GenericName ( Identifier ( "IInternalOrderedStub" ) , TypeArgumentList ( OutputElementType ) ) ;
6067
68+ public TypeSyntax ElementListType => PooledListType ( OutputElementType , OutputElementSymbol . IsUnmanagedType ) ;
69+
70+ public TypeSyntax IndexListType => PooledListType ( IntType , true ) ;
71+
6172 public override TypeSyntax ? DummyParameterType
6273 {
6374 get
@@ -80,15 +91,11 @@ public override TypeSyntax? DummyParameterType
8091
8192 protected override IEnumerable < MemberInfo > GetMemberInfos ( bool isLocal )
8293 {
83- var elementsType = PooledListType ( OutputElementType ) ;
84-
85- yield return new MemberInfo ( MemberKind . Enumerator , elementsType , VarName ( "elements" ) ,
86- ObjectCreationExpression ( elementsType , ArgumentList ( LiteralExpression ( 0 ) ) , null ) ) ;
87-
88- var indicesType = PooledListType ( IntType ) ;
94+ yield return new MemberInfo ( MemberKind . Enumerator , ElementListType , VarName ( "elements" ) ,
95+ ObjectCreationExpression ( ElementListType , ArgumentList ( LiteralExpression ( 0 ) ) , null ) ) ;
8996
90- yield return new MemberInfo ( MemberKind . Enumerator , PooledListType ( IntType ) , VarName ( "indices" ) ,
91- ObjectCreationExpression ( indicesType , ArgumentList ( LiteralExpression ( 0 ) ) , null ) ) ;
97+ yield return new MemberInfo ( MemberKind . Enumerator , IndexListType , VarName ( "indices" ) ,
98+ ObjectCreationExpression ( IndexListType , ArgumentList ( LiteralExpression ( 0 ) ) , null ) ) ;
9299
93100 yield return new MemberInfo ( MemberKind . Enumerator , IntType , VarName ( "index" ) , LiteralExpression ( - 1 ) ) ;
94101
@@ -177,7 +184,7 @@ public override IEnumerable<StatementSyntax> RenderInitialization(bool isLocal,
177184 var elementsCount = MemberAccessExpression ( elementsName , CountProperty ) ;
178185
179186 yield return ExpressionStatement ( SimpleAssignmentExpression ( elementsName ,
180- ObjectCreationExpression ( PooledListType ( OutputElementType ) , ArgumentList ( countExpression ) , null ) ) ) ;
187+ ObjectCreationExpression ( ElementListType , ArgumentList ( countExpression ) , null ) ) ) ;
181188
182189 var addElementStatements = SingletonList < StatementSyntax > (
183190 ExpressionStatement ( InvocationExpression (
@@ -205,7 +212,7 @@ public override IEnumerable<StatementSyntax> RenderInitialization(bool isLocal,
205212 var sorterName = IdentifierName ( "sorter" ) ;
206213
207214 sortBody . Add ( ExpressionStatement ( SimpleAssignmentExpression ( indicesName ,
208- ObjectCreationExpression ( PooledListType ( IntType ) , ArgumentList ( elementsCount ) , null ) ) ) ) ;
215+ ObjectCreationExpression ( IndexListType , ArgumentList ( elementsCount ) , null ) ) ) ) ;
209216
210217 var loopVar = IdentifierName ( "i" ) ;
211218
@@ -248,12 +255,12 @@ public IEnumerable<OrderMemberInfo> GetOrderMemberInfos()
248255 if ( WithStruct )
249256 {
250257 yield return new OrderMemberInfo ( this ,
251- WithSelector ? TypeName ( "Selector" ) : null , TypeName ( "Comparer" ) , KeyType ) ;
258+ WithSelector ? TypeName ( "Selector" ) : null , TypeName ( "Comparer" ) , KeyType , KeyListType ) ;
252259 }
253260 else
254261 {
255262 yield return new OrderMemberInfo ( this ,
256- WithSelector ? SelectorInterfaceType : null , ComparerInterfaceType , KeyType ) ;
263+ WithSelector ? SelectorInterfaceType : null , ComparerInterfaceType , KeyType , KeyListType ) ;
257264 }
258265 }
259266
0 commit comments