@@ -29,31 +29,26 @@ internal partial class KnownSerializerFinderVisitor
2929{
3030 private void AddKnownSerializer ( Expression node , IBsonSerializer serializer ) => _knownSerializers . AddSerializer ( node , serializer ) ;
3131
32- private bool AllAreKnown ( IEnumerable < Expression > nodes , out IReadOnlyList < IBsonSerializer > serializers )
32+ private bool AllAreKnown ( IEnumerable < Expression > nodes , out IReadOnlyList < IBsonSerializer > knownSerializers )
3333 {
34- var serializersList = new List < IBsonSerializer > ( ) ;
34+ var knownSerializersList = new List < IBsonSerializer > ( ) ;
3535 foreach ( var node in nodes )
3636 {
37- if ( IsKnown ( node , out var knownSerializer ) )
37+ if ( IsKnown ( node , out var nodeSerializer ) )
3838 {
39- serializersList . Add ( knownSerializer ) ;
39+ knownSerializersList . Add ( nodeSerializer ) ;
4040 }
4141 else
4242 {
43- serializers = null ;
43+ knownSerializers = null ;
4444 return false ;
4545 }
4646 }
4747
48- serializers = serializersList ;
48+ knownSerializers = knownSerializersList ;
4949 return true ;
5050 }
5151
52- private bool AnyAreNotKnown ( IEnumerable < Expression > nodes )
53- {
54- return nodes . Any ( IsNotKnown ) ;
55- }
56-
5752 private bool AnyIsKnown ( IEnumerable < Expression > nodes , out IBsonSerializer knownSerializer )
5853 {
5954 foreach ( var node in nodes )
@@ -76,19 +71,17 @@ private bool AnyIsNotKnown(IEnumerable<Expression> nodes)
7671
7772 private bool CanDeduceSerializer ( Expression node1 , Expression node2 , out Expression unknownNode , out IBsonSerializer knownSerializer )
7873 {
79- if ( IsKnown ( node1 , out var node1Serializer ) &&
80- IsNotKnown ( node2 ) )
74+ if ( IsNotKnown ( node1 ) && IsKnown ( node2 , out var node2Serializer ) )
8175 {
82- unknownNode = node2 ;
83- knownSerializer = node1Serializer ;
76+ unknownNode = node1 ;
77+ knownSerializer = node2Serializer ;
8478 return true ;
8579 }
8680
87- if ( IsNotKnown ( node1 ) &&
88- IsKnown ( node2 , out var node2Serializer ) )
81+ if ( IsNotKnown ( node2 ) && IsKnown ( node1 , out var node1Serializer ) )
8982 {
90- unknownNode = node1 ;
91- knownSerializer = node2Serializer ;
83+ unknownNode = node2 ;
84+ knownSerializer = node1Serializer ;
9285 return true ;
9386 }
9487
@@ -97,74 +90,75 @@ private bool CanDeduceSerializer(Expression node1, Expression node2, out Express
9790 return false ;
9891 }
9992
100- IBsonSerializer CreateCollectionSerializerFromCollectionSerializer ( Type type , IBsonSerializer collectionSerializer )
93+ IBsonSerializer CreateCollectionSerializerFromCollectionSerializer ( Type collectionType , IBsonSerializer collectionSerializer )
10194 {
102- if ( collectionSerializer . ValueType == type )
95+ if ( collectionSerializer . ValueType == collectionType )
10396 {
10497 return collectionSerializer ;
10598 }
10699
100+ if ( collectionSerializer is IUnknowableSerializer )
101+ {
102+ return UnknowableSerializer . Create ( collectionType ) ;
103+ }
104+
107105 var itemSerializer = collectionSerializer . GetItemSerializer ( ) ;
108- return CreateCollectionSerializerFromItemSerializer ( type , itemSerializer ) ;
106+ return CreateCollectionSerializerFromItemSerializer ( collectionType , itemSerializer ) ;
109107 }
110108
111- IBsonSerializer CreateCollectionSerializerFromItemSerializer ( Type type , IBsonSerializer itemSerializer )
109+ IBsonSerializer CreateCollectionSerializerFromItemSerializer ( Type collectionType , IBsonSerializer itemSerializer )
112110 {
113- return type switch
111+ if ( itemSerializer is IUnknowableSerializer )
112+ {
113+ return UnknowableSerializer . Create ( collectionType ) ;
114+ }
115+
116+ return collectionType switch
114117 {
115- _ when type . IsArray => ArraySerializer . Create ( itemSerializer ) ,
116- _ when type . IsConstructedGenericType && type . GetGenericTypeDefinition ( ) == typeof ( IEnumerable < > ) => IEnumerableSerializer . Create ( itemSerializer ) ,
117- _ when type . IsConstructedGenericType && type . GetGenericTypeDefinition ( ) == typeof ( IOrderedEnumerable < > ) => IOrderedEnumerableSerializer . Create ( itemSerializer ) ,
118- _ when type . IsConstructedGenericType && type . GetGenericTypeDefinition ( ) == typeof ( IQueryable < > ) => IQueryableSerializer . Create ( itemSerializer ) ,
119- _ => ( BsonSerializer . LookupSerializer ( type ) as IChildSerializerConfigurable ) ? . WithChildSerializer ( itemSerializer )
118+ _ when collectionType . IsArray => ArraySerializer . Create ( itemSerializer ) ,
119+ _ when collectionType . IsConstructedGenericType && collectionType . GetGenericTypeDefinition ( ) == typeof ( IEnumerable < > ) => IEnumerableSerializer . Create ( itemSerializer ) ,
120+ _ when collectionType . IsConstructedGenericType && collectionType . GetGenericTypeDefinition ( ) == typeof ( IOrderedEnumerable < > ) => IOrderedEnumerableSerializer . Create ( itemSerializer ) ,
121+ _ when collectionType . IsConstructedGenericType && collectionType . GetGenericTypeDefinition ( ) == typeof ( IQueryable < > ) => IQueryableSerializer . Create ( itemSerializer ) ,
122+ _ => ( BsonSerializer . LookupSerializer ( collectionType ) as IChildSerializerConfigurable ) ? . WithChildSerializer ( itemSerializer )
120123 } ;
121124 }
122125
123- private void DeduceBooleanSerializer ( Expression node )
126+ private void DeduceBaseTypeAndDerivedTypeSerializers ( Expression baseTypeExpression , Expression derivedTypeExpression )
124127 {
125- if ( IsNotKnown ( node ) )
128+ if ( IsNotKnown ( baseTypeExpression ) && IsKnown ( derivedTypeExpression , out var knownDerivedTypeSerializer ) )
126129 {
127- AddKnownSerializer ( node , BooleanSerializer . Instance ) ;
130+ var baseTypeSerializer = knownDerivedTypeSerializer . GetBaseTypeSerializer ( baseTypeExpression . Type ) ;
131+ AddKnownSerializer ( baseTypeExpression , baseTypeSerializer ) ;
128132 }
129- }
130133
131- private void DeduceBsonDocumentSerializer ( Expression node )
132- {
133- if ( IsNotKnown ( node ) )
134+ if ( IsNotKnown ( derivedTypeExpression ) && IsKnown ( baseTypeExpression , out var knownBaseTypeSerializer ) )
134135 {
135- AddKnownSerializer ( node , BsonDocumentSerializer . Instance ) ;
136+ var derivedTypeSerializer = knownBaseTypeSerializer . GetDerivedTypeSerializer ( baseTypeExpression . Type ) ;
137+ AddKnownSerializer ( derivedTypeExpression , derivedTypeSerializer ) ;
136138 }
137139 }
138140
139- private void DeduceBsonValueSerializer ( Expression node )
141+ private void DeduceBooleanSerializer ( Expression node )
140142 {
141143 if ( IsNotKnown ( node ) )
142144 {
143- AddKnownSerializer ( node , BsonValueSerializer . Instance ) ;
145+ AddKnownSerializer ( node , BooleanSerializer . Instance ) ;
144146 }
145147 }
146148
147149 private void DeduceCollectionAndCollectionSerializers ( Expression collectionExpression1 , Expression collectionExpression2 )
148150 {
149- IBsonSerializer collectionSerializer1 ;
150- IBsonSerializer collectionSerializer2 ;
151-
152- if ( IsNotKnown ( collectionExpression1 ) && IsKnown ( collectionExpression2 , out collectionSerializer2 ) )
151+ if ( IsNotKnown ( collectionExpression1 ) && IsKnown ( collectionExpression2 , out var knownCollectionSerializer2 ) )
153152 {
154- collectionSerializer1 = collectionSerializer2 is IUnknowableSerializer ?
155- UnknowableSerializer . Create ( collectionExpression1 . Type ) :
156- CreateCollectionSerializerFromCollectionSerializer ( collectionExpression1 . Type , collectionSerializer2 ) ;
153+ var collectionSerializer1 = CreateCollectionSerializerFromCollectionSerializer ( collectionExpression1 . Type , knownCollectionSerializer2 ) ;
157154 AddKnownSerializer ( collectionExpression1 , collectionSerializer1 ) ;
158155 }
159156
160- if ( IsNotKnown ( collectionExpression2 ) && IsKnown ( collectionExpression1 , out collectionSerializer1 ) )
157+ if ( IsNotKnown ( collectionExpression2 ) && IsKnown ( collectionExpression1 , out var knownCollectionSerializer1 ) )
161158 {
162- collectionSerializer2 = collectionSerializer1 is IUnknowableSerializer ?
163- UnknowableSerializer . Create ( collectionExpression2 . Type ) :
164- CreateCollectionSerializerFromCollectionSerializer ( collectionExpression2 . Type , collectionSerializer1 ) ;
159+ var collectionSerializer2 = CreateCollectionSerializerFromCollectionSerializer ( collectionExpression2 . Type , knownCollectionSerializer1 ) ;
165160 AddKnownSerializer ( collectionExpression2 , collectionSerializer2 ) ;
166161 }
167-
168162 }
169163
170164 private void DeduceCollectionAndItemSerializers ( Expression collectionExpression , Expression itemExpression )
@@ -181,9 +175,7 @@ private void DeduceItemAndCollectionSerializers(Expression itemExpression, Expre
181175
182176 if ( IsNotKnown ( collectionExpression ) && IsKnown ( itemExpression , out itemSerializer ) )
183177 {
184- var collectionSerializer = itemSerializer is IUnknowableSerializer ?
185- UnknowableSerializer . Create ( collectionExpression . Type ) :
186- CreateCollectionSerializerFromItemSerializer ( collectionExpression . Type , itemSerializer ) ;
178+ var collectionSerializer = CreateCollectionSerializerFromItemSerializer ( collectionExpression . Type , itemSerializer ) ;
187179 if ( collectionSerializer != null )
188180 {
189181 AddKnownSerializer ( collectionExpression , collectionSerializer ) ;
@@ -201,12 +193,12 @@ private void DeduceSerializer(Expression node, IBsonSerializer serializer)
201193
202194 private void DeduceSerializers ( Expression expression1 , Expression expression2 )
203195 {
204- if ( IsNotKnown ( expression1 ) && IsKnown ( expression2 , out var expression2Serializer ) )
196+ if ( IsNotKnown ( expression1 ) && IsKnown ( expression2 , out var expression2Serializer ) && expression2Serializer . ValueType == expression1 . Type )
205197 {
206198 AddKnownSerializer ( expression1 , expression2Serializer ) ;
207199 }
208200
209- if ( IsNotKnown ( expression2 ) && IsKnown ( expression1 , out var expression1Serializer ) )
201+ if ( IsNotKnown ( expression2 ) && IsKnown ( expression1 , out var expression1Serializer ) && expression1Serializer . ValueType == expression2 . Type )
210202 {
211203 AddKnownSerializer ( expression2 , expression1Serializer ) ;
212204 }
@@ -231,8 +223,8 @@ private void DeduceUnknowableSerializer(Expression node)
231223
232224 private bool IsItemSerializerKnown ( Expression node , out IBsonSerializer itemSerializer )
233225 {
234- if ( IsKnown ( node , out var serializer ) &&
235- serializer is IBsonArraySerializer arraySerializer &&
226+ if ( IsKnown ( node , out var nodeSerializer ) &&
227+ nodeSerializer is IBsonArraySerializer arraySerializer &&
236228 arraySerializer . TryGetItemSerializationInfo ( out var itemSerializationInfo ) )
237229 {
238230 itemSerializer = itemSerializationInfo . Serializer ;
0 commit comments