Skip to content

Commit

Permalink
chore: minor refactor for GetAttributes and UserMethod*
Browse files Browse the repository at this point in the history
  • Loading branch information
TimothyMakkison committed Jul 13, 2023
1 parent dd3092d commit 1ffb2f7
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,22 @@ 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(
IMethodSymbol method,
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;
}
Expand Down Expand Up @@ -68,7 +68,7 @@ public override IEnumerable<StatementSyntax> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -50,7 +49,7 @@ public override IEnumerable<StatementSyntax> 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)) };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<RuntimeTargetTypeMapping> _mappings = new();
private readonly bool _enableReferenceHandling;
private readonly INamedTypeSymbol _referenceHandlerType;
private readonly NullFallbackValue _nullArm;
private readonly ITypeSymbol _objectType;

Expand All @@ -27,15 +28,13 @@ protected UserDefinedNewInstanceRuntimeTargetTypeMapping(
MethodParameter sourceParameter,
MethodParameter? referenceHandlerParameter,
bool enableReferenceHandling,
INamedTypeSymbol referenceHandlerType,
NullFallbackValue nullArm,
ITypeSymbol objectType
)
: base(method, sourceParameter, referenceHandlerParameter, method.ReturnType)
{
Method = method;
_enableReferenceHandling = enableReferenceHandling;
_referenceHandlerType = referenceHandlerType;
_nullArm = nullArm;
_objectType = objectType;
}
Expand All @@ -61,7 +60,7 @@ public override IEnumerable<StatementSyntax> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
11 changes: 9 additions & 2 deletions src/Riok.Mapperly/Descriptors/SymbolAccessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,16 @@ public SymbolAccessor(WellKnownTypes types)
internal IEnumerable<AttributeData> GetAttributes<T>(ISymbol symbol)
where T : Attribute
{
var attributes = GetAttributesCore(symbol);
if (attributes.IsEmpty)
{
return Enumerable.Empty<AttributeData>();
}

var attributeSymbol = _types.Get<T>();
return GetAttributesCore(symbol)
.Where(x => SymbolEqualityComparer.Default.Equals(x.AttributeClass?.ConstructedFrom ?? x.AttributeClass, attributeSymbol));
return attributes.Where(
x => SymbolEqualityComparer.Default.Equals(x.AttributeClass?.ConstructedFrom ?? x.AttributeClass, attributeSymbol)
);
}

internal bool HasAttribute<T>(ISymbol symbol)
Expand Down
8 changes: 2 additions & 6 deletions src/Riok.Mapperly/Descriptors/UserMethodMappingExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ bool isStatic
methodSymbol,
runtimeTargetTypeParams,
ctx.MapperConfiguration.UseReferenceHandling,
ctx.Types.Get<PreserveReferenceHandler>(),
GetTypeSwitchNullArm(methodSymbol, runtimeTargetTypeParams, null),
ctx.Compilation.ObjectType
);
Expand All @@ -123,7 +122,6 @@ bool isStatic
typeParameters.Value,
parameters,
ctx.MapperConfiguration.UseReferenceHandling,
ctx.Types.Get<PreserveReferenceHandler>(),
GetTypeSwitchNullArm(methodSymbol, parameters, typeParameters),
ctx.Compilation.ObjectType
);
Expand All @@ -142,17 +140,15 @@ bool isStatic
parameters.Source,
parameters.Target.Value,
parameters.ReferenceHandler,
ctx.MapperConfiguration.UseReferenceHandling,
ctx.Types.Get<PreserveReferenceHandler>()
ctx.MapperConfiguration.UseReferenceHandling
);
}

return new UserDefinedNewInstanceMethodMapping(
methodSymbol,
parameters.Source,
parameters.ReferenceHandler,
ctx.MapperConfiguration.UseReferenceHandling,
ctx.Types.Get<PreserveReferenceHandler>()
ctx.MapperConfiguration.UseReferenceHandling
);
}

Expand Down
6 changes: 6 additions & 0 deletions src/Riok.Mapperly/Emit/SyntaxFactoryHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 1ffb2f7

Please sign in to comment.