Skip to content

Commit 973db58

Browse files
authored
fix: non-nullable reference type properties without initializers (#267)
1 parent dc46de9 commit 973db58

4 files changed

Lines changed: 49 additions & 1 deletion

File tree

src/Facet/Generators/FacetGenerators/GenerateDtosGenerator.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,13 @@ private static void GenerateDtoProperty(StringBuilder sb, FacetMember member)
465465
propDef += " { get; set; }";
466466
}
467467

468+
// For non-nullable reference type properties without a required modifier,
469+
// add "= default!" to suppress CS8618 warnings in the generated code
470+
if (!member.IsValueType && !member.IsRequired && !NullabilityAnalyzer.IsNullableTypeName(member.TypeName))
471+
{
472+
propDef += " = default!;";
473+
}
474+
468475
if (member.IsRequired)
469476
{
470477
propDef = $"required {propDef}";
@@ -488,6 +495,12 @@ private static void GenerateDtoField(StringBuilder sb, FacetMember member)
488495
var defaultValue = GeneratorUtilities.GetDefaultValueForType(member.TypeName);
489496
fieldDef += $" = {defaultValue}";
490497
}
498+
else if (!member.IsValueType && !member.IsRequired && !NullabilityAnalyzer.IsNullableTypeName(member.TypeName))
499+
{
500+
// For non-nullable reference type fields without a required modifier,
501+
// add "= default!" to suppress CS8618 warnings
502+
fieldDef += " = default!";
503+
}
491504

492505
fieldDef += ";";
493506

src/Facet/Generators/FacetGenerators/MemberGenerator.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ private static void GenerateProperty(StringBuilder sb, FacetMember member, strin
6868
{
6969
propDef += $" = {member.DefaultValue};";
7070
}
71+
else if (!member.IsValueType && !member.IsRequired && !NullabilityAnalyzer.IsNullableTypeName(member.TypeName))
72+
{
73+
// For non-nullable reference type properties without an initializer and not marked as required,
74+
// add "= default!" to suppress CS8618 warnings in the generated code
75+
propDef += " = default!;";
76+
}
7177

7278
if (member.IsRequired)
7379
{
@@ -86,6 +92,12 @@ private static void GenerateField(StringBuilder sb, FacetMember member, string i
8692
{
8793
fieldDef += $" = {member.DefaultValue}";
8894
}
95+
else if (!member.IsValueType && !member.IsRequired && !NullabilityAnalyzer.IsNullableTypeName(member.TypeName))
96+
{
97+
// For non-nullable reference type fields without an initializer and not marked as required,
98+
// add "= default!" to suppress CS8618 warnings in the generated code
99+
fieldDef += " = default!";
100+
}
89101

90102
fieldDef += ";";
91103

src/Facet/Generators/FlattenGenerators/FlattenCodeBuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ private static void GenerateProperties(StringBuilder sb, FlattenTargetModel mode
108108
}
109109

110110
// Property declaration
111-
sb.AppendLine($" public {property.TypeName} {property.Name} {{ get; set; }}");
111+
// For non-nullable reference type properties, add "= default!" to suppress CS8618 warnings
112+
var defaultSuffix = (!property.IsValueType && !NullabilityAnalyzer.IsNullableTypeName(property.TypeName))
113+
? " = default!;"
114+
: "";
115+
sb.AppendLine($" public {property.TypeName} {property.Name} {{ get; set; }}{defaultSuffix}");
112116
sb.AppendLine();
113117
}
114118
}

test/Facet.Tests/TestModels/TestEntities.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,22 @@ public class TeamModelWithRequiredMembers
301301

302302
[Facet(typeof(TeamModelWithRequiredMembers), PreserveRequiredProperties = true, NestedFacets = [typeof(UserSettingsFacet)])]
303303
public partial class TeamWithRequiredMembersFacet;
304+
305+
// This entity has non-nullable string properties WITHOUT initializers
306+
// The generated facet should not trigger CS8618 warnings
307+
public class EntityWithNonNullableProperties
308+
{
309+
public int Id { get; set; }
310+
public string Name { get; set; }
311+
public string Description { get; set; }
312+
public string ComputedValue => $"{Name}-{Id}";
313+
public string? NullableField { get; set; }
314+
public int NumericValue { get; set; }
315+
}
316+
317+
[Facet(typeof(EntityWithNonNullableProperties))]
318+
public partial class NonNullablePropertyFacet;
319+
320+
// Also test with a required property - should not get default!
321+
[Facet(typeof(EntityWithNonNullableProperties), PreserveRequiredProperties = false)]
322+
public partial class NonNullablePropertyFacetNoRequired;

0 commit comments

Comments
 (0)