Skip to content

Commit d58be26

Browse files
authored
always add default property (Azure#49447)
1 parent 658370b commit d58be26

File tree

3 files changed

+67
-26
lines changed

3 files changed

+67
-26
lines changed

sdk/core/System.ClientModel/gen/ModelReaderWriterContextGenerator.Emitter.cs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,36 +83,33 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
8383
builder.AppendLine();
8484
}
8585

86-
if (contextGenerationSpec.TypeBuilders.Count > 0)
87-
{
88-
builder.AppendLine(indent, $"private static {contextName} _{contextName.ToCamelCase()};");
89-
builder.AppendLine(indent, "/// <summary> Gets the default instance </summary>");
90-
builder.AppendLine(indent, $"public static {contextName} Default => _{contextName.ToCamelCase()} ??= new();");
91-
builder.AppendLine();
86+
builder.AppendLine(indent, $"private static {contextName} _{contextName.ToCamelCase()};");
87+
builder.AppendLine(indent, "/// <summary> Gets the default instance </summary>");
88+
builder.AppendLine(indent, $"public static {contextName} Default => _{contextName.ToCamelCase()} ??= new();");
89+
builder.AppendLine();
9290

93-
builder.AppendLine(indent, $"private {contextName}()");
94-
builder.AppendLine(indent, "{");
95-
indent++;
96-
foreach (var modelInfo in contextGenerationSpec.TypeBuilders)
91+
builder.AppendLine(indent, $"private {contextName}()");
92+
builder.AppendLine(indent, "{");
93+
indent++;
94+
foreach (var modelInfo in contextGenerationSpec.TypeBuilders)
95+
{
96+
builder.Append(indent, $"_typeBuilderFactories.Add(typeof({modelInfo.Type.FullyQualifiedName}), () => ");
97+
if (ShouldGenerateAsLocal(contextGenerationSpec, modelInfo))
9798
{
98-
builder.Append(indent, $"_typeBuilderFactories.Add(typeof({modelInfo.Type.FullyQualifiedName}), () => ");
99-
if (ShouldGenerateAsLocal(contextGenerationSpec, modelInfo))
100-
{
101-
builder.AppendLine($" new global::{modelInfo.Type.GetInnerItemType().Namespace}.{modelInfo.Type.TypeCaseName}Builder());");
102-
}
103-
else
104-
{
105-
builder.AppendLine($" s_referenceContexts[typeof({modelInfo.ContextType.FullyQualifiedName})].GetTypeBuilder(typeof({modelInfo.Type.FullyQualifiedName})));");
106-
}
99+
builder.AppendLine($" new global::{modelInfo.Type.GetInnerItemType().Namespace}.{modelInfo.Type.TypeCaseName}Builder());");
107100
}
108-
builder.AppendLine();
101+
else
102+
{
103+
builder.AppendLine($" s_referenceContexts[typeof({modelInfo.ContextType.FullyQualifiedName})].GetTypeBuilder(typeof({modelInfo.Type.FullyQualifiedName})));");
104+
}
105+
}
106+
builder.AppendLine();
109107

110-
builder.AppendLine(indent, "AddAdditionalFactories(_typeBuilderFactories);");
108+
builder.AppendLine(indent, "AddAdditionalFactories(_typeBuilderFactories);");
111109

112-
indent--;
113-
builder.AppendLine(indent, "}");
114-
builder.AppendLine();
115-
}
110+
indent--;
111+
builder.AppendLine(indent, "}");
112+
builder.AppendLine();
116113

117114
builder.AppendLine(indent, "/// <inheritdoc/>");
118115
builder.Append(indent, "protected override bool TryGetTypeBuilderCore(");

sdk/core/System.ClientModel/tests/gen.unit/CompilationHelper.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ public static Compilation CreateCompilation(
9595
}
9696

9797
public static GeneratorResult RunSourceGenerator(Compilation compilation, bool disableDiagnosticValidation = false)
98+
=> RunSourceGenerator(compilation, out _, disableDiagnosticValidation);
99+
100+
public static GeneratorResult RunSourceGenerator(Compilation compilation, out Compilation newCompilation, bool disableDiagnosticValidation = false)
98101
{
99102
ModelReaderWriterContextGenerationSpec? generatedSpecs = null;
100103
var generator = new ModelReaderWriterContextGenerator
@@ -103,7 +106,7 @@ public static GeneratorResult RunSourceGenerator(Compilation compilation, bool d
103106
};
104107

105108
CSharpGeneratorDriver driver = CreateJsonSourceGeneratorDriver(compilation, generator);
106-
driver.RunGeneratorsAndUpdateCompilation(compilation, out Compilation outCompilation, out ImmutableArray<Diagnostic> diagnostics);
109+
driver.RunGeneratorsAndUpdateCompilation(compilation, out newCompilation, out ImmutableArray<Diagnostic> diagnostics);
107110

108111
return new()
109112
{

sdk/core/System.ClientModel/tests/gen.unit/ContextGeneratorTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,5 +653,46 @@ public void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
653653
Assert.AreEqual(1, result.Diagnostics.Length);
654654
Assert.AreEqual(ModelReaderWriterContextGenerator.DiagnosticDescriptors.BuildableAttributeRequiresContext.Id, result.Diagnostics[0].Id);
655655
}
656+
657+
[Test]
658+
public void ValidateDefaultExistsWithNoBuilders()
659+
{
660+
string source =
661+
$$"""
662+
using System;
663+
using System.ClientModel.Primitives;
664+
using System.Collections.Generic;
665+
using System.Text.Json;
666+
667+
namespace TestProject
668+
{
669+
public partial class LocalContext : ModelReaderWriterContext { }
670+
}
671+
""";
672+
673+
Compilation compilation = CompilationHelper.CreateCompilation(source);
674+
var result = CompilationHelper.RunSourceGenerator(compilation, out var newCompilation);
675+
676+
Assert.IsNotNull(result.GenerationSpec);
677+
Assert.AreEqual("LocalContext", result.GenerationSpec!.Type.Name);
678+
Assert.AreEqual("TestProject", result.GenerationSpec.Type.Namespace);
679+
Assert.AreEqual(0, result.GenerationSpec.ReferencedContexts.Count);
680+
Assert.AreEqual(0, result.GenerationSpec.TypeBuilders.Count);
681+
Assert.AreEqual(0, result.Diagnostics.Length);
682+
683+
var localContextSymbol = newCompilation.GetTypeByMetadataName("TestProject.LocalContext");
684+
Assert.IsNotNull(localContextSymbol);
685+
var defaultProp = localContextSymbol!.GetMembers("Default")
686+
.OfType<IPropertySymbol>()
687+
.FirstOrDefault(p => p.IsStatic);
688+
689+
Assert.IsNotNull(defaultProp, "Default property should not be null.");
690+
691+
Assert.IsTrue(SymbolEqualityComparer.Default.Equals(defaultProp!.Type, localContextSymbol));
692+
693+
Assert.AreEqual(1, localContextSymbol.Constructors.Length);
694+
var ctor = localContextSymbol.Constructors[0];
695+
Assert.AreEqual(Accessibility.Private, ctor.DeclaredAccessibility);
696+
}
656697
}
657698
}

0 commit comments

Comments
 (0)