Skip to content

Commit

Permalink
Improved default value generation
Browse files Browse the repository at this point in the history
Rebaselined
=> release
  • Loading branch information
hugener committed Mar 29, 2024
1 parent 03438d8 commit 44443ec
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,19 @@ private static bool HasConflictingName(INamedTypeSymbol discriminatedUnionNameTy

return selectedConstructor.Parameters.Select(x =>
{
string GetDefaultValue(IParameterSymbol parameterSymbol)
{
return (parameterSymbol.ExplicitDefaultValue, parameterSymbol.Type.TypeKind) switch
{
(bool value, _) => value ? GeneratorConstants.True : GeneratorConstants.False,
({ } enumValue, TypeKind.Enum) => x.Type.GetMembers().OfType<IFieldSymbol>().Where(x => x.IsStatic).First(x => x.ConstantValue == enumValue).ToDisplayString(CodeAnalysisHelper.FullyQualifiedParameterTypeFormat),
({ } enumValue, _) => enumValue.ToString(),
_ => GeneratorConstants.Default,
};
}

var typeName = x.Type.ToDisplayString(CodeAnalysisHelper.FullyQualifiedParameterTypeFormat);
var defaultValue = x.HasExplicitDefaultValue ? x.ExplicitDefaultValue?.ToString() ?? GeneratorConstants.Null : default;
var defaultValue = x.HasExplicitDefaultValue ? GetDefaultValue(x) : default;
return new Parameter(typeName, x.Name.Uncapitalize().AvoidKeywordCollision(), defaultValue);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,8 @@ internal static class GeneratorConstants
public const string Struct = "struct";
public const string NewConstructor = "new()";
public const string Record = "record";
public const string Default = "default";
public const string Null = "null";
public const string True = "true";
public const string False = "false";
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@ public partial record MixedUnion
/// Factory method for the Case1 case.
/// </summary>
/// <param name="info">The info.</param>
/// <param name="isValid">The isValid.</param>
/// <param name="status">The status.</param>
/// <param name="number">The number.</param>
/// <returns>A new Case1.</returns>
[Sundew.DiscriminatedUnions.CaseType(typeof(global::Sundew.DiscriminatedUnions.Tester.MixedUnion.Case1))]
public static global::Sundew.DiscriminatedUnions.Tester.MixedUnion _Case1(string info)
=> new global::Sundew.DiscriminatedUnions.Tester.MixedUnion.Case1(info);
public static global::Sundew.DiscriminatedUnions.Tester.MixedUnion _Case1(string info, bool isValid = false, global::Sundew.DiscriminatedUnions.Tester.Status status = global::Sundew.DiscriminatedUnions.Tester.Status.On, int number = 3)
=> new global::Sundew.DiscriminatedUnions.Tester.MixedUnion.Case1(info, isValid, status, number);

/// <summary>
/// Factory method for the Case2 case.
Expand All @@ -34,7 +37,7 @@ public partial record MixedUnion
/// <param name="optionalInts">The optionalInts.</param>
/// <returns>A new Case2.</returns>
[Sundew.DiscriminatedUnions.CaseType(typeof(global::Sundew.DiscriminatedUnions.Tester.Case2))]
public static global::Sundew.DiscriminatedUnions.Tester.MixedUnion Case2(int? info = 4, global::System.Collections.Generic.List<string?>? optionalList = null, global::System.Collections.Generic.List<int?>? optionalInts = null)
public static global::Sundew.DiscriminatedUnions.Tester.MixedUnion Case2(int? info = 4, global::System.Collections.Generic.List<string?>? optionalList = default, global::System.Collections.Generic.List<int?>? optionalInts = default)
=> new global::Sundew.DiscriminatedUnions.Tester.Case2(info, optionalList, optionalInts);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,19 @@ private static bool HasConflictingName(INamedTypeSymbol discriminatedUnionNameTy

return selectedConstructor.Parameters.Select(x =>
{
string GetDefaultValue(IParameterSymbol parameterSymbol)
{
return (parameterSymbol.ExplicitDefaultValue, parameterSymbol.Type.TypeKind) switch
{
(bool value, _) => value ? GeneratorConstants.True : GeneratorConstants.False,
({ } enumValue, TypeKind.Enum) => x.Type.GetMembers().OfType<IFieldSymbol>().Where(x => x.IsStatic).First(x => x.ConstantValue == enumValue).ToDisplayString(CodeAnalysisHelper.FullyQualifiedParameterTypeFormat),
({ } enumValue, _) => enumValue.ToString(),
_ => GeneratorConstants.Default,
};
}

var typeName = x.Type.ToDisplayString(CodeAnalysisHelper.FullyQualifiedParameterTypeFormat);
var defaultValue = x.HasExplicitDefaultValue ? x.ExplicitDefaultValue?.ToString() ?? GeneratorConstants.Null : default;
var defaultValue = x.HasExplicitDefaultValue ? GetDefaultValue(x) : default;
return new Parameter(typeName, x.Name.Uncapitalize().AvoidKeywordCollision(), defaultValue);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,8 @@ internal static class GeneratorConstants
public const string Struct = "struct";
public const string NewConstructor = "new()";
public const string Record = "record";
public const string Default = "default";
public const string Null = "null";
public const string True = "true";
public const string False = "false";
}
10 changes: 8 additions & 2 deletions Source/Sundew.DiscriminatedUnions.Tester/MixedUnion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@
[Sundew.DiscriminatedUnions.DiscriminatedUnion]
public abstract partial record MixedUnion
{
public sealed record Case1(string Info) : MixedUnion;
public sealed record Case1(string Info, bool IsValid = false, Status Status = Status.On, int Number = 3) : MixedUnion;
}

public sealed record Case2(int? Info = 4, List<string?>? OptionalList = null, List<int?>? OptionalInts = null) : MixedUnion;

public sealed record Case3 : MixedUnion;
public sealed record Case3 : MixedUnion;

public enum Status
{
Off,
On,
}

0 comments on commit 44443ec

Please sign in to comment.