Skip to content

Commit

Permalink
fix: upgrade parameter nullability correctly (#1057)
Browse files Browse the repository at this point in the history
  • Loading branch information
latonz committed Jan 10, 2024
1 parent 54b0eea commit ad917ee
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 10 deletions.
Expand Up @@ -262,8 +262,8 @@ private static void BuildConstructorMapping(INewInstanceBuilderContext<IMapping>
}

// nullability is handled inside the member mapping
var paramType = parameter.Type.WithNullableAnnotation(parameter.NullableAnnotation);
var typeMapping = new TypeMappingKey(sourcePath.MemberType, paramType, memberConfig?.ToTypeMappingConfiguration());
var parameterType = ctx.BuilderContext.SymbolAccessor.UpgradeNullable(parameter.Type);
var typeMapping = new TypeMappingKey(sourcePath.MemberType, parameterType, memberConfig?.ToTypeMappingConfiguration());
var delegateMapping = ctx.BuilderContext.FindOrBuildLooseNullableMapping(
typeMapping,
diagnosticLocation: memberConfig?.Location
Expand Down Expand Up @@ -295,8 +295,8 @@ private static void BuildConstructorMapping(INewInstanceBuilderContext<IMapping>
var memberMapping = new NullMemberMapping(
delegateMapping,
getterSourcePath,
paramType,
ctx.BuilderContext.GetNullFallbackValue(paramType),
parameterType,
ctx.BuilderContext.GetNullFallbackValue(parameterType),
!ctx.BuilderContext.IsExpression
);
var ctorMapping = new ConstructorParameterMapping(parameter, memberMapping, skippedOptionalParam);
Expand Down
Expand Up @@ -81,8 +81,8 @@ private static void BuildTupleConstructorMapping(INewValueTupleBuilderContext<IN
}

// nullability is handled inside the member expressionMapping
var paramType = targetMember.Type.WithNullableAnnotation(targetMember.NullableAnnotation);
var mappingKey = new TypeMappingKey(sourcePath.MemberType, paramType, memberConfig?.ToTypeMappingConfiguration());
var targetMemberType = ctx.BuilderContext.SymbolAccessor.UpgradeNullable(targetMember.Type);
var mappingKey = new TypeMappingKey(sourcePath.MemberType, targetMemberType, memberConfig?.ToTypeMappingConfiguration());
var delegateMapping = ctx.BuilderContext.FindOrBuildLooseNullableMapping(
mappingKey,
diagnosticLocation: memberConfig?.Location
Expand Down Expand Up @@ -118,8 +118,8 @@ private static void BuildTupleConstructorMapping(INewValueTupleBuilderContext<IN
var memberMapping = new NullMemberMapping(
delegateMapping,
getterSourcePath,
paramType,
ctx.BuilderContext.GetNullFallbackValue(paramType),
targetMemberType,
ctx.BuilderContext.GetNullFallbackValue(targetMemberType),
!ctx.BuilderContext.IsExpression
);

Expand Down
Expand Up @@ -13,6 +13,10 @@ bool selfOrPreviousIsUnmappedOptional
{
private readonly bool _selfOrPreviousIsUnmappedOptional = selfOrPreviousIsUnmappedOptional;

/// <summary>
/// The parameter of the constructor.
/// Note: the nullability of it may not be "upgraded".
/// </summary>
public IParameterSymbol Parameter { get; } = parameter;

public NullMemberMapping DelegateMapping { get; } = delegateMapping;
Expand Down
Expand Up @@ -7,6 +7,10 @@ namespace Riok.Mapperly.Descriptors.Mappings.MemberMappings;

public class ValueTupleConstructorParameterMapping(IFieldSymbol parameter, NullMemberMapping delegateMapping)
{
/// <summary>
/// The parameter the value tuple.
/// Note: the nullability of it may not be "upgraded".
/// </summary>
public IFieldSymbol Parameter { get; } = parameter;

public NullMemberMapping DelegateMapping { get; } = delegateMapping;
Expand Down
2 changes: 1 addition & 1 deletion src/Riok.Mapperly/Descriptors/TypeMappingKey.cs
Expand Up @@ -5,7 +5,7 @@

namespace Riok.Mapperly.Descriptors;

[DebuggerDisplay("{Source.Name} => {Target.Name}")]
[DebuggerDisplay("{Source} => {Target}")]
public readonly struct TypeMappingKey(
ITypeSymbol source,
ITypeSymbol target,
Expand Down
2 changes: 1 addition & 1 deletion test/Riok.Mapperly.Tests/Mapping/UseMapperTest.cs
Expand Up @@ -306,7 +306,7 @@ public void DisabledNullableShouldWork()
"""
if (source == null)
return default;
var target = new global::B(source.Value != null ? MapToBExternal(source.Value) : default);
var target = new global::B(_otherMapper.ToBExternal(source.Value));
return target;
"""
);
Expand Down

0 comments on commit ad917ee

Please sign in to comment.