Skip to content

Commit

Permalink
collection expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
lbargaoanu committed May 14, 2024
1 parent 6bb05d5 commit 0ce8e13
Show file tree
Hide file tree
Showing 20 changed files with 88 additions and 93 deletions.
8 changes: 4 additions & 4 deletions src/AutoMapper/Configuration/INamingConvention.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public interface INamingConvention
public sealed class ExactMatchNamingConvention : INamingConvention
{
public static readonly ExactMatchNamingConvention Instance = new();
public string[] Split(string _) => Array.Empty<string>();
public string[] Split(string _) => [];
public string SeparatorCharacter => null;
}
public sealed class PascalCaseNamingConvention : INamingConvention
Expand All @@ -26,17 +26,17 @@ public string[] Split(string input)
{
if (char.IsUpper(input[index]))
{
result ??= new();
result ??= [];
result.Add(input[lower..index]);
lower = index;
}
}
if (result == null)
{
return Array.Empty<string>();
return [];
}
result.Add(input[lower..]);
return result.ToArray();
return [..result];
}
}
public sealed class LowerUnderscoreNamingConvention : INamingConvention
Expand Down
24 changes: 12 additions & 12 deletions src/AutoMapper/Configuration/MapperConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,24 @@ public sealed class MapperConfiguration : IGlobalConfiguration
private readonly ConfigurationValidator _validator;
private readonly Features<IRuntimeFeature> _features = new();
private readonly bool _hasOpenMaps;
private readonly HashSet<TypeMap> _typeMapsPath = new();
private readonly List<MemberInfo> _sourceMembers = new();
private readonly List<ParameterExpression> _variables = new();
private readonly ParameterExpression[] _parameters = new[] { null, null, ContextParameter };
private readonly CatchBlock[] _catches = new CatchBlock[1];
private readonly List<Expression> _expressions = new();
private readonly HashSet<TypeMap> _typeMapsPath = [];
private readonly List<MemberInfo> _sourceMembers = [];
private readonly List<ParameterExpression> _variables = [];
private readonly ParameterExpression[] _parameters = [null, null, ContextParameter];
private readonly CatchBlock[] _catches = [null];
private readonly List<Expression> _expressions = [];
private readonly Dictionary<Type, DefaultExpression> _defaults;
private readonly ParameterReplaceVisitor _parameterReplaceVisitor = new();
private readonly ConvertParameterReplaceVisitor _convertParameterReplaceVisitor = new();
private readonly List<Type> _typesInheritance = new();
private readonly List<Type> _typesInheritance = [];
public MapperConfiguration(MapperConfigurationExpression configurationExpression)
{
var configuration = (IGlobalConfigurationExpression)configurationExpression;
if (configuration.MethodMappingEnabled != false)
{
configuration.IncludeSourceExtensionMethods(typeof(Enumerable));
}
_mappers = configuration.Mappers.ToArray();
_mappers = [..configuration.Mappers];
_executionPlans = new(CompileExecutionPlan);
_validator = new(configuration);
_projectionBuilder = new(CreateProjectionBuilder);
Expand Down Expand Up @@ -224,7 +224,7 @@ LambdaExpression GenerateObjectMapperExpression(in MapRequest mapRequest, IObjec
}
}
IGlobalConfigurationExpression ConfigurationExpression => _validator.Expression;
ProjectionBuilder CreateProjectionBuilder() => new(this, ConfigurationExpression.ProjectionMappers.ToArray());
ProjectionBuilder CreateProjectionBuilder() => new(this, [..ConfigurationExpression.ProjectionMappers]);
IProjectionBuilder IGlobalConfiguration.ProjectionBuilder => _projectionBuilder.Value;
Func<Type, object> IGlobalConfiguration.ServiceCtor => ConfigurationExpression.ServiceCtor;
bool IGlobalConfiguration.EnableNullPropagationForQueryMapping => ConfigurationExpression.EnableNullPropagationForQueryMapping.GetValueOrDefault();
Expand Down Expand Up @@ -320,7 +320,7 @@ private TypeMap GetTypeMap(TypePair initialTypes)
List<Type> typesInheritance;
if (_typesInheritance == null)
{
typesInheritance = new();
typesInheritance = [];
}
else
{
Expand Down Expand Up @@ -432,7 +432,7 @@ TypeMap[] IGlobalConfiguration.GetIncludedTypeMaps(IReadOnlyCollection<TypePair>
{
if (includedTypes.Count == 0)
{
return Array.Empty<TypeMap>();
return [];
}
var typeMaps = new TypeMap[includedTypes.Count];
int index = 0;
Expand Down Expand Up @@ -476,7 +476,7 @@ IObjectMapper FindMapper(TypePair types)
return null;
}
void IGlobalConfiguration.RegisterTypeMap(TypeMap typeMap) => _configuredMaps[typeMap.Types] = typeMap;
void IGlobalConfiguration.AssertConfigurationIsValid(TypeMap typeMap) => _validator.AssertConfigurationIsValid(this, new[] { typeMap });
void IGlobalConfiguration.AssertConfigurationIsValid(TypeMap typeMap) => _validator.AssertConfigurationIsValid(this, [typeMap]);
void IGlobalConfiguration.AssertConfigurationIsValid(string profileName)
{
if (Array.TrueForAll(Profiles, x => x.Name != profileName))
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Configuration/MappingExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ public sealed class MappingExpression : MappingExpressionBase<object, object, IM
{
public MappingExpression(TypePair types, MemberList memberList) : base(memberList, types){}
public MappingExpression(TypeMap typeMap) : this(typeMap.Types, typeMap.ConfiguredMemberList) => Projection = typeMap.Projection;
public string[] IncludedMembersNames { get; internal set; } = Array.Empty<string>();
public string[] IncludedMembersNames { get; internal set; } = [];
public IMappingExpression ReverseMap()
{
var reversedTypes = new TypePair(DestinationType, SourceType);
Expand Down
18 changes: 9 additions & 9 deletions src/AutoMapper/Configuration/Profile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ public interface IProfileConfiguration
/// </summary>
public class Profile : IProfileExpressionInternal, IProfileConfiguration
{
private readonly List<string> _prefixes = new() { "Get" };
private readonly List<string> _postfixes = new();
private readonly List<TypeMapConfiguration> _typeMapConfigs = new();
private readonly List<string> _prefixes = ["Get"];
private readonly List<string> _postfixes = [];
private readonly List<TypeMapConfiguration> _typeMapConfigs = [];
private readonly PrePostfixName _prePostfixName = new();
private ReplaceName _replaceName;
private readonly MemberConfiguration _memberConfiguration;
Expand Down Expand Up @@ -108,20 +108,20 @@ public INamingConvention DestinationMemberNamingConvention
get => _memberConfiguration.DestinationNamingConvention;
set => _memberConfiguration.DestinationNamingConvention = value;
}
public List<ValueTransformerConfiguration> ValueTransformers => _valueTransformerConfigs ??= new();
public List<ValueTransformerConfiguration> ValueTransformers => _valueTransformerConfigs ??= [];
List<string> IProfileExpressionInternal.Prefixes => _prefixes;
List<string> IProfileExpressionInternal.Postfixes => _postfixes;
public void DisableConstructorMapping() => _constructorMappingEnabled = false;

void IProfileExpressionInternal.ForAllMaps(Action<TypeMap, IMappingExpression> configuration)
{
_allTypeMapActions ??= new();
_allTypeMapActions ??= [];
_allTypeMapActions.Add(configuration);
}

void IProfileExpressionInternal.ForAllPropertyMaps(Func<PropertyMap, bool> condition, Action<PropertyMap, IMemberConfigurationExpression> configuration)
{
_allPropertyMapActions ??= new();
_allPropertyMapActions ??= [];
_allPropertyMapActions.Add(new(condition, configuration));
}
public IProjectionExpression<TSource, TDestination> CreateProjection<TSource, TDestination>() =>
Expand Down Expand Up @@ -149,7 +149,7 @@ public IMappingExpression CreateMap(Type sourceType, Type destinationType, Membe
_typeMapConfigs.Add(map);
if (types.ContainsGenericParameters)
{
_openTypeMapConfigs ??= new();
_openTypeMapConfigs ??= [];
_openTypeMapConfigs.Add(map);
}
return map;
Expand All @@ -170,12 +170,12 @@ public void ReplaceMemberName(string original, string newValue)
public void RecognizeDestinationPostfixes(params string[] postfixes) => _prePostfixName.DestinationPostfixes.TryAdd(postfixes);
public void AddGlobalIgnore(string propertyNameStartingWith)
{
_globalIgnores ??= new();
_globalIgnores ??= [];
_globalIgnores.Add(propertyNameStartingWith);
}
public void IncludeSourceExtensionMethods(Type type)
{
_sourceExtensionMethods ??= new();
_sourceExtensionMethods ??= [];
_sourceExtensionMethods.AddRange(
type.GetMethods(Internal.TypeExtensions.StaticFlags).Where(m => m.Has<ExtensionAttribute>() && m.GetParameters().Length == 1));
}
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Configuration/TypeMapConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ private void MapDestinationCtorToSource(TypeMap typeMap, List<MemberInfo> source
bool IsConfigured(ParameterInfo parameter) => _ctorParamConfigurations?.Any(c => c.CtorParamName == parameter.Name) is true;
}
protected IEnumerable<IPropertyMapConfiguration> MapToSourceMembers() =>
_memberConfigurations?.Where(m => m.SourceExpression != null && m.SourceExpression.Body == m.SourceExpression.Parameters[0]) ?? Array.Empty<IPropertyMapConfiguration>();
_memberConfigurations?.Where(m => m.SourceExpression != null && m.SourceExpression.Body == m.SourceExpression.Parameters[0]) ?? [];
private void ReverseIncludedMembers(TypeMap typeMap)
{
Stack<Member> chain = null;
Expand Down
4 changes: 2 additions & 2 deletions src/AutoMapper/ConstructorMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
public sealed class ConstructorMap
{
private bool? _canResolve;
private readonly List<ConstructorParameterMap> _ctorParams = new();
private readonly List<ConstructorParameterMap> _ctorParams = [];
public ConstructorInfo Ctor { get; private set; }
public IReadOnlyCollection<ConstructorParameterMap> CtorParams => _ctorParams;
public void Reset(ConstructorInfo ctor)
Expand Down Expand Up @@ -76,7 +76,7 @@ public ConstructorParameterMap(TypeMap typeMap, ParameterInfo parameter, MemberI
}
else
{
SourceMembers = Array.Empty<MemberInfo>();
SourceMembers = [];
}
}
public ParameterInfo Parameter { get; }
Expand Down
8 changes: 4 additions & 4 deletions src/AutoMapper/Execution/ExpressionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public static (List<ParameterExpression> Variables, List<Expression> Expressions
var variables = configuration?.Variables;
if (variables == null)
{
variables = new();
variables = [];
}
else
{
Expand All @@ -51,7 +51,7 @@ public static (List<ParameterExpression> Variables, List<Expression> Expressions
var expressions = configuration?.Expressions;
if (expressions == null)
{
expressions = new();
expressions = [];
}
else
{
Expand Down Expand Up @@ -234,7 +234,7 @@ public static MemberInfo[] ToMemberInfos(this Stack<Member> chain)
}
public static Stack<Member> GetChain(this Expression expression)
{
var stack = new Stack<Member>();
Stack<Member> stack = [];
while (expression != null)
{
var member = expression switch
Expand All @@ -260,7 +260,7 @@ public static IEnumerable<MemberExpression> GetMemberExpressions(this Expression
{
if (expression is not MemberExpression memberExpression)
{
return Array.Empty<MemberExpression>();
return [];
}
return expression.GetChain().Select(m => m.Expression as MemberExpression).TakeWhile(m => m != null);
}
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Execution/ProxyGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ void GenerateConstructor()
ctorIl.Emit(OpCodes.Ret);
}
}
public static Type GetProxyType(Type interfaceType) => ProxyTypes.GetOrAdd(new(interfaceType, Array.Empty<PropertyDescription>()));
public static Type GetProxyType(Type interfaceType) => ProxyTypes.GetOrAdd(new(interfaceType, []));
public static Type GetSimilarType(Type sourceType, IEnumerable<PropertyDescription> additionalProperties) =>
ProxyTypes.GetOrAdd(new(sourceType, additionalProperties.OrderBy(p=>p.Name).ToArray()));
class PropertyEmitter
Expand Down
20 changes: 10 additions & 10 deletions src/AutoMapper/Execution/TypeMapPlanBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public TypeMapPlanBuilder(IGlobalConfiguration configuration, TypeMap typeMap)
_variables = configuration.Variables;
_expressions = configuration.Expressions;
_catches = configuration.Catches;
_parameters = _configuration.Parameters ?? new ParameterExpression[] { null, null, ContextParameter };
_parameters = _configuration.Parameters ?? [null, null, ContextParameter];
}
public Type DestinationType => _destination.Type;
private static AutoMapperMappingException MemberMappingError(Exception innerException, MemberMap memberMap) => new("Error mapping types.", innerException, memberMap);
Expand All @@ -43,9 +43,9 @@ public LambdaExpression CreateMapperLambda()
{
return Lambda(customExpression, parameters);
}
_variables ??= new();
_expressions ??= new();
_catches ??= new CatchBlock[1];
_variables ??= [];
_expressions ??= [];
_catches ??= [null];
var typeMapsPath = _configuration.TypeMapsPath;
Clear(ref typeMapsPath);
CheckForCycles(_configuration, _typeMap, typeMapsPath);
Expand All @@ -71,7 +71,7 @@ static void Clear(ref HashSet<TypeMap> typeMapsPath)
{
if (typeMapsPath == null)
{
typeMapsPath = new HashSet<TypeMap>();
typeMapsPath = [];
}
else
{
Expand Down Expand Up @@ -169,7 +169,7 @@ private Expression CreateDestinationFunc()
Expression ReplaceParameters(LambdaExpression lambda) => _configuration.ReplaceParameters(lambda, GetParameters());
private Expression CreateAssignmentFunc(Expression createDestination)
{
List<Expression> actions = new() { createDestination };
List<Expression> actions = [createDestination];
Expression typeMapExpression = null;
var hasMaxDepth = _typeMap.MaxDepth > 0;
if (hasMaxDepth)
Expand Down Expand Up @@ -299,8 +299,8 @@ private Expression CheckReferencesCache(Expression valueBuilder)
};
private Expression ConstructorMapping(ConstructorMap constructorMap)
{
List<ParameterExpression> variables = new();
List<Expression> body = new();
List<ParameterExpression> variables = [];
List<Expression> body = [];
foreach (var parameter in constructorMap.CtorParams)
{
var variable = Variable(parameter.DestinationType, parameter.DestinationName);
Expand Down Expand Up @@ -357,7 +357,7 @@ private Expression CreatePropertyMapFunc(MemberMap memberMap, Expression destina
if (memberMap.Condition != null)
{
_expressions.Add(IfThen(
_configuration.ConvertReplaceParameters(memberMap.Condition, new[] { customSource, _destination, mappedMemberVariable, destinationMemberGetter, ContextParameter }),
_configuration.ConvertReplaceParameters(memberMap.Condition, [customSource, _destination, mappedMemberVariable, destinationMemberGetter, ContextParameter]),
mapperExpr));
}
else if (!destinationMemberReadOnly)
Expand Down Expand Up @@ -468,7 +468,7 @@ public class FuncResolver : LambdaValueResolver, IValueResolver
{
public FuncResolver(LambdaExpression lambda) : base(lambda) { }
public Expression GetExpression(IGlobalConfiguration configuration, MemberMap memberMap, Expression source, Expression destination, Expression destinationMember) =>
configuration.ConvertReplaceParameters(Lambda, new[] { source, destination, destinationMember, ContextParameter });
configuration.ConvertReplaceParameters(Lambda, [source, destination, destinationMember, ContextParameter]);
public MemberInfo GetSourceMember(MemberMap _) => null;
}
public class ExpressionResolver : LambdaValueResolver, IValueResolver
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Features.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void Set(TFeature feature)
}
else
{
_features ??= new();
_features ??= [];
_features.Add(feature);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Internal/MemberPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
[EditorBrowsable(EditorBrowsableState.Never)]
public readonly record struct MemberPath(MemberInfo[] Members)
{
public static readonly MemberPath Empty = new(Array.Empty<MemberInfo>());
public static readonly MemberPath Empty = new(Members: []);
public MemberPath(Stack<Member> members) : this(members.ToMemberInfos()){}
public MemberInfo Last => Members[^1];
public MemberInfo First => Members[0];
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Internal/PrimitiveHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static List<T> TryAdd<T>(this List<T> list, IEnumerable<T> values)
return list;
}
public static ReadOnlyCollection<T> ToReadOnly<T>(this T item) where T : Expression => new ReadOnlyCollectionBuilder<T>{ item }.ToReadOnlyCollection();
public static IReadOnlyCollection<T> NullCheck<T>(this IReadOnlyCollection<T> source) => source ?? Array.Empty<T>();
public static IReadOnlyCollection<T> NullCheck<T>(this IReadOnlyCollection<T> source) => source ?? [];
public static IEnumerable<T> Concat<T>(this IReadOnlyCollection<T> collection, IReadOnlyCollection<T> otherCollection)
{
if (otherCollection == null || otherCollection.Count == 0)
Expand Down
6 changes: 3 additions & 3 deletions src/AutoMapper/Internal/TypeDetails.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,12 @@ public static string[] PossibleNames(string memberName, List<string> prefixes, L
continue;
}
var withoutPrefix = memberName[prefix.Length..];
result ??= new();
result ??= [];
result.Add(withoutPrefix);
PostFixes(ref result, postfixes, withoutPrefix);
}
PostFixes(ref result, postfixes, memberName);
return result == null ? Array.Empty<string>() : result.ToArray();
return result == null ? [] : [..result];
static void PostFixes(ref List<string> result, List<string> postfixes, string name)
{
foreach (var postfix in postfixes)
Expand All @@ -149,7 +149,7 @@ static void PostFixes(ref List<string> result, List<string> postfixes, string na
{
continue;
}
result ??= new();
result ??= [];
result.Add(name[..^postfix.Length]);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/AutoMapper/MemberMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public void SetResolver(IValueResolver resolver)
Ignored = false;
}
public virtual Type SourceType => _sourceType ??= GetSourceType();
public virtual MemberInfo[] SourceMembers { get => Array.Empty<MemberInfo>(); set { } }
public virtual MemberInfo[] SourceMembers { get => []; set { } }
public virtual IncludedMember IncludedMember { get => default; protected set { } }
public virtual string DestinationName => default;
public virtual Type DestinationType { get => default; protected set { } }
Expand All @@ -36,7 +36,7 @@ public void SetResolver(IValueResolver resolver)
public virtual LambdaExpression PreCondition { get => default; set { } }
public virtual LambdaExpression Condition { get => default; set { } }
public IValueResolver Resolver { get; protected set; }
public virtual IReadOnlyCollection<ValueTransformerConfiguration> ValueTransformers => Array.Empty<ValueTransformerConfiguration>();
public virtual IReadOnlyCollection<ValueTransformerConfiguration> ValueTransformers => [];
public MemberInfo SourceMember => Resolver?.GetSourceMember(this);
public string GetSourceMemberName() => Resolver?.SourceMemberName ?? SourceMember?.Name;
public bool MustUseDestination => UseDestinationValue is true || !CanBeSet;
Expand Down

0 comments on commit 0ce8e13

Please sign in to comment.