Skip to content

Commit

Permalink
feat: explicit fallback map fix
Browse files Browse the repository at this point in the history
  • Loading branch information
BeeTwin committed Sep 29, 2024
1 parent e49f71d commit d7976ad
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ private static EnumToStringMapping BuildEnumToStringMapping(MappingBuilderContex
var fallbackMapping = BuildFallbackMapping(ctx, out var fallbackStringValue);
var enumMemberMappings = BuildEnumMemberMappings(ctx, fallbackStringValue);

if (fallbackMapping.FallbackExpression is LiteralExpressionSyntax fallbackLiteral)
if (fallbackStringValue is not null)
{
enumMemberMappings = enumMemberMappings.Where(IsNotEquivalentTo(fallbackLiteral));
enumMemberMappings = enumMemberMappings.Where(m =>
!m.TargetSyntax.ToString().Equals(fallbackStringValue, StringComparison.Ordinal)
);
}

return new EnumToStringMapping(ctx.Source, ctx.Target, enumMemberMappings, fallbackMapping);
Expand Down Expand Up @@ -126,11 +128,4 @@ private static EnumFallbackValueMapping BuildFallbackMapping(MappingBuilderConte
fallbackStringValue = fallbackString;
return new EnumFallbackValueMapping(ctx.Source, ctx.Target, fallbackExpression: StringLiteral(fallbackString));
}

private static Func<EnumMemberMapping, bool> IsNotEquivalentTo(LiteralExpressionSyntax fallbackLiteral) =>
mapping =>
!(
mapping.TargetSyntax is LiteralExpressionSyntax targetLiteral
&& fallbackLiteral.ToString().Equals(targetLiteral.ToString(), StringComparison.Ordinal)
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,12 @@ bool genericEnumParseMethodSupported
// from string => use an optimized method of Enum.Parse which would use slow reflection
// however we currently don't support all features of Enum.Parse yet (ex. flags)
// therefore we use Enum.Parse as fallback.
if (fallbackMapping.FallbackExpression is MemberAccessExpressionSyntax fallbackMember2)
if (fallbackMember is not null)
{
// no need to explicitly map fallback value
enumMemberMappings = enumMemberMappings.Where(IsNotEquivalentTo(fallbackMember2));
enumMemberMappings = enumMemberMappings.Where(m =>
!m.TargetSyntax.ToString().Equals(fallbackMember.Name, StringComparison.Ordinal)
);
}

return new EnumFromStringSwitchMapping(
Expand Down Expand Up @@ -208,12 +210,4 @@ private static IReadOnlyDictionary<IFieldSymbol, HashSet<ExpressionSyntax>> Buil

return explicitMappings;
}

private static Func<EnumMemberMapping, bool> IsNotEquivalentTo(MemberAccessExpressionSyntax fallbackMember) =>
mapping =>
!(
mapping.TargetSyntax is MemberAccessExpressionSyntax targetMember
&& fallbackMember.Expression.IsEquivalentTo(targetMember.Expression)
&& fallbackMember.Name.ToString().Equals(targetMember.Name.ToString(), StringComparison.Ordinal)
);
}

0 comments on commit d7976ad

Please sign in to comment.