Skip to content

Commit 75f8411

Browse files
committed
CSHARP-5572: Standardize on using existing IsTuple and IsValueTuple helper methods
1 parent 8298824 commit 75f8411

File tree

5 files changed

+21
-41
lines changed

5 files changed

+21
-41
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Reflection/TupleOrValueTupleConstructor.cs

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

16-
using System;
1716
using System.Reflection;
17+
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
1818

1919
namespace MongoDB.Driver.Linq.Linq3Implementation.Reflection;
2020

@@ -24,8 +24,6 @@ public static bool IsTupleOrValueTupleConstructor(ConstructorInfo constructor)
2424
{
2525
return
2626
constructor != null &&
27-
constructor.DeclaringType is var declaringType &&
28-
declaringType.Namespace == "System" &&
29-
(declaringType.Name.StartsWith("Tuple") || declaringType.Name.StartsWith("ValueTuple"));
27+
constructor.DeclaringType.IsTupleOrValueTuple();
3028
}
3129
}

src/MongoDB.Driver/Linq/Linq3Implementation/SerializerFinders/SerializerFinderVisitMember.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ _ when IsCollectionCountOrLengthProperty() => GetCollectionCountOrLengthProperty
5252
_ when declaringType.IsConstructedGenericType && declaringType.GetGenericTypeDefinition() == typeof(Dictionary<,>) => GetDictionaryPropertySerializer(),
5353
_ when declaringType.IsConstructedGenericType && declaringType.GetGenericTypeDefinition() == typeof(IDictionary<,>) => GetIDictionaryPropertySerializer(),
5454
_ when declaringType.IsNullable() => GetNullablePropertySerializer(),
55-
_ when IsTupleOrValueTuple(declaringType) => GetTupleOrValueTuplePropertySerializer(),
55+
_ when declaringType.IsTupleOrValueTuple() => GetTupleOrValueTuplePropertySerializer(),
5656
_ => GetPropertySerializer()
5757
};
5858

@@ -230,15 +230,5 @@ bool IsCollectionCountOrLengthProperty()
230230
node.Type == typeof(int) &&
231231
(member.Name == "Count" || member.Name == "Length");
232232
}
233-
234-
bool IsTupleOrValueTuple(Type type)
235-
{
236-
return
237-
type.Namespace == "System" &&
238-
(type.Name.StartsWith("Tuple") || type.Name.StartsWith("ValueTuple")) &&
239-
type.IsPublic &&
240-
type.IsConstructedGenericType &&
241-
type.GetGenericArguments().Length is >= 1 and <= 8;
242-
}
243233
}
244234
}

src/MongoDB.Driver/Linq/Linq3Implementation/SerializerFinders/SerializerFinderVisitMethodCall.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
*/
1515

1616
using System;
17-
using System.CodeDom;
18-
using System.Collections;
1917
using System.Collections.Generic;
2018
using System.Linq;
2119
using System.Linq.Expressions;
@@ -28,7 +26,6 @@
2826
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
2927
using MongoDB.Driver.Linq.Linq3Implementation.Reflection;
3028
using MongoDB.Driver.Linq.Linq3Implementation.Serializers;
31-
using MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators;
3229

3330
namespace MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders;
3431

@@ -1717,19 +1714,20 @@ void DeduceCreateMethodSerializers()
17171714

17181715
if (IsNotKnown(node) && AreAllKnown(arguments, out var argumentSerializers))
17191716
{
1717+
var tupleType = method.ReturnType;
1718+
17201719
if (arguments.Count == 8)
17211720
{
1722-
var tempList = new List<IBsonSerializer>(argumentSerializers);
1723-
tempList[7] = method.ReturnType.Name.StartsWith("ValueTuple") ?
1724-
ValueTupleSerializer.Create([argumentSerializers[7]]) :
1725-
TupleSerializer.Create([argumentSerializers[7]]);
1726-
argumentSerializers = tempList;
1721+
var item8Expression = arguments[7];
1722+
var item8Type = item8Expression.Type;
1723+
var item8Serializer = argumentSerializers[7];
1724+
var restTupleType = (tupleType.IsTuple() ? typeof(Tuple<>) : typeof(ValueTuple<>)).MakeGenericType(item8Type);
1725+
var restSerializer = TupleOrValueTupleSerializer.Create(restTupleType, [item8Serializer]);
1726+
argumentSerializers = argumentSerializers.Take(7).Append(restSerializer).ToArray();
17271727
}
17281728

1729-
var resultSerializer = method.ReturnType.Name.StartsWith("ValueTuple") ?
1730-
ValueTupleSerializer.Create(argumentSerializers) :
1731-
TupleSerializer.Create(argumentSerializers);
1732-
AddNodeSerializer(node, resultSerializer);
1729+
var tupleSerializer = TupleOrValueTupleSerializer.Create(tupleType, argumentSerializers);
1730+
AddNodeSerializer(node, tupleSerializer);
17331731
}
17341732
}
17351733
else

src/MongoDB.Driver/Linq/Linq3Implementation/Serializers/TupleOrValueTupleSerializer.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,19 @@
1717
using System.Collections.Generic;
1818
using MongoDB.Bson.Serialization;
1919
using MongoDB.Bson.Serialization.Serializers;
20+
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
2021

2122
namespace MongoDB.Driver.Linq.Linq3Implementation.Serializers;
2223

2324
internal static class TupleOrValueTupleSerializer
2425
{
25-
public static IBsonSerializer Create(Type type, IEnumerable<IBsonSerializer> itemSerializers)
26+
public static IBsonSerializer Create(Type tupleType, IEnumerable<IBsonSerializer> itemSerializers)
2627
{
27-
return type.Name switch
28+
return tupleType.Name switch
2829
{
29-
_ when type.Name.StartsWith("Tuple") => TupleSerializer.Create(itemSerializers),
30-
_ when type.Name.StartsWith("ValueTuple") => ValueTupleSerializer.Create(itemSerializers),
31-
_ => throw new ArgumentException($"Unexpected type: {type.Name}", nameof(type))
30+
_ when tupleType.IsTuple() => TupleSerializer.Create(itemSerializers),
31+
_ when tupleType.IsValueTuple() => ValueTupleSerializer.Create(itemSerializers),
32+
_ => throw new ArgumentException($"Unexpected tuple type: {tupleType.Name}", nameof(tupleType))
3233
};
3334
}
3435
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/NewTupleExpressionToAggregationExpressionTranslator.cs

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

16-
using System;
17-
using System.Collections.Generic;
1816
using System.Linq.Expressions;
1917
using MongoDB.Bson.Serialization;
20-
using MongoDB.Bson.Serialization.Serializers;
2118
using MongoDB.Driver.Linq.Linq3Implementation.Ast.Expressions;
2219
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
20+
using MongoDB.Driver.Linq.Linq3Implementation.Serializers;
2321

2422
namespace MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators
2523
{
@@ -49,16 +47,11 @@ public static TranslatedExpression Translate(TranslationContext context, NewExpr
4947
}
5048

5149
var ast = AstExpression.ComputedArray(items);
52-
var tupleSerializer = CreateTupleSerializer(tupleType, itemSerializers);
50+
var tupleSerializer = TupleOrValueTupleSerializer.Create(tupleType, itemSerializers);
5351
return new TranslatedExpression(expression, ast, tupleSerializer);
5452
}
5553

5654
throw new ExpressionNotSupportedException(expression);
5755
}
58-
59-
private static IBsonSerializer CreateTupleSerializer(Type tupleType, IEnumerable<IBsonSerializer> itemSerializers)
60-
{
61-
return tupleType.IsTuple() ? TupleSerializer.Create(itemSerializers) : ValueTupleSerializer.Create(itemSerializers);
62-
}
6356
}
6457
}

0 commit comments

Comments
 (0)