Skip to content

Commit 746dbce

Browse files
committed
Refactor static readonly field initializers for better readability (#54)
* Refactor static readonly field initializers for better readability * Fix case * Fix PascalCase * Use .ToArray() in static readonly fields for thread safety Bugfix: reorder static fields in CompareProvider because of dependency
1 parent 5056f62 commit 746dbce

16 files changed

Lines changed: 263 additions & 414 deletions

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<PropertyGroup>
3838
<NoLogo>true</NoLogo>
3939
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
40-
<TargetFramework>netcoreapp3.1</TargetFramework>
40+
<TargetFramework>net5.0</TargetFramework>
4141
<LangVersion>9.0</LangVersion>
4242
<SolutionDir Condition="$(SolutionDir) == ''">$([MSBuild]::EnsureTrailingSlash(
4343
$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)', 'Orm.sln'))))</SolutionDir>

Extensions/Xtensive.Orm.Web.Tests/Xtensive.Orm.Web.Tests.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
54
<IsPackable>false</IsPackable>
65
<SignAssembly>true</SignAssembly>
76
<AssemblyOriginatorKeyFile>$(ExtensionsKeyFile)</AssemblyOriginatorKeyFile>

Orm/Xtensive.Orm/Comparison/ComparerProvider.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ namespace Xtensive.Comparison
2121
public class ComparerProvider : AssociateProvider,
2222
IComparerProvider
2323
{
24-
private static readonly ComparerProvider DefaultProvider;
25-
private static readonly SystemComparerProvider SystemProvider;
26-
private static readonly Type BaseComparerWrapperType;
24+
private static readonly Type BaseComparerWrapperType = typeof(BaseComparerWrapper<,>);
25+
private static readonly ComparerProvider DefaultProvider = new ComparerProvider();
26+
private static readonly SystemComparerProvider SystemProvider = SystemComparerProvider.Instance;
2727

2828
/// <summary>
2929
/// Gets default instance of this type.
@@ -121,12 +121,5 @@ protected ComparerProvider(SerializationInfo info, StreamingContext context)
121121
: base(info, context)
122122
{
123123
}
124-
125-
static ComparerProvider()
126-
{
127-
BaseComparerWrapperType = typeof(BaseComparerWrapper<,>);
128-
DefaultProvider = new ComparerProvider();
129-
SystemProvider = SystemComparerProvider.Instance;
130-
}
131124
}
132125
}

Orm/Xtensive.Orm/Conversion/Internals/EnumAdvancedConverter{TFrom, TTo, TIntermediate}.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ internal class EnumAdvancedConverter<TFrom, TTo, TIntermediate> : AdvancedConver
1616
where TTo : struct
1717
where TIntermediate : struct
1818
{
19-
private static readonly Converter<TIntermediate, TTo> outputEnumConverter;
20-
private static readonly Converter<TFrom, TIntermediate> inputEnumConverter;
19+
private static readonly Converter<TIntermediate, TTo> outputEnumConverter = typeof(TTo).IsEnum ? DelegateHelper.CreatePrimitiveCastDelegate<TIntermediate, TTo>() : null;
20+
private static readonly Converter<TFrom, TIntermediate> inputEnumConverter = typeof(TFrom).IsEnum ? DelegateHelper.CreatePrimitiveCastDelegate<TFrom, TIntermediate>() : null;
2121

2222
private readonly AdvancedConverterStruct<TIntermediate, TTo> outputValueTypeAdvancedConverter;
2323
private readonly AdvancedConverterStruct<TFrom, TIntermediate> inputValueTypeAdvancedConverter;
@@ -48,13 +48,5 @@ public EnumAdvancedConverter(IAdvancedConverterProvider provider)
4848
if (!typeof (TTo).IsEnum)
4949
outputValueTypeAdvancedConverter = provider.GetConverter<TIntermediate, TTo>();
5050
}
51-
52-
static EnumAdvancedConverter()
53-
{
54-
if (typeof (TTo).IsEnum)
55-
outputEnumConverter = DelegateHelper.CreatePrimitiveCastDelegate<TIntermediate, TTo>();
56-
if (typeof (TFrom).IsEnum)
57-
inputEnumConverter = DelegateHelper.CreatePrimitiveCastDelegate<TFrom, TIntermediate>();
58-
}
5951
}
6052
}

Orm/Xtensive.Orm/Orm/Configuration/NameMappingCollection.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2014 Xtensive LLC.
1+
// Copyright (C) 2014 Xtensive LLC.
22
// All rights reserved.
33
// For conditions of distribution and use, see license.
44
// Created by: Denis Krjuchkov
@@ -21,7 +21,7 @@ public class NameMappingCollection : LockableBase, IEnumerable<KeyValuePair<stri
2121
/// <summary>
2222
/// Gets empty <see cref="NameMappingCollection"/>.
2323
/// </summary>
24-
public static readonly NameMappingCollection Empty;
24+
public static readonly NameMappingCollection Empty = new NameMappingCollection();
2525

2626
private readonly Dictionary<string, string> items = new Dictionary<string, string>();
2727

@@ -125,7 +125,6 @@ public NameMappingCollection([NotNull] IEnumerable<KeyValuePair<string, string>>
125125

126126
static NameMappingCollection()
127127
{
128-
Empty = new NameMappingCollection();
129128
Empty.Lock();
130129
}
131130
}

Orm/Xtensive.Orm/Orm/Configuration/SessionConfiguration.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class SessionConfiguration : ConfigurationBase
4444
/// <summary>
4545
/// Default <see cref="SessionConfiguration"/>.
4646
/// </summary>
47-
public static readonly SessionConfiguration Default;
47+
public static readonly SessionConfiguration Default = new SessionConfiguration(WellKnown.Sessions.Default);
4848

4949
private SessionOptions options = SessionOptions.Default;
5050
private string userName = string.Empty;
@@ -330,7 +330,6 @@ public SessionConfiguration(string name, SessionOptions sessionOptions)
330330

331331
static SessionConfiguration()
332332
{
333-
Default = new SessionConfiguration(WellKnown.Sessions.Default);
334333
Default.Lock(true);
335334
}
336335
}

Orm/Xtensive.Orm/Orm/Linq/Materialization/ExpressionMaterializer.cs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ internal class ExpressionMaterializer : PersistentExpressionVisitor
2828
{
2929
private const string RootQueryTagsPrefix = "Root query tags ->";
3030

31-
private static readonly MethodInfo BuildPersistentTupleMethod;
32-
private static readonly MethodInfo GetTupleSegmentMethod;
33-
private static readonly MethodInfo GetParameterValueMethod;
34-
private static readonly PropertyInfo ParameterContextProperty;
35-
private static readonly MethodInfo GetTupleParameterValueMethod;
31+
private static readonly MethodInfo BuildPersistentTupleMethod = typeof(ExpressionMaterializer).GetMethod(nameof(BuildPersistentTuple), BindingFlags.NonPublic | BindingFlags.Static);
32+
private static readonly MethodInfo GetTupleSegmentMethod = typeof(ExpressionMaterializer).GetMethod(nameof(GetTupleSegment), BindingFlags.NonPublic | BindingFlags.Static);
33+
private static readonly MethodInfo GetParameterValueMethod = WellKnownOrmTypes.ParameterContext.GetMethod(nameof(ParameterContext.GetValue));
34+
private static readonly PropertyInfo ParameterContextProperty = WellKnownOrmTypes.ItemMaterializationContext.GetProperty(nameof(ItemMaterializationContext.ParameterContext));
35+
private static readonly MethodInfo GetTupleParameterValueMethod = GetParameterValueMethod.CachedMakeGenericMethod(WellKnownOrmTypes.Tuple);
3636
private static readonly ParameterExpression TupleParameter = Expression.Parameter(WellKnownOrmTypes.Tuple, "tuple");
3737
private static readonly ParameterExpression MaterializationContextParameter = Expression.Parameter(WellKnownOrmTypes.ItemMaterializationContext, "mc");
3838
private static readonly ConstantExpression TypeReferenceAccuracyConstantExpression = Expression.Constant(TypeReferenceAccuracy.BaseType);
@@ -544,17 +544,5 @@ private ExpressionMaterializer(
544544
this.context = context;
545545
this.tupleParameters = new HashSet<Parameter<Tuple>>(tupleParameters);
546546
}
547-
548-
static ExpressionMaterializer()
549-
{
550-
var thisType = typeof(ExpressionMaterializer);
551-
552-
ParameterContextProperty =
553-
WellKnownOrmTypes.ItemMaterializationContext.GetProperty(nameof(ItemMaterializationContext.ParameterContext));
554-
GetParameterValueMethod = WellKnownOrmTypes.ParameterContext.GetMethod(nameof(ParameterContext.GetValue));
555-
GetTupleParameterValueMethod = GetParameterValueMethod.CachedMakeGenericMethod(WellKnownOrmTypes.Tuple);
556-
BuildPersistentTupleMethod = thisType.GetMethod(nameof(BuildPersistentTuple), BindingFlags.NonPublic | BindingFlags.Static);
557-
GetTupleSegmentMethod = thisType.GetMethod(nameof(GetTupleSegment), BindingFlags.NonPublic | BindingFlags.Static);
558-
}
559547
}
560548
}

Orm/Xtensive.Orm/Orm/Linq/Materialization/ItemMaterializationContext.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ namespace Xtensive.Orm.Linq.Materialization
1414
{
1515
internal sealed class ItemMaterializationContext
1616
{
17-
public static readonly MethodInfo IsMaterializedMethodInfo;
18-
public static readonly MethodInfo GetEntityMethodInfo;
19-
public static readonly MethodInfo MaterializeMethodInfo;
20-
public static readonly System.Reflection.FieldInfo SessionFieldInfo;
17+
public static readonly MethodInfo IsMaterializedMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(IsMaterialized));
18+
public static readonly MethodInfo GetEntityMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(GetEntity));
19+
public static readonly MethodInfo MaterializeMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(Materialize));
20+
public static readonly System.Reflection.FieldInfo SessionFieldInfo = WellKnownOrmTypes.ItemMaterializationContext.GetField(nameof(Session));
2121

2222
public readonly Session Session;
2323
public readonly MaterializationContext MaterializationContext;
@@ -77,13 +77,5 @@ public ItemMaterializationContext(MaterializationContext materializationContext,
7777
typeIdRegistry = Session.StorageNode.TypeIdRegistry;
7878
entities = new Entity[materializationContext.EntitiesInRow];
7979
}
80-
81-
static ItemMaterializationContext()
82-
{
83-
IsMaterializedMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(IsMaterialized));
84-
GetEntityMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(GetEntity));
85-
MaterializeMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(Materialize));
86-
SessionFieldInfo = WellKnownOrmTypes.ItemMaterializationContext.GetField(nameof(Session));
87-
}
8880
}
8981
}

Orm/Xtensive.Orm/Orm/Linq/Materialization/MaterializationHelper.cs

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2020 Xtensive LLC.
1+
// Copyright (C) 2009-2021 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Alexis Kochetov
@@ -22,13 +22,26 @@ namespace Xtensive.Orm.Linq.Materialization
2222
{
2323
internal static class MaterializationHelper
2424
{
25-
public static readonly MethodInfo MaterializeMethodInfo;
26-
public static readonly MethodInfo GetDefaultMethodInfo;
27-
public static readonly MethodInfo CreateItemMaterializerMethodInfo;
28-
public static readonly MethodInfo CreateNullableItemMaterializerMethodInfo;
29-
public static readonly MethodInfo IsNullMethodInfo;
30-
public static readonly MethodInfo ThrowEmptySequenceExceptionMethodInfo;
31-
public static readonly MethodInfo PrefetchEntitySetMethodInfo;
25+
public static readonly MethodInfo MaterializeMethodInfo = typeof(MaterializationHelper)
26+
.GetMethod(nameof(Materialize), BindingFlags.Public | BindingFlags.Static);
27+
28+
public static readonly MethodInfo GetDefaultMethodInfo = typeof(MaterializationHelper)
29+
.GetMethod(nameof(GetDefault), BindingFlags.Public | BindingFlags.Static);
30+
31+
public static readonly MethodInfo CreateItemMaterializerMethodInfo = typeof(MaterializationHelper)
32+
.GetMethod(nameof(CreateItemMaterializer), BindingFlags.Public | BindingFlags.Static);
33+
34+
public static readonly MethodInfo CreateNullableItemMaterializerMethodInfo = typeof(MaterializationHelper)
35+
.GetMethod(nameof(CreateNullableItemMaterializer), BindingFlags.Public | BindingFlags.Static);
36+
37+
public static readonly MethodInfo IsNullMethodInfo = typeof(MaterializationHelper)
38+
.GetMethod(nameof(IsNull), BindingFlags.Public | BindingFlags.Static);
39+
40+
public static readonly MethodInfo ThrowEmptySequenceExceptionMethodInfo = typeof(MaterializationHelper)
41+
.GetMethod(nameof(ThrowEmptySequenceException), BindingFlags.Public | BindingFlags.Static);
42+
43+
public static readonly MethodInfo PrefetchEntitySetMethodInfo = typeof(MaterializationHelper)
44+
.GetMethod(nameof(PrefetechEntitySet), BindingFlags.Public | BindingFlags.Static);
3245

3346
public static int[] CreateSingleSourceMap(int targetLength, Pair<int>[] remappedColumns)
3447
{
@@ -106,25 +119,5 @@ public static TEntitySet PrefetechEntitySet<TEntitySet>(TEntitySet entitySet, It
106119
new List<PrefetchFieldDescriptor>{new PrefetchFieldDescriptor(entitySet.Field, WellKnown.EntitySetPreloadCount)});
107120
return entitySet;
108121
}
109-
110-
// Type initializer
111-
112-
static MaterializationHelper()
113-
{
114-
MaterializeMethodInfo = typeof (MaterializationHelper)
115-
.GetMethod(nameof(Materialize), BindingFlags.Public | BindingFlags.Static);
116-
CreateItemMaterializerMethodInfo = typeof (MaterializationHelper)
117-
.GetMethod(nameof(CreateItemMaterializer), BindingFlags.Public | BindingFlags.Static);
118-
CreateNullableItemMaterializerMethodInfo = typeof (MaterializationHelper)
119-
.GetMethod(nameof(CreateNullableItemMaterializer), BindingFlags.Public | BindingFlags.Static);
120-
GetDefaultMethodInfo = typeof(MaterializationHelper)
121-
.GetMethod(nameof(GetDefault), BindingFlags.Public | BindingFlags.Static);
122-
IsNullMethodInfo = typeof(MaterializationHelper)
123-
.GetMethod(nameof(IsNull), BindingFlags.Public | BindingFlags.Static);
124-
ThrowEmptySequenceExceptionMethodInfo = typeof(MaterializationHelper)
125-
.GetMethod(nameof(ThrowEmptySequenceException), BindingFlags.Public | BindingFlags.Static);
126-
PrefetchEntitySetMethodInfo = typeof(MaterializationHelper)
127-
.GetMethod(nameof(PrefetechEntitySet), BindingFlags.Public | BindingFlags.Static);
128-
}
129122
}
130123
}
Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Linq;
33
using System.Linq.Expressions;
44
using System.Reflection;
@@ -8,25 +8,16 @@ namespace Xtensive.Orm.Linq.Model
88
{
99
internal static class QueryableMethodInfo
1010
{
11-
public static readonly MethodInfo Select;
12-
public static readonly MethodInfo GroupBy;
13-
public static readonly MethodInfo GroupByWithElementSelector;
14-
public static readonly MethodInfo GroupByWithResultSelector;
15-
public static readonly MethodInfo GroupByWithElementAndResultSelectors;
11+
public static readonly MethodInfo Select = MethodOf(q => q.Select(o => o));
12+
public static readonly MethodInfo GroupBy = MethodOf(q => q.GroupBy(o => o));
13+
public static readonly MethodInfo GroupByWithElementSelector = MethodOf(q => q.GroupBy(o => o, o => o.ToString()));
14+
public static readonly MethodInfo GroupByWithResultSelector = MethodOf(q => q.GroupBy(o => o, (key, items) => items.Count()));
15+
public static readonly MethodInfo GroupByWithElementAndResultSelectors = MethodOf(q => q.GroupBy(o => o, o => o.ToString(), (key, items) => items.Count()));
1616

1717
private static MethodInfo MethodOf<T>(Expression<Func<IQueryable<object>, IQueryable<T>>> methodExpression)
1818
{
1919
var callExpression = (MethodCallExpression) methodExpression.Body.StripCasts();
2020
return callExpression.Method.GetGenericMethodDefinition();
2121
}
22-
23-
static QueryableMethodInfo()
24-
{
25-
Select = MethodOf(q => q.Select(o => o));
26-
GroupBy = MethodOf(q => q.GroupBy(o => o));
27-
GroupByWithElementSelector = MethodOf(q => q.GroupBy(o => o, o => o.ToString()));
28-
GroupByWithResultSelector = MethodOf(q => q.GroupBy(o => o, (key, items) => items.Count()));
29-
GroupByWithElementAndResultSelectors = MethodOf(q => q.GroupBy(o => o, o => o.ToString(), (key, items) => items.Count()));
30-
}
3122
}
32-
}
23+
}

0 commit comments

Comments
 (0)