Skip to content

Commit 70fde9b

Browse files
committed
CSHARP-5572: Requested changes
1 parent 92d5316 commit 70fde9b

File tree

15 files changed

+40
-140
lines changed

15 files changed

+40
-140
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderHelperMethods.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ 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> knownSerializers)
32+
private bool AreAllKnown(IEnumerable<Expression> nodes, out IReadOnlyList<IBsonSerializer> knownSerializers)
3333
{
3434
var knownSerializersList = new List<IBsonSerializer>();
3535
foreach (var node in nodes)
@@ -49,7 +49,7 @@ private bool AllAreKnown(IEnumerable<Expression> nodes, out IReadOnlyList<IBsonS
4949
return true;
5050
}
5151

52-
private bool AnyIsKnown(IEnumerable<Expression> nodes, out IBsonSerializer knownSerializer)
52+
private bool IsAnyKnown(IEnumerable<Expression> nodes, out IBsonSerializer knownSerializer)
5353
{
5454
foreach (var node in nodes)
5555
{
@@ -64,7 +64,7 @@ private bool AnyIsKnown(IEnumerable<Expression> nodes, out IBsonSerializer known
6464
return false;
6565
}
6666

67-
private bool AnyIsNotKnown(IEnumerable<Expression> nodes)
67+
private bool IsAnyNotKnown(IEnumerable<Expression> nodes)
6868
{
6969
return nodes.Any(IsNotKnown);
7070
}

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitConditional.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ protected override Expression VisitConditional(ConditionalExpression node)
2424
var ifTrueExpression = node.IfTrue;
2525
var ifFalseExpression = node.IfFalse;
2626

27-
DeduceConditionaSerializers();
27+
DeduceConditionalSerializers();
2828
base.VisitConditional(node);
29-
DeduceConditionaSerializers();
29+
DeduceConditionalSerializers();
3030

3131
return node;
3232

33-
void DeduceConditionaSerializers()
33+
void DeduceConditionalSerializers()
3434
{
3535
DeduceBaseTypeAndDerivedTypeSerializers(node, ifTrueExpression);
3636
DeduceBaseTypeAndDerivedTypeSerializers(node, ifFalseExpression);

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitIndex.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
* limitations under the License.
1414
*/
1515

16+
using System;
17+
using System.Collections.Generic;
1618
using System.Linq.Expressions;
1719
using MongoDB.Bson;
1820
using MongoDB.Bson.Serialization;
@@ -79,8 +81,11 @@ arguments[0] is var index &&
7981
bool IsDictionaryIndexer()
8082
{
8183
return
82-
indexer.DeclaringType.Name.Contains("Dictionary") &&
83-
arguments.Count == 1;
84+
collectionExpression.Type.ImplementsDictionaryInterface(out var keyType, out var valueType) &&
85+
arguments.Count == 1 &&
86+
arguments[0] is var indexExpression &&
87+
indexExpression.Type == keyType &&
88+
indexer.PropertyType == valueType;
8489
}
8590
}
8691
}

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitListInit.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ protected override Expression VisitListInit(ListInitExpression node)
2424
var newExpression = node.NewExpression;
2525
var initializers = node.Initializers;
2626

27-
DeduceSerialiers();
27+
DeduceListInitSerializers();
2828
base.VisitListInit(node);
29-
DeduceSerialiers();
29+
DeduceListInitSerializers();
3030

3131
return node;
3232

33-
void DeduceSerialiers()
33+
void DeduceListInitSerializers()
3434
{
3535
DeduceSerializers(node, newExpression);
3636
}

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitMethodCall.cs

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@ void DeduceContainsMethodSerializers()
15421542
{
15431543
DeduceReturnsBooleanSerializer();
15441544
}
1545-
else if (IsCollectionContainsMethod(out var collectionExpression, out var itemExpression))
1545+
else if (EnumerableMethod.IsContainsMethod(node, out var collectionExpression, out var itemExpression))
15461546
{
15471547
DeduceCollectionAndItemSerializers(collectionExpression, itemExpression);
15481548
DeduceReturnsBooleanSerializer();
@@ -1551,23 +1551,6 @@ void DeduceContainsMethodSerializers()
15511551
{
15521552
DeduceUnknownMethodSerializer();
15531553
}
1554-
1555-
bool IsCollectionContainsMethod(out Expression collectionExpression, out Expression itemExpression)
1556-
{
1557-
if (method.IsPublic &&
1558-
method.ReturnType == typeof(bool) &&
1559-
method.Name == "Contains" &&
1560-
method.GetParameters().Length == (method.IsStatic ? 2 : 1))
1561-
{
1562-
collectionExpression = method.IsStatic ? arguments[0] : node.Object;
1563-
itemExpression = method.IsStatic ? arguments[1] : arguments[0];
1564-
return true;
1565-
}
1566-
1567-
collectionExpression = null;
1568-
itemExpression = null;
1569-
return false;
1570-
}
15711554
}
15721555

15731556
void DeduceContainsValueMethodSerializers()
@@ -1692,7 +1675,7 @@ void DeduceCreateMethodSerializers()
16921675
#if NET6_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER
16931676
if (method.Is(KeyValuePairMethod.Create))
16941677
{
1695-
if (AnyIsNotKnown(arguments) && IsKnown(node, out var nodeSerializer))
1678+
if (IsAnyNotKnown(arguments) && IsKnown(node, out var nodeSerializer))
16961679
{
16971680
var keyExpression = arguments[0];
16981681
var valueExpression = arguments[1];
@@ -1704,7 +1687,7 @@ void DeduceCreateMethodSerializers()
17041687
}
17051688
}
17061689

1707-
if (IsNotKnown(node) && AllAreKnown(arguments, out var argumentSerializers))
1690+
if (IsNotKnown(node) && AreAllKnown(arguments, out var argumentSerializers))
17081691
{
17091692
var keySerializer = argumentSerializers[0];
17101693
var valueSerializer = argumentSerializers[1];
@@ -1716,7 +1699,7 @@ void DeduceCreateMethodSerializers()
17161699
#endif
17171700
if (method.IsOneOf(__tupleOrValueTupleCreateMethods))
17181701
{
1719-
if (AnyIsNotKnown(arguments) && IsKnown(node, out var nodeSerializer))
1702+
if (IsAnyNotKnown(arguments) && IsKnown(node, out var nodeSerializer))
17201703
{
17211704
if (nodeSerializer is IBsonTupleSerializer tupleSerializer)
17221705
{
@@ -1736,7 +1719,7 @@ void DeduceCreateMethodSerializers()
17361719
}
17371720
}
17381721

1739-
if (IsNotKnown(node) && AllAreKnown(arguments, out var argumentSerializers))
1722+
if (IsNotKnown(node) && AreAllKnown(arguments, out var argumentSerializers))
17401723
{
17411724
if (arguments.Count == 8)
17421725
{

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitNew.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ IBsonSerializer GetKnownSerializer(ConstructorInfo constructor)
123123
}
124124
else if (TupleOrValueTupleConstructor.IsTupleOrValueTupleConstructor(constructor))
125125
{
126-
if (AllAreKnown(arguments, out var argumentSerializers))
126+
if (AreAllKnown(arguments, out var argumentSerializers))
127127
{
128128
return TupleOrValueTupleSerializer.Create(constructor.DeclaringType, argumentSerializers);
129129
}

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitNewArray.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void DeduceNewArrayInitSerializers()
5757
{
5858
var itemExpressions = node.Expressions;
5959

60-
if (AnyIsNotKnown(itemExpressions) && IsKnown(node, out var arraySerializer))
60+
if (IsAnyNotKnown(itemExpressions) && IsKnown(node, out var arraySerializer))
6161
{
6262
if (arraySerializer is IPolymorphicArraySerializer polymorphicArraySerializer)
6363
{
@@ -84,7 +84,7 @@ void DeduceNewArrayInitSerializers()
8484
}
8585
}
8686

87-
if (AnyIsNotKnown(itemExpressions) && AnyIsKnown(itemExpressions, out var knownItemSerializer))
87+
if (IsAnyNotKnown(itemExpressions) && IsAnyKnown(itemExpressions, out var knownItemSerializer))
8888
{
8989
var firstItemType = itemExpressions.First().Type;
9090
if (itemExpressions.All(e => e.Type == firstItemType))
@@ -101,7 +101,7 @@ void DeduceNewArrayInitSerializers()
101101

102102
if (IsNotKnown(node))
103103
{
104-
if (AllAreKnown(itemExpressions, out var itemSerializers))
104+
if (AreAllKnown(itemExpressions, out var itemSerializers))
105105
{
106106
if (AllItemSerializersAreEqual(itemSerializers, out var itemSerializer))
107107
{

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitUnary.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static IBsonSerializer GetTargetSerializer(UnaryExpression node, Type sourceType
9898
return sourceSerializer;
9999
}
100100

101-
// handle conversionsn to BsonValue before any others
101+
// handle conversion to BsonValue before any others
102102
if (targetType == typeof(BsonValue))
103103
{
104104
return GetConvertToBsonValueSerializer(node, sourceSerializer);
@@ -193,6 +193,7 @@ static IBsonSerializer GetConvertEnumToEnumSerializer(UnaryExpression expression
193193
throw new ExpressionNotSupportedException(expression, because: "target type is not an enum");
194194
}
195195

196+
// TODO: throwing here breaks client-side projections
196197
// if (sourceSerializer is IHasRepresentationSerializer sourceHasRepresentationSerializer &&
197198
// !SerializationHelper.IsNumericRepresentation(sourceHasRepresentationSerializer.Representation))
198199
// {

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerMap.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using System.Linq.Expressions;
1919
using MongoDB.Bson.Serialization;
2020
using MongoDB.Bson.Serialization.Serializers;
21+
using MongoDB.Driver.Core.Misc;
2122
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
2223
using MongoDB.Driver.Linq.Linq3Implementation.Serializers;
2324

@@ -94,7 +95,7 @@ public bool IsNotKnown(Expression node)
9495

9596
public bool IsKnown(Expression node)
9697
{
97-
return node != null && _map.ContainsKey(node);
98+
return _map.ContainsKey(node);
9899
}
99100

100101
public bool IsKnown(Expression node, out IBsonSerializer serializer)

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/UnknownSerializerFinder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public UnknownSerializerFinder(KnownSerializerMap knownSerializers)
3737
_knownSerializers = knownSerializers;
3838
}
3939

40-
public Expression ExpressionWithUnknownSerialier => _expressionWithUnknownSerializer;
40+
public Expression ExpressionWithUnknownSerializer => _expressionWithUnknownSerializer;
4141

4242
public override Expression Visit(Expression node)
4343
{

0 commit comments

Comments
 (0)