Skip to content

Commit

Permalink
- adds the backing store property and maps other properties to it
Browse files Browse the repository at this point in the history
  • Loading branch information
baywet committed Jun 7, 2021
1 parent b77a0eb commit 0138bf5
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/Kiota.Builder/CodeDOM/CodeProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ public enum CodePropertyKind
{
Custom,
RequestBuilder,
AdditionalData
AdditionalData,
BackingStore
}

public class CodeProperty : CodeTerminal, IDocumentedElement
Expand Down
41 changes: 40 additions & 1 deletion src/Kiota.Builder/KiotaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,9 @@ private void CreatePropertiesForModelClass(OpenApiUrlTreeNode currentNode, OpenA
private const string fieldDeserializersMethodName = "GetFieldDeserializers<T>";
private const string serializeMethodName = "Serialize";
private const string additionalDataPropName = "AdditionalData";
private static void AddSerializationMembers(CodeClass model, bool includeAdditionalProperties) {
private const string backingStorePropertyName = "BackingStore";
private const string backingStoreInterface = "IBackingStore";
private void AddSerializationMembers(CodeClass model, bool includeAdditionalProperties) {
var serializationPropsType = $"IDictionary<string, Action<T, IParseNode>>";
if(!model.ContainsMember(fieldDeserializersMethodName)) {
var deserializeProp = new CodeMethod(model) {
Expand Down Expand Up @@ -763,6 +765,43 @@ private static void AddSerializationMembers(CodeClass model, bool includeAdditio
};
model.AddProperty(additionalDataProp);
}
if(!model.ContainsMember(backingStorePropertyName) &&
!string.IsNullOrEmpty(config.BackingStore) &&
!(model.GetGreatestGrandparent(model)?.ContainsMember(backingStorePropertyName) ?? false)) {
var storeImplFragments = config.BackingStore.Split('.');
var storeImplClassName = storeImplFragments.Last();
var backingStoreProperty = new CodeProperty(model) {
Name = backingStorePropertyName,
Access = AccessModifier.Public,
DefaultValue = $"new {storeImplClassName}()",
PropertyKind = CodePropertyKind.BackingStore,
Description = "Stores model information.",
ReadOnly = true,
};
var storeType = new CodeType(backingStoreProperty) {
Name = backingStoreInterface,
IsNullable = false,
IsExternal = true,
};
backingStoreProperty.Type = storeType;
model.AddProperty(backingStoreProperty);
var storeUsing = new CodeUsing(model) {
Name = "Microsoft.Kiota.Abstractions.Store",
};
storeUsing.Declaration = new CodeType(storeType) {
Name = backingStoreInterface
};
var storeImplUsing = new CodeUsing(model) {
Name = storeImplFragments.SkipLast(1).Aggregate((x, y) => $"{x}.{y}"),
};
storeImplUsing.Declaration = new CodeType(storeImplUsing) {
Name = storeImplClassName,
};
model.AddUsing(storeUsing, storeImplUsing);
(model.StartBlock as CodeClass.Declaration).Implements.Add(new CodeType(model) {
Name = "IBackedModel",
});
}
}
private CodeClass CreateOperationParameter(OpenApiUrlTreeNode node, OperationType operationType, OpenApiOperation operation, CodeClass parentClass)
{
Expand Down
16 changes: 16 additions & 0 deletions src/Kiota.Builder/Writers/CSharp/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ public class CodePropertyWriter : BaseElementWriter<CodeProperty, CSharpConventi
public CodePropertyWriter(CSharpConventionService conventionService): base(conventionService) { }
public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter writer)
{
var parentClass = codeElement.Parent as CodeClass;
var backingStorePropery = (parentClass.GetGreatestGrandparent(parentClass) ?? parentClass) // the backing store is always on the uppermost class
.GetChildElements(true)
.OfType<CodeProperty>()
.FirstOrDefault(x => x.PropertyKind == CodePropertyKind.BackingStore);
var setterAccessModifier = codeElement.ReadOnly && codeElement.Access > AccessModifier.Private ? "private " : string.Empty;
var simpleBody = $"get; {setterAccessModifier}set;";
var defaultValue = string.Empty;
Expand All @@ -25,6 +30,17 @@ public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter w
writer.DecreaseIndent();
writer.WriteLine("}");
break;
case CodePropertyKind.AdditionalData when backingStorePropery != null:
case CodePropertyKind.Custom when backingStorePropery != null:
writer.WriteLine($"{conventions.GetAccessModifier(codeElement.Access)} {propertyType} {codeElement.Name.ToFirstCharacterUpperCase()} {{");
writer.IncreaseIndent();
writer.WriteLine($"get {{ return {backingStorePropery.Name.ToFirstCharacterUpperCase()}?.Get(nameof({codeElement.Name.ToFirstCharacterUpperCase()})); }}");
writer.WriteLine($"set {{ {backingStorePropery.Name.ToFirstCharacterUpperCase()}?.Set(nameof({codeElement.Name.ToFirstCharacterUpperCase()}), value); }}");
writer.DecreaseIndent();
writer.WriteLine(string.IsNullOrEmpty(codeElement.DefaultValue) ? "}" : $"}} = {codeElement.DefaultValue};");
break;
case CodePropertyKind.Custom when backingStorePropery == null:
case CodePropertyKind.AdditionalData when backingStorePropery == null:
default:
writer.WriteLine($"{conventions.GetAccessModifier(codeElement.Access)} {propertyType} {codeElement.Name.ToFirstCharacterUpperCase()} {{ {simpleBody} }}{defaultValue}");
break;
Expand Down

0 comments on commit 0138bf5

Please sign in to comment.