Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: gen. unknown model when prop exists
Browse files Browse the repository at this point in the history
jorgerangel-msft committed Oct 31, 2024

Verified

This commit was signed with the committer’s verified signature.
yuzawa-san James Yuzawa
1 parent 67a0680 commit 996895a
Showing 3 changed files with 27 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -442,13 +442,21 @@ internal MethodProvider BuildDeserializationMethod()
private MethodBodyStatement[] BuildAbstractDeserializationMethodBody()
{
var unknownVariant = _model.DerivedModels.First(m => m.IsUnknownDiscriminatorModel);
bool onlyContainsUnknownDerivedModel = _model.DerivedModels.Count == 1;
IfStatement? deserializeDiscriminatedModelsConditions = null;

if (!onlyContainsUnknownDerivedModel)
{
deserializeDiscriminatedModelsConditions = new IfStatement(_jsonElementParameterSnippet.TryGetProperty("kind", out var discriminator))
{
new SwitchStatement(discriminator.GetString(), GetAbstractSwitchCases(unknownVariant))
};
}

return
[
new IfStatement(_jsonElementParameterSnippet.ValueKindEqualsNull()) { Return(Null) },
new IfStatement(_jsonElementParameterSnippet.TryGetProperty("kind", out var discriminator))
{
new SwitchStatement(discriminator.GetString(), GetAbstractSwitchCases(unknownVariant))
},
deserializeDiscriminatedModelsConditions ?? MethodBodyStatement.Empty,
Return(unknownVariant.Type.Deserialize(_jsonElementParameterSnippet, _serializationOptionsParameter))
];
}
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ namespace Microsoft.Generator.CSharp.Input
[DebuggerDisplay("{GetDebuggerDisplay(),nq}")]
public class InputModelType : InputType
{
private const string UnknownDiscriminatorValue = "unknown";
private IReadOnlyList<InputModelProperty> _properties = [];
private IList<InputModelType> _derivedModels = [];

@@ -38,7 +39,7 @@ public InputModelType(string name, string crossLanguageDefinitionId, string? acc
DiscriminatorProperty = discriminatorProperty;
DiscriminatedSubtypes = discriminatedSubtypes!;
AdditionalProperties = additionalProperties;
IsUnknownDiscriminatorModel = DiscriminatorValue == "unknown";
IsUnknownDiscriminatorModel = DiscriminatorValue == UnknownDiscriminatorValue;
IsPropertyBag = false;
ModelAsStruct = modelAsStruct;
}
@@ -79,12 +80,15 @@ public IReadOnlyDictionary<string, InputModelType> DiscriminatedSubtypes
get => _discriminatedSubtypes ??= new Dictionary<string, InputModelType>();
internal set
{
if (value is null || value.Count == 0)
if (value is null || DiscriminatorProperty == null)
return;

_discriminatedSubtypes = new Dictionary<string, InputModelType>(value);
var cleanBaseName = Name.ToCleanName();
_discriminatedSubtypes.Add("unknown",

if (DiscriminatorValue != UnknownDiscriminatorValue)
{
var cleanBaseName = Name.ToCleanName();
_discriminatedSubtypes.Add(UnknownDiscriminatorValue,
new InputModelType(
$"Unknown{cleanBaseName}",
$"Unknown{cleanBaseName}",
@@ -95,7 +99,7 @@ internal set
[],
this,
[],
"unknown",
UnknownDiscriminatorValue,
new InputModelProperty(
DiscriminatorProperty!.Name,
DiscriminatorProperty.SerializedName,
@@ -108,6 +112,7 @@ internal set
null,
false)
);
}
}
}
public InputType? AdditionalProperties { get; internal set; }
Original file line number Diff line number Diff line change
@@ -105,10 +105,14 @@ public static InputModelType CreateModelType(ref Utf8JsonReader reader, string?
{
model.Properties = properties;
}
if (discriminatedSubtypes != null)
if (discriminatedSubtypes?.Count > 0)
{
model.DiscriminatedSubtypes = discriminatedSubtypes;
}
else if (model.DiscriminatorProperty != null)
{
model.DiscriminatedSubtypes = new Dictionary<string, InputModelType>();
}
model.ModelAsStruct = modelAsStruct;
if (decorators != null)
{

0 comments on commit 996895a

Please sign in to comment.