Skip to content

Commit 3091198

Browse files
authored
Merge pull request #320 from servicetitan/upstream/OptimizeVisitors
Optimize Visitors
2 parents b8ce093 + 5d374d6 commit 3091198

File tree

9 files changed

+191
-186
lines changed

9 files changed

+191
-186
lines changed

Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionVisitor.cs

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static Expression Visit(Expression exp, Func<T, Expression> visitor)
3030

3131
protected override Expression Visit(Expression exp)
3232
{
33-
if (exp is T && visitor!=null)
33+
if (exp is T && visitor != null)
3434
exp = visitor((T) exp);
3535

3636
return base.Visit(exp);
@@ -54,7 +54,7 @@ internal abstract class ExpressionVisitor
5454

5555
protected virtual Expression Visit(Expression exp)
5656
{
57-
if (exp==null)
57+
if (exp == null)
5858
return null;
5959
switch (exp.NodeType) {
6060
case ExpressionType.Negate:
@@ -127,8 +127,8 @@ private Expression VisitBinary(BinaryExpression b)
127127
Expression left = Visit(b.Left);
128128
Expression right = Visit(b.Right);
129129
Expression conversion = Visit(b.Conversion);
130-
if (left!=b.Left || right!=b.Right || conversion!=b.Conversion) {
131-
if (b.NodeType==ExpressionType.Coalesce)
130+
if (left != b.Left || right != b.Right || conversion != b.Conversion) {
131+
if (b.NodeType == ExpressionType.Coalesce)
132132
return Expression.Coalesce(left, right, conversion as LambdaExpression);
133133
return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method);
134134
}
@@ -154,16 +154,16 @@ private IEnumerable<MemberBinding> VisitBindingList(ReadOnlyCollection<MemberBin
154154
List<MemberBinding> list = null;
155155
for (int i = 0, n = original.Count; i < n; i++) {
156156
MemberBinding b = VisitBinding(original[i]);
157-
if (list!=null)
157+
if (list != null)
158158
list.Add(b);
159-
else if (b!=original[i]) {
159+
else if (b != original[i]) {
160160
list = new List<MemberBinding>(n);
161161
for (int j = 0; j < i; j++)
162162
list.Add(original[j]);
163163
list.Add(b);
164164
}
165165
}
166-
if (list!=null)
166+
if (list != null)
167167
return list;
168168
return original;
169169
}
@@ -173,7 +173,7 @@ private Expression VisitConditional(ConditionalExpression c)
173173
Expression test = Visit(c.Test);
174174
Expression ifTrue = Visit(c.IfTrue);
175175
Expression ifFalse = Visit(c.IfFalse);
176-
if (test!=c.Test || ifTrue!=c.IfTrue || ifFalse!=c.IfFalse)
176+
if (test != c.Test || ifTrue != c.IfTrue || ifFalse != c.IfFalse)
177177
return Expression.Condition(test, ifTrue, ifFalse);
178178
return c;
179179
}
@@ -191,7 +191,7 @@ private Expression VisitDefault(DefaultExpression d)
191191
private ElementInit VisitElementInitializer(ElementInit initializer)
192192
{
193193
IEnumerable<Expression> arguments = VisitExpressionList(initializer.Arguments);
194-
if (arguments!=initializer.Arguments)
194+
if (arguments != initializer.Arguments)
195195
return Expression.ElementInit(initializer.AddMethod, arguments);
196196
return initializer;
197197
}
@@ -201,16 +201,16 @@ private IEnumerable<ElementInit> VisitElementInitializerList(ReadOnlyCollection<
201201
List<ElementInit> list = null;
202202
for (int i = 0, n = original.Count; i < n; i++) {
203203
ElementInit init = VisitElementInitializer(original[i]);
204-
if (list!=null)
204+
if (list != null)
205205
list.Add(init);
206-
else if (init!=original[i]) {
206+
else if (init != original[i]) {
207207
list = new List<ElementInit>(n);
208208
for (int j = 0; j < i; j++)
209209
list.Add(original[j]);
210210
list.Add(init);
211211
}
212212
}
213-
if (list!=null)
213+
if (list != null)
214214
return list;
215215
return original;
216216
}
@@ -220,16 +220,16 @@ private IEnumerable<Expression> VisitExpressionList(ReadOnlyCollection<Expressio
220220
List<Expression> list = null;
221221
for (int i = 0, n = original.Count; i < n; i++) {
222222
var p = Visit(original[i]);
223-
if (list!=null)
223+
if (list != null)
224224
list.Add(p);
225-
else if (p!=original[i]) {
225+
else if (p != original[i]) {
226226
list = new List<Expression>(n);
227227
for (int j = 0; j < i; j++)
228228
list.Add(original[j]);
229229
list.Add(p);
230230
}
231231
}
232-
if (list!=null)
232+
if (list != null)
233233
return list.AsReadOnly();
234234
return original;
235235
}
@@ -238,15 +238,15 @@ private Expression VisitInvocation(InvocationExpression iv)
238238
{
239239
IEnumerable<Expression> args = VisitExpressionList(iv.Arguments);
240240
Expression expr = Visit(iv.Expression);
241-
if (args!=iv.Arguments || expr!=iv.Expression)
241+
if (args != iv.Arguments || expr != iv.Expression)
242242
return Expression.Invoke(expr, args);
243243
return iv;
244244
}
245245

246246
private Expression VisitLambda(LambdaExpression lambda)
247247
{
248248
Expression body = Visit(lambda.Body);
249-
if (body!=lambda.Body)
249+
if (body != lambda.Body)
250250
return FastExpression.Lambda(lambda.Type, body, lambda.Parameters);
251251
return lambda;
252252
}
@@ -255,23 +255,24 @@ private Expression VisitListInit(ListInitExpression init)
255255
{
256256
NewExpression n = VisitNew(init.NewExpression);
257257
IEnumerable<ElementInit> initializers = VisitElementInitializerList(init.Initializers);
258-
if (n!=init.NewExpression || initializers!=init.Initializers)
258+
if (n != init.NewExpression || initializers != init.Initializers)
259259
return Expression.ListInit(n, initializers);
260260
return init;
261261
}
262262

263263
private Expression VisitMemberAccess(MemberExpression m)
264264
{
265-
Expression exp = Visit(m.Expression);
266-
if (exp!=m.Expression)
265+
var originalExpression = m.Expression;
266+
Expression exp = Visit(originalExpression);
267+
if (exp != originalExpression)
267268
return Expression.MakeMemberAccess(exp, m.Member);
268269
return m;
269270
}
270271

271272
private MemberAssignment VisitMemberAssignment(MemberAssignment assignment)
272273
{
273274
Expression e = Visit(assignment.Expression);
274-
if (e!=assignment.Expression)
275+
if (e != assignment.Expression)
275276
return Expression.Bind(assignment.Member, e);
276277
return assignment;
277278
}
@@ -280,23 +281,23 @@ private Expression VisitMemberInit(MemberInitExpression init)
280281
{
281282
NewExpression n = VisitNew(init.NewExpression);
282283
IEnumerable<MemberBinding> bindings = VisitBindingList(init.Bindings);
283-
if (n!=init.NewExpression || bindings!=init.Bindings)
284+
if (n != init.NewExpression || bindings != init.Bindings)
284285
return Expression.MemberInit(n, bindings);
285286
return init;
286287
}
287288

288289
private MemberListBinding VisitMemberListBinding(MemberListBinding binding)
289290
{
290291
IEnumerable<ElementInit> initializers = VisitElementInitializerList(binding.Initializers);
291-
if (initializers!=binding.Initializers)
292+
if (initializers != binding.Initializers)
292293
return Expression.ListBind(binding.Member, initializers);
293294
return binding;
294295
}
295296

296297
private MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding)
297298
{
298299
IEnumerable<MemberBinding> bindings = VisitBindingList(binding.Bindings);
299-
if (bindings!=binding.Bindings)
300+
if (bindings != binding.Bindings)
300301
return Expression.MemberBind(binding.Member, bindings);
301302
return binding;
302303
}
@@ -305,24 +306,24 @@ private Expression VisitMethodCall(MethodCallExpression m)
305306
{
306307
Expression obj = Visit(m.Object);
307308
IEnumerable<Expression> args = VisitExpressionList(m.Arguments);
308-
if (obj!=m.Object || args!=m.Arguments)
309+
if (obj != m.Object || args != m.Arguments)
309310
return Expression.Call(obj, m.Method, args);
310311
return m;
311312
}
312313

313314
private NewExpression VisitNew(NewExpression nex)
314315
{
315316
IEnumerable<Expression> args = VisitExpressionList(nex.Arguments);
316-
if (args!=nex.Arguments)
317+
if (args != nex.Arguments)
317318
return Expression.New(nex.Constructor, args, nex.Members);
318319
return nex;
319320
}
320321

321322
private Expression VisitNewArray(NewArrayExpression na)
322323
{
323324
IEnumerable<Expression> exprs = VisitExpressionList(na.Expressions);
324-
if (exprs!=na.Expressions) {
325-
if (na.NodeType==ExpressionType.NewArrayInit)
325+
if (exprs != na.Expressions) {
326+
if (na.NodeType == ExpressionType.NewArrayInit)
326327
return Expression.NewArrayInit(na.Type.GetElementType(), exprs);
327328
return Expression.NewArrayBounds(na.Type.GetElementType(), exprs);
328329
}
@@ -337,15 +338,15 @@ private Expression VisitParameter(ParameterExpression p)
337338
private Expression VisitTypeIs(TypeBinaryExpression b)
338339
{
339340
Expression expr = Visit(b.Expression);
340-
if (expr!=b.Expression)
341+
if (expr != b.Expression)
341342
return Expression.TypeIs(expr, b.TypeOperand);
342343
return b;
343344
}
344345

345346
private Expression VisitUnary(UnaryExpression u)
346347
{
347348
Expression operand = Visit(u.Operand);
348-
if (operand!=u.Operand)
349+
if (operand != u.Operand)
349350
return Expression.MakeUnary(u.NodeType, operand, u.Type, u.Method);
350351
return u;
351352
}

Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ private void CreateNodeTree(List<object> values, ref XmlDocument document, strin
228228
var depth = 1;
229229
XmlNode itemNode = document.CreateElement("Item" + itemIndex);
230230

231-
if (value==null || !value.GetType().IsGenericType || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()!=typeof (Grouping<,>))) {
231+
if (value == null || !value.GetType().IsGenericType || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition() != typeof(Grouping<,>))) {
232232
itemNode = document.CreateElement("Item" + itemIndex);
233233
itemIndex++;
234234
parentNode.AppendChild(itemNode);
@@ -299,8 +299,8 @@ private int AddNode(object value, PropertyInfo property, ref XmlDocument documen
299299

300300
else {
301301
if (property.PropertyType.IsGenericType &&
302-
(property.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>)
303-
|| (property.PropertyType.GetGenericTypeDefinition()==typeof (IEnumerable<>)))) {
302+
(property.PropertyType.GetGenericTypeDefinition() == typeof(IQueryable<>)
303+
|| (property.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))) {
304304
var enumerable = (IEnumerable) property.GetValue(value, property.GetIndexParameters());
305305
var list = new List<object>();
306306
foreach (var o in enumerable)
@@ -556,13 +556,18 @@ private string KeyToString(object key)
556556
private static void EnumerateAll(IEnumerable enumerable)
557557
{
558558
foreach (var o in enumerable)
559-
if (o!=null) {
560-
if (o.GetType().IsGenericType && (o.GetType().GetGenericTypeDefinition()==typeof (IQueryable<>)
561-
|| o.GetType().GetGenericTypeDefinition()==typeof (IEnumerable<>)
562-
|| o.GetType().GetGenericTypeDefinition()==typeof (SubQuery<>)
563-
|| o.GetType().GetGenericTypeDefinition()==typeof (Grouping<,>)))
564-
EnumerateAll((IEnumerable) o);
565-
var properties = o.GetType().GetProperties();
559+
if (o != null) {
560+
var type = o.GetType();
561+
if (type.IsGenericType) {
562+
var genericTypeDefinition = type.GetGenericTypeDefinition();
563+
if (genericTypeDefinition == typeof(IQueryable<>)
564+
|| genericTypeDefinition == typeof(IEnumerable<>)
565+
|| genericTypeDefinition == typeof(SubQuery<>)
566+
|| genericTypeDefinition == typeof(Grouping<,>)) {
567+
EnumerateAll((IEnumerable) o);
568+
}
569+
}
570+
var properties = type.GetProperties();
566571
foreach (var info in properties) {
567572
if (info.PropertyType.IsGenericType &&
568573
(info.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>)

Orm/Xtensive.Orm/Orm/Building/Builders/ValueTypeBuilder.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ private static object AdjustValue(string fieldName, Type fieldType, object value
6161
#if NET6_0_OR_GREATER
6262

6363
if (valueType == WellKnownTypes.TimeOnly) {
64-
if (value is string timeOnlyString && !TimeOnly.TryParse(timeOnlyString, out var timeOnly)) {
64+
TimeOnly timeOnly = default;
65+
if (value is string timeOnlyString && !TimeOnly.TryParse(timeOnlyString, out timeOnly)) {
6566
throw FailToParseValue(fieldName, timeOnlyString);
6667
}
6768
return timeOnly;
6869
}
6970

7071
if (valueType == WellKnownTypes.DateOnly) {
71-
if (value is string dateOnlyString && !DateOnly.TryParse(dateOnlyString, out var dateOnly)) {
72+
DateOnly dateOnly = default;
73+
if (value is string dateOnlyString && !DateOnly.TryParse(dateOnlyString, out dateOnly)) {
7274
throw FailToParseValue(fieldName, dateOnlyString);
7375
}
7476
return dateOnly;

Orm/Xtensive.Orm/Orm/Linq/ExpressionExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,9 @@ public static bool IsEntitySetExpression(this Expression expression)
134134
}
135135

136136
public static bool IsEntitySet(this Expression expression) =>
137-
expression.Type.IsGenericType
138-
&& expression.Type.GetGenericTypeDefinition() == WellKnownOrmTypes.EntitySetOfT;
137+
expression.Type switch {
138+
var type => type.IsGenericType && type.GetGenericTypeDefinition() == WellKnownOrmTypes.EntitySetOfT
139+
};
139140

140141
public static Expression StripMarkers(this Expression e)
141142
{

Orm/Xtensive.Orm/Orm/Linq/MemberCompilation/MemberCompilerProvider.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -313,28 +313,23 @@ private static CompilerKey GetCompilerKey(MemberInfo member)
313313

314314
var targetType = canonicalMember.ReflectedType;
315315
if (targetType.IsGenericType) {
316-
targetType = targetType.GetGenericTypeDefinition();
317-
if (canonicalMember is FieldInfo)
318-
canonicalMember = targetType.GetField(canonicalMember.Name);
319-
else if (canonicalMember is MethodInfo methodInfo) {
320-
canonicalMember = GetCanonicalMethod(methodInfo, targetType.GetMethods());
316+
if (!targetType.IsGenericTypeDefinition) {
317+
targetType = targetType.GetGenericTypeDefinition();
321318
}
322-
else if (canonicalMember is ConstructorInfo constructorInfo)
323-
canonicalMember = GetCanonicalMethod(constructorInfo, targetType.GetConstructors());
324-
else
325-
canonicalMember = null;
319+
canonicalMember = canonicalMember switch {
320+
FieldInfo _ => targetType.GetField(canonicalMember.Name),
321+
MethodInfo methodInfo => GetCanonicalMethod(methodInfo, targetType.GetMethods()),
322+
ConstructorInfo constructorInfo => GetCanonicalMethod(constructorInfo, targetType.GetConstructors()),
323+
_ => null
324+
};
326325
}
327326

328327
if (canonicalMember == null) {
329328
return default;
330329
}
331330

332331
if (targetType.IsEnum) {
333-
var declaringType = canonicalMember.DeclaringType;
334-
if (targetType != declaringType)
335-
canonicalMember = GetCanonicalMethod((MethodInfo) canonicalMember, declaringType.GetMethods());
336-
else
337-
canonicalMember = GetCanonicalMethod((MethodInfo) canonicalMember, targetType.GetMethods());
332+
canonicalMember = GetCanonicalMethod((MethodInfo) canonicalMember, canonicalMember.DeclaringType.GetMethods());
338333
}
339334

340335
return new CompilerKey(canonicalMember);

Orm/Xtensive.Orm/Orm/Linq/QueryHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ public static bool IsDirectEntitySetQuery(Expression entitySet)
7474
if (owner.NodeType!=ExpressionType.MemberAccess)
7575
return false;
7676
var wrapper = ((MemberExpression) owner).Expression;
77-
return wrapper.NodeType==ExpressionType.Constant
77+
return wrapper.NodeType == ExpressionType.Constant
7878
&& wrapper.Type.IsGenericType
79-
&& wrapper.Type.GetGenericTypeDefinition()==typeof (OwnerWrapper<>);
79+
&& wrapper.Type.GetGenericTypeDefinition() == typeof(OwnerWrapper<>);
8080
}
8181

8282
public static Expression CreateDirectEntitySetQuery(EntitySetBase entitySet)

0 commit comments

Comments
 (0)