From bcc710a8efa7d639c8f7eb188e9d1a585d1af0ec Mon Sep 17 00:00:00 2001 From: Timothy Makkison Date: Thu, 13 Jul 2023 23:02:09 +0100 Subject: [PATCH] chore: minor refactor for `GetAttributes` and `UserMethod*` --- .../UserDefinedExistingTargetMethodMapping.cs | 10 +++++----- .../UserDefinedNewInstanceGenericTypeMapping.cs | 3 +-- .../UserDefinedNewInstanceMethodMapping.cs | 9 ++++----- .../UserDefinedNewInstanceRuntimeTargetTypeMapping.cs | 7 +++---- ...inedNewInstanceRuntimeTargetTypeParameterMapping.cs | 3 +-- src/Riok.Mapperly/Descriptors/SymbolAccessor.cs | 8 +++++++- .../Descriptors/UserMethodMappingExtractor.cs | 9 ++------- src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs | 6 ++++++ 8 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedExistingTargetMethodMapping.cs b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedExistingTargetMethodMapping.cs index 691387afb2..1563f67a55 100644 --- a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedExistingTargetMethodMapping.cs +++ b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedExistingTargetMethodMapping.cs @@ -15,8 +15,10 @@ public class UserDefinedExistingTargetMethodMapping : MethodMapping, IUserMappin { private const string NoMappingComment = "// Could not generate mapping"; + private const string ReferenceHandlerTypeName = + "global::Riok.Mapperly.Abstractions.ReferenceHandling.Internal.PreserveReferenceHandler"; + private readonly bool _enableReferenceHandling; - private readonly INamedTypeSymbol _referenceHandlerType; private IExistingTargetMapping? _delegateMapping; public UserDefinedExistingTargetMethodMapping( @@ -24,13 +26,11 @@ public UserDefinedExistingTargetMethodMapping( MethodParameter sourceParameter, MethodParameter targetParameter, MethodParameter? referenceHandlerParameter, - bool enableReferenceHandling, - INamedTypeSymbol referenceHandlerType + bool enableReferenceHandling ) : base(method, sourceParameter, referenceHandlerParameter, targetParameter.Type) { _enableReferenceHandling = enableReferenceHandling; - _referenceHandlerType = referenceHandlerType; Method = method; TargetParameter = targetParameter; } @@ -68,7 +68,7 @@ public override IEnumerable BuildBody(TypeMappingBuildContext c { // var refHandler = new RefHandler(); var referenceHandlerName = ctx.NameBuilder.New(DefaultReferenceHandlerParameterName); - var createRefHandler = CreateInstance(_referenceHandlerType); + var createRefHandler = CreateInstance(ReferenceHandlerTypeName); yield return DeclareLocalVariable(referenceHandlerName, createRefHandler); ctx = ctx.WithRefHandler(referenceHandlerName); } diff --git a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceGenericTypeMapping.cs b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceGenericTypeMapping.cs index e97a4e3ca4..dc5d36098e 100644 --- a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceGenericTypeMapping.cs +++ b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceGenericTypeMapping.cs @@ -20,11 +20,10 @@ public UserDefinedNewInstanceGenericTypeMapping( GenericMappingTypeParameters typeParameters, MappingMethodParameters parameters, bool enableReferenceHandling, - INamedTypeSymbol referenceHandlerType, NullFallbackValue nullArm, ITypeSymbol objectType ) - : base(method, parameters.Source, parameters.ReferenceHandler, enableReferenceHandling, referenceHandlerType, nullArm, objectType) + : base(method, parameters.Source, parameters.ReferenceHandler, enableReferenceHandling, nullArm, objectType) { TypeParameters = typeParameters; } diff --git a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceMethodMapping.cs b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceMethodMapping.cs index 348737c2e5..05dd177b44 100644 --- a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceMethodMapping.cs +++ b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceMethodMapping.cs @@ -13,21 +13,20 @@ namespace Riok.Mapperly.Descriptors.Mappings.UserMappings; public class UserDefinedNewInstanceMethodMapping : MethodMapping, IDelegateUserMapping { private const string NoMappingComment = "// Could not generate mapping"; + private const string ReferenceHandlerTypeName = + "global::Riok.Mapperly.Abstractions.ReferenceHandling.Internal.PreserveReferenceHandler"; private readonly bool _enableReferenceHandling; - private readonly INamedTypeSymbol _referenceHandlerType; public UserDefinedNewInstanceMethodMapping( IMethodSymbol method, MethodParameter sourceParameter, MethodParameter? referenceHandlerParameter, - bool enableReferenceHandling, - INamedTypeSymbol referenceHandlerType + bool enableReferenceHandling ) : base(method, sourceParameter, referenceHandlerParameter, method.ReturnType.UpgradeNullable()) { _enableReferenceHandling = enableReferenceHandling; - _referenceHandlerType = referenceHandlerType; Method = method; } @@ -50,7 +49,7 @@ public override IEnumerable BuildBody(TypeMappingBuildContext c if (_enableReferenceHandling && ReferenceHandlerParameter == null) { // new RefHandler(); - var createRefHandler = CreateInstance(_referenceHandlerType); + var createRefHandler = CreateInstance(ReferenceHandlerTypeName); ctx = ctx.WithRefHandler(createRefHandler); return new[] { ReturnStatement(DelegateMapping.Build(ctx)) }; } diff --git a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeMapping.cs b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeMapping.cs index 01b6934fc4..5f179e9e6b 100644 --- a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeMapping.cs +++ b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeMapping.cs @@ -15,10 +15,11 @@ public abstract class UserDefinedNewInstanceRuntimeTargetTypeMapping : MethodMap { private const string IsAssignableFromMethodName = nameof(Type.IsAssignableFrom); private const string GetTypeMethodName = nameof(GetType); + private const string ReferenceHandlerTypeName = + "global::Riok.Mapperly.Abstractions.ReferenceHandling.Internal.PreserveReferenceHandler"; private readonly List _mappings = new(); private readonly bool _enableReferenceHandling; - private readonly INamedTypeSymbol _referenceHandlerType; private readonly NullFallbackValue _nullArm; private readonly ITypeSymbol _objectType; @@ -27,7 +28,6 @@ protected UserDefinedNewInstanceRuntimeTargetTypeMapping( MethodParameter sourceParameter, MethodParameter? referenceHandlerParameter, bool enableReferenceHandling, - INamedTypeSymbol referenceHandlerType, NullFallbackValue nullArm, ITypeSymbol objectType ) @@ -35,7 +35,6 @@ ITypeSymbol objectType { Method = method; _enableReferenceHandling = enableReferenceHandling; - _referenceHandlerType = referenceHandlerType; _nullArm = nullArm; _objectType = objectType; } @@ -61,7 +60,7 @@ public override IEnumerable BuildBody(TypeMappingBuildContext c { // var refHandler = new RefHandler(); var referenceHandlerName = ctx.NameBuilder.New(DefaultReferenceHandlerParameterName); - var createRefHandler = CreateInstance(_referenceHandlerType); + var createRefHandler = CreateInstance(ReferenceHandlerTypeName); yield return DeclareLocalVariable(referenceHandlerName, createRefHandler); ctx = ctx.WithRefHandler(referenceHandlerName); diff --git a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeParameterMapping.cs b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeParameterMapping.cs index 9052274ae4..59677216a8 100644 --- a/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeParameterMapping.cs +++ b/src/Riok.Mapperly/Descriptors/Mappings/UserMappings/UserDefinedNewInstanceRuntimeTargetTypeParameterMapping.cs @@ -18,11 +18,10 @@ public UserDefinedNewInstanceRuntimeTargetTypeParameterMapping( IMethodSymbol method, RuntimeTargetTypeMappingMethodParameters parameters, bool enableReferenceHandling, - INamedTypeSymbol referenceHandlerType, NullFallbackValue nullArm, ITypeSymbol objectType ) - : base(method, parameters.Source, parameters.ReferenceHandler, enableReferenceHandling, referenceHandlerType, nullArm, objectType) + : base(method, parameters.Source, parameters.ReferenceHandler, enableReferenceHandling, nullArm, objectType) { _targetTypeParameter = parameters.TargetType; } diff --git a/src/Riok.Mapperly/Descriptors/SymbolAccessor.cs b/src/Riok.Mapperly/Descriptors/SymbolAccessor.cs index c15a6eb52f..10a2d36cb9 100644 --- a/src/Riok.Mapperly/Descriptors/SymbolAccessor.cs +++ b/src/Riok.Mapperly/Descriptors/SymbolAccessor.cs @@ -21,8 +21,14 @@ public SymbolAccessor(WellKnownTypes types) internal IEnumerable GetAttributes(ISymbol symbol) where T : Attribute { + var attributes = GetAttributesCore(symbol); + if (attributes.IsEmpty) + { + yield break; + } + var attributeSymbol = _types.Get(); - foreach (var attr in GetAttributesCore(symbol)) + foreach (var attr in attributes) { if (SymbolEqualityComparer.Default.Equals(attr.AttributeClass?.ConstructedFrom ?? attr.AttributeClass, attributeSymbol)) { diff --git a/src/Riok.Mapperly/Descriptors/UserMethodMappingExtractor.cs b/src/Riok.Mapperly/Descriptors/UserMethodMappingExtractor.cs index 6a2f08b48f..887c1c1905 100644 --- a/src/Riok.Mapperly/Descriptors/UserMethodMappingExtractor.cs +++ b/src/Riok.Mapperly/Descriptors/UserMethodMappingExtractor.cs @@ -1,7 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Microsoft.CodeAnalysis; using Riok.Mapperly.Abstractions.ReferenceHandling; -using Riok.Mapperly.Abstractions.ReferenceHandling.Internal; using Riok.Mapperly.Descriptors.Mappings; using Riok.Mapperly.Descriptors.Mappings.UserMappings; using Riok.Mapperly.Diagnostics; @@ -104,7 +103,6 @@ bool isStatic methodSymbol, runtimeTargetTypeParams, ctx.MapperConfiguration.UseReferenceHandling, - ctx.Types.Get(), GetTypeSwitchNullArm(methodSymbol, runtimeTargetTypeParams, null), ctx.Compilation.ObjectType ); @@ -123,7 +121,6 @@ bool isStatic typeParameters.Value, parameters, ctx.MapperConfiguration.UseReferenceHandling, - ctx.Types.Get(), GetTypeSwitchNullArm(methodSymbol, parameters, typeParameters), ctx.Compilation.ObjectType ); @@ -142,8 +139,7 @@ bool isStatic parameters.Source, parameters.Target.Value, parameters.ReferenceHandler, - ctx.MapperConfiguration.UseReferenceHandling, - ctx.Types.Get() + ctx.MapperConfiguration.UseReferenceHandling ); } @@ -151,8 +147,7 @@ bool isStatic methodSymbol, parameters.Source, parameters.ReferenceHandler, - ctx.MapperConfiguration.UseReferenceHandling, - ctx.Types.Get() + ctx.MapperConfiguration.UseReferenceHandling ); } diff --git a/src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs b/src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs index 5246b7d294..14c74f4f61 100644 --- a/src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs +++ b/src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs @@ -354,6 +354,12 @@ public static LocalDeclarationStatementSyntax DeclareLocalVariable(string variab public static StatementSyntax CreateInstance(string variableName, ITypeSymbol typeSymbol) => DeclareLocalVariable(variableName, CreateInstance(typeSymbol)); + public static ObjectCreationExpressionSyntax CreateInstance(string typeName) + { + var type = IdentifierName(typeName); + return ObjectCreationExpression(type).WithArgumentList(SyntaxFactory.ArgumentList()); + } + public static ObjectCreationExpressionSyntax CreateInstance(ITypeSymbol typeSymbol) { var type = NonNullableIdentifier(typeSymbol);