Skip to content

Commit 6b7f2ff

Browse files
committed
Fix code generation that has been broken in previous simplification refactoring
1 parent 2bb5e8d commit 6b7f2ff

32 files changed

Lines changed: 285 additions & 259 deletions

src/Dibix.Sdk.CodeGeneration/Lookup/UserDefinedTypeSchemaTypeResolver.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public override TypeReference ResolveType(string input, string relativeNamespace
2424
if (!_schemaAccessor.Value.TryGetValue(input, out UserDefinedTypeSchema schema))
2525
return null;
2626

27+
schema.ReferenceCount++;
2728
SchemaTypeReference schemaTypeReference = new SchemaTypeReference(schema.FullName, isNullable: false, isEnumerable: false, location);
2829
return schemaTypeReference;
2930
}

src/Dibix.Sdk.CodeGeneration/Model/SchemaDefinition.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public abstract class SchemaDefinition
1010
public SourceLocation Location { get; }
1111
public ExternalSchemaInfo ExternalSchemaInfo { get; set; }
1212
public string FullName => $"{Namespace}.{DefinitionName}";
13+
public int ReferenceCount { get; set; }
1314

1415
protected SchemaDefinition(string @namespace, string definitionName, SchemaDefinitionSource source, SourceLocation location)
1516
{

src/Dibix.Sdk.CodeGeneration/Model/SchemaExtensions.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Linq;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using Dibix.Sdk.Abstractions;
35

46
namespace Dibix.Sdk.CodeGeneration
@@ -27,5 +29,26 @@ public static EnumSchemaMember GetEnumMember(this EnumMemberStringReference refe
2729
logger.LogError($"Enum '{schema.FullName}' does not define a member named '{reference.Value}'", reference.Location.Source, reference.Location.Line, reference.Location.Column);
2830
return null;
2931
}
32+
33+
public static IEnumerable<SchemaDefinition> GetSchemas(this CodeGenerationModel model, CodeGenerationOutputFilter filter)
34+
{
35+
bool MatchesOutputFilter(SchemaDefinition schema)
36+
{
37+
switch (filter)
38+
{
39+
case CodeGenerationOutputFilter.Local:
40+
return SchemaDefinitionSource.Local.HasFlag(schema.Source);
41+
42+
case CodeGenerationOutputFilter.Referenced:
43+
return (SchemaDefinitionSource.Local | SchemaDefinitionSource.Foreign).HasFlag(schema.Source) && schema.ReferenceCount > 0;
44+
45+
default:
46+
throw new ArgumentOutOfRangeException(nameof(filter), filter, null);
47+
}
48+
}
49+
50+
IEnumerable<SchemaDefinition> schemas = model.Schemas.Where(MatchesOutputFilter);
51+
return schemas;
52+
}
3053
}
3154
}

src/Dibix.Sdk.CodeGeneration/Output/ApiClientImplementationWriter.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ protected override void WriteController(CodeGenerationContext context, CSharpSta
5151

5252
@class.AddSeparator();
5353

54-
for (int i = 0; i < controller.Actions.Count; i++)
54+
IList<ActionDefinition> actions = controller.Actions.OrderBy(x => operationIdMap[x]).ToArray();
55+
for (int i = 0; i < actions.Count; i++)
5556
{
56-
ActionDefinition action = controller.Actions[i];
57-
string body = this.GenerateMethodBody(controller, action, context, securitySchemeMap);
57+
ActionDefinition action = actions[i];
58+
string body = GenerateMethodBody(controller, action, context, securitySchemeMap);
5859
base.AddMethod(action, context, operationIdMap, (methodName, returnType) => @class.AddMethod(methodName, returnType, body, modifiers: CSharpModifiers.Public | CSharpModifiers.Async));
5960

60-
if (i + 1 < controller.Actions.Count)
61+
if (i + 1 < actions.Count)
6162
@class.AddSeparator();
6263
}
6364
}
@@ -66,16 +67,16 @@ protected override void WriteController(CodeGenerationContext context, CSharpSta
6667
#region Private Methods
6768
private static void AddPrimaryCtor(CSharpClass @class, bool requiresAuthorization)
6869
{
69-
StringBuilder ctorBodySb = new StringBuilder("this._httpClientFactory = httpClientFactory;");
70+
StringBuilder ctorBodySb = new StringBuilder("_httpClientFactory = httpClientFactory;");
7071

7172
if (requiresAuthorization)
7273
{
7374
ctorBodySb.AppendLine()
74-
.Append("this._httpAuthorizationProvider = httpAuthorizationProvider;");
75+
.Append("_httpAuthorizationProvider = httpAuthorizationProvider;");
7576
}
7677

7778
ctorBodySb.AppendLine()
78-
.Append("this._httpClientName = httpClientName;");
79+
.Append("_httpClientName = httpClientName;");
7980

8081
string ctorBody = ctorBodySb.ToString();
8182
CSharpConstructor ctor = @class.AddConstructor(ctorBody)
@@ -111,7 +112,7 @@ private string GenerateMethodBody(ControllerDefinition controller, ActionDefinit
111112
.ToArray();
112113

113114
StringWriter writer = new StringWriter();
114-
writer.WriteLine($"using ({nameof(HttpClient)} client = this._httpClientFactory.CreateClient(this._httpClientName, BaseAddress))")
115+
writer.WriteLine($"using ({nameof(HttpClient)} client = _httpClientFactory.CreateClient(_httpClientName, BaseAddress))")
115116
.WriteLine("{")
116117
.PushIndent();
117118

@@ -147,7 +148,7 @@ private string GenerateMethodBody(ControllerDefinition controller, ActionDefinit
147148
foreach (SecuritySchemeRequirement securitySchemeRequirement in action.SecuritySchemes.Requirements.Where(x => x.Scheme != SecuritySchemes.Anonymous))
148149
{
149150
string securitySchemeName = securitySchemeRequirement.Scheme.Name;
150-
string getAuthorizationValueCall = $"this._httpAuthorizationProvider.GetValue(\"{securitySchemeName}\")";
151+
string getAuthorizationValueCall = $"_httpAuthorizationProvider.GetValue(\"{securitySchemeName}\")";
151152
if (oneOf)
152153
{
153154
writer.WriteLine($"if ({getAuthorizationValueCall} != null)")

src/Dibix.Sdk.CodeGeneration/Output/ApiClientInterfaceWriter.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using Dibix.Sdk.CodeGeneration.CSharp;
34

45
namespace Dibix.Sdk.CodeGeneration
@@ -16,9 +17,9 @@ protected override void WriteController(CodeGenerationContext context, CSharpSta
1617
CSharpInterface @interface = output.AddInterface(interfaceName, CSharpModifiers.Public)
1718
.Implements("IHttpService");
1819

19-
foreach (ActionDefinition action in controller.Actions)
20+
foreach (ActionDefinition action in controller.Actions.OrderBy(x => operationIdMap[x]))
2021
{
21-
base.AddMethod(action, context, operationIdMap, (methodName, returnType) => @interface.AddMethod(methodName, returnType));
22+
base.AddMethod(action, context, operationIdMap, @interface.AddMethod);
2223
}
2324
}
2425
#endregion

src/Dibix.Sdk.CodeGeneration/Output/ApiClientWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public override void Write(CodeGenerationContext context)
2626
IList<ControllerDefinition> controllers = context.Model
2727
.Controllers
2828
.Where(x => x.Actions.Any())
29+
.OrderBy(x => x.Name)
2930
.ToArray();
3031

3132
IDictionary<ActionDefinition, string> operationIdMap = controllers.SelectMany(x => x.Actions)
@@ -46,7 +47,7 @@ public override void Write(CodeGenerationContext context)
4647
{
4748
ControllerDefinition controller = controllers[i];
4849
string serviceName = $"{controller.Name}Service";
49-
this.WriteController(context, output, controller, serviceName, operationIdMap, securitySchemeMap);
50+
WriteController(context, output, controller, serviceName, operationIdMap, securitySchemeMap);
5051

5152
if (i + 1 < controllers.Count)
5253
output.AddSeparator();

src/Dibix.Sdk.CodeGeneration/Output/ClientContractClassWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace Dibix.Sdk.CodeGeneration
55
{
66
internal sealed class ClientContractClassWriter : ContractClassWriter
77
{
8-
public ClientContractClassWriter(CodeGenerationModel model) : base(model, schemaFilter: SchemaDefinitionSource.Local | SchemaDefinitionSource.Foreign) { }
8+
public ClientContractClassWriter(CodeGenerationModel model) : base(model, outputFilter: CodeGenerationOutputFilter.Referenced) { }
99

1010
protected override bool ProcessProperty(ObjectSchema schema, ObjectSchemaProperty property, ICollection<CSharpAnnotation> propertyAnnotations, CodeGenerationContext context)
1111
{
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Dibix.Sdk.CodeGeneration
2+
{
3+
internal enum CodeGenerationOutputFilter
4+
{
5+
None,
6+
Local,
7+
Referenced
8+
}
9+
}

src/Dibix.Sdk.CodeGeneration/Output/ContractClassWriter.cs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,27 @@ internal abstract class ContractClassWriter : ArtifactWriterBase
2121
#endregion
2222

2323
#region Constructor
24-
protected ContractClassWriter(CodeGenerationModel model, SchemaDefinitionSource schemaFilter)
24+
protected ContractClassWriter(CodeGenerationModel model, CodeGenerationOutputFilter outputFilter)
2525
{
26-
this._schemas = model.Schemas.Where(x => IsValidSchema(x, schemaFilter)).ToArray();
26+
_schemas = model.GetSchemas(outputFilter)
27+
.Where(x => x.GetType() == typeof(ObjectSchema) // Equal is important here, since we don't want UserDefinedTypeSchema which inherits from ObjectSchema
28+
|| x is EnumSchema)
29+
.ToArray();
2730
}
2831
#endregion
2932

3033
#region Overrides
31-
public override bool HasContent(CodeGenerationModel model) => this._schemas.Any();
34+
public override bool HasContent(CodeGenerationModel model) => _schemas.Any();
3235

3336
public override void Write(CodeGenerationContext context)
3437
{
35-
var namespaceGroups = this._schemas
36-
.GroupBy(x => x.Namespace)
37-
.ToArray();
38+
var namespaceGroups = _schemas.GroupBy(x => x.Namespace).OrderBy(x => x.Key).ToArray();
3839

3940
for (int i = 0; i < namespaceGroups.Length; i++)
4041
{
4142
IGrouping<string, SchemaDefinition> namespaceGroup = namespaceGroups[i];
4243
CSharpStatementScope scope = /*namespaceGroup.Key != null ? */context.CreateOutputScope(namespaceGroup.Key)/* : context.Output*/;
43-
IList<SchemaDefinition> schemas = namespaceGroup.ToArray();
44+
IList<SchemaDefinition> schemas = namespaceGroup.OrderBy(x => x.DefinitionName).ToArray();
4445
for (int j = 0; j < schemas.Count; j++)
4546
{
4647
SchemaDefinition schema = schemas[j];
@@ -83,14 +84,14 @@ protected static void AddJsonReference(CodeGenerationContext context)
8384
private void ProcessObjectSchema(CodeGenerationContext context, CSharpStatementScope scope, ObjectSchema schema)
8485
{
8586
ICollection<CSharpAnnotation> classAnnotations = new Collection<CSharpAnnotation>();
86-
this.BeginProcessClass(schema, classAnnotations, context);
87+
BeginProcessClass(schema, classAnnotations, context);
8788

8889
CSharpClass @class = scope.AddClass(schema.DefinitionName, CSharpModifiers.Public | CSharpModifiers.Sealed, classAnnotations);
8990
ICollection<string> ctorAssignments = new Collection<string>();
9091
foreach (ObjectSchemaProperty property in schema.Properties)
9192
{
9293
ICollection<CSharpAnnotation> propertyAnnotations = new Collection<CSharpAnnotation>();
93-
if (!this.ProcessProperty(schema, property, propertyAnnotations, context))
94+
if (!ProcessProperty(schema, property, propertyAnnotations, context))
9495
continue;
9596

9697
CSharpValue defaultValue = null;
@@ -109,7 +110,7 @@ private void ProcessObjectSchema(CodeGenerationContext context, CSharpStatementS
109110
.Initializer(defaultValue);
110111

111112
if (propertyType.IsEnumerable)
112-
ctorAssignments.Add($"this.{property.Name.Value} = new {nameof(Collection<object>)}<{clrTypeName}>();");
113+
ctorAssignments.Add($"{property.Name.Value} = new {nameof(Collection<object>)}<{clrTypeName}>();");
113114
}
114115

115116
if (ctorAssignments.Any())
@@ -121,7 +122,7 @@ private void ProcessObjectSchema(CodeGenerationContext context, CSharpStatementS
121122
.AddConstructor(String.Join(Environment.NewLine, ctorAssignments));
122123
}
123124

124-
this.EndProcessClass(schema, @class, context);
125+
EndProcessClass(schema, @class, context);
125126
}
126127

127128
private static void ProcessEnumSchema(CodeGenerationContext context, CSharpStatementScope scope, EnumSchema schema)
@@ -140,17 +141,6 @@ private static void ProcessEnumSchema(CodeGenerationContext context, CSharpState
140141
.Inherits("int");
141142
}
142143
}
143-
144-
private static bool IsValidSchema(SchemaDefinition schema, SchemaDefinitionSource schemaFilter)
145-
{
146-
if (!schemaFilter.HasFlag(schema.Source))
147-
return false;
148-
149-
if (schema.GetType() == typeof(ObjectSchema) || schema is EnumSchema)
150-
return true;
151-
152-
return false;
153-
}
154144
#endregion
155145
}
156146
}

src/Dibix.Sdk.CodeGeneration/Output/DaoContractClassWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Dibix.Sdk.CodeGeneration
88
{
99
internal sealed class DaoContractClassWriter : ContractClassWriter
1010
{
11-
public DaoContractClassWriter(CodeGenerationModel model, SchemaDefinitionSource schemaFilter) : base(model, schemaFilter) { }
11+
public DaoContractClassWriter(CodeGenerationModel model, CodeGenerationOutputFilter outputFilter) : base(model, outputFilter) { }
1212

1313
protected override void BeginProcessClass(ObjectSchema schema, ICollection<CSharpAnnotation> classAnnotations, CodeGenerationContext context)
1414
{

0 commit comments

Comments
 (0)