Skip to content

Commit 250a457

Browse files
authored
move all generated code to c# source generator (#756)
* remove the dependency of unprocessed swagger file * all code generator * good bye generated code * remove generator cmd from sln * eliminate generated folder * fix multi target build * disable dotnet fmt due to cannot load lib generator * fix race * fix race for multi target
1 parent 1778d44 commit 250a457

File tree

591 files changed

+267
-330255
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

591 files changed

+267
-330255
lines changed

.github/workflows/buildtest.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ jobs:
2323
uses: actions/setup-dotnet@v1
2424
with:
2525
dotnet-version: '6.0.x'
26-
- name: Check Format
27-
# don't check formatting on Windows b/c of CRLF issues.
28-
if: matrix.os == 'ubuntu-latest'
29-
run: dotnet format --severity error --verify-no-changes --exclude ./src/KubernetesClient/generated/
26+
# - name: Check Format
27+
# # don't check formatting on Windows b/c of CRLF issues.
28+
# if: matrix.os == 'ubuntu-latest'
29+
# run: dotnet format --severity error --verify-no-changes --exclude ./src/KubernetesClient/generated/
3030
- name: Build
3131
run: dotnet build --configuration Release
3232
- name: Test

gen/KubernetesGenerator/KubernetesGenerator.csproj

Lines changed: 0 additions & 23 deletions
This file was deleted.

gen/KubernetesGenerator/Program.cs

Lines changed: 0 additions & 113 deletions
This file was deleted.

gen/KubernetesGenerator/ApiGenerator.cs renamed to gen/LibKubernetesGenerator/ApiGenerator.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
using System.Collections.Generic;
22
using System.IO;
33
using System.Linq;
4+
using Microsoft.CodeAnalysis;
45
using NSwag;
56
using Nustache.Core;
67

7-
namespace KubernetesGenerator
8+
namespace LibKubernetesGenerator
89
{
910
internal class ApiGenerator
1011
{
11-
public void Generate(OpenApiDocument swagger, string outputDirectory)
12+
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
1213
{
1314
var data = swagger.Operations
1415
.Where(o => o.Method != OpenApiOperationMethod.Options)
@@ -55,12 +56,9 @@ public void Generate(OpenApiDocument swagger, string outputDirectory)
5556
})
5657
.ToArray();
5758

58-
Render.FileToFile(Path.Combine("templates", "IKubernetes.cs.template"), data,
59-
Path.Combine(outputDirectory, "IKubernetes.cs"));
60-
Render.FileToFile(Path.Combine("templates", "Kubernetes.cs.template"), data,
61-
Path.Combine(outputDirectory, "Kubernetes.cs"));
62-
Render.FileToFile(Path.Combine("templates", "KubernetesExtensions.cs.template"), data,
63-
Path.Combine(outputDirectory, "KubernetesExtensions.cs"));
59+
context.RenderToContext("IKubernetes.cs.template", data, "IKubernetes.g.cs");
60+
context.RenderToContext("Kubernetes.cs.template", data, "Kubernetes.g.cs");
61+
context.RenderToContext("KubernetesExtensions.cs.template", data, "KubernetesExtensions.g.cs");
6462
}
6563
}
6664
}

gen/KubernetesGenerator/ClassNameHelper.cs renamed to gen/LibKubernetesGenerator/ClassNameHelper.cs

Lines changed: 12 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,66 +5,36 @@
55
using NSwag;
66
using Nustache.Core;
77

8-
namespace KubernetesGenerator
8+
namespace LibKubernetesGenerator
99
{
1010
internal class ClassNameHelper : INustacheHelper
1111
{
1212
private readonly Dictionary<string, string> classNameMap;
13-
private readonly HashSet<string> schemaDefinitionsInMultipleGroups;
1413
private readonly Dictionary<JsonSchema, string> schemaToNameMapCooked;
15-
private readonly Dictionary<JsonSchema, string> schemaToNameMapUnprocessed;
1614

17-
public ClassNameHelper(OpenApiDocument swaggerCooked, OpenApiDocument swaggerUnprocessed)
15+
public ClassNameHelper(OpenApiDocument swagger)
1816
{
19-
classNameMap = InitClassNameMap(swaggerCooked);
20-
21-
schemaToNameMapCooked = GenerateSchemaToNameMapCooked(swaggerCooked);
22-
schemaToNameMapUnprocessed = GenerateSchemaToNameMapUnprocessed(swaggerUnprocessed);
23-
schemaDefinitionsInMultipleGroups = InitSchemaDefinitionsInMultipleGroups(schemaToNameMapUnprocessed);
17+
classNameMap = InitClassNameMap(swagger);
18+
schemaToNameMapCooked = GenerateSchemaToNameMapCooked(swagger);
2419
}
2520

2621
public void RegisterHelper()
2722
{
2823
Helpers.Register(nameof(GetClassName), GetClassName);
2924
}
3025

31-
private static Dictionary<JsonSchema, string> GenerateSchemaToNameMapUnprocessed(
32-
OpenApiDocument swaggerUnprocessed)
33-
{
34-
return swaggerUnprocessed.Definitions.ToDictionary(x => x.Value, x => x.Key);
35-
}
36-
37-
private static Dictionary<JsonSchema, string> GenerateSchemaToNameMapCooked(OpenApiDocument swaggerCooked)
38-
{
39-
return swaggerCooked.Definitions.ToDictionary(x => x.Value, x => x.Key.Replace(".", "").ToPascalCase());
40-
}
41-
42-
private static HashSet<string> InitSchemaDefinitionsInMultipleGroups(
43-
Dictionary<JsonSchema, string> schemaToNameMap)
26+
private static Dictionary<JsonSchema, string> GenerateSchemaToNameMapCooked(OpenApiDocument swagger)
4427
{
45-
return schemaToNameMap.Values.Select(x =>
46-
{
47-
var parts = x.Split(".");
48-
return new
49-
{
50-
FullName = x,
51-
Name = parts[parts.Length - 1],
52-
Version = parts[parts.Length - 2],
53-
Group = parts[parts.Length - 3],
54-
};
55-
})
56-
.GroupBy(x => new { x.Name, x.Version })
57-
.Where(x => x.Count() > 1)
58-
.SelectMany(x => x)
59-
.Select(x => x.FullName)
60-
.ToHashSet();
28+
return swagger.Definitions.ToDictionary(x => x.Value, x => x.Key.Replace(".", "").ToPascalCase());
6129
}
6230

6331
private Dictionary<string, string> InitClassNameMap(OpenApiDocument doc)
6432
{
6533
var map = new Dictionary<string, string>();
66-
foreach (var (k, v) in doc.Definitions)
34+
foreach (var kv in doc.Definitions)
6735
{
36+
var k = kv.Key;
37+
var v = kv.Value;
6838
if (v.ExtensionData?.TryGetValue("x-kubernetes-group-version-kind", out _) == true)
6939
{
7040
var groupVersionKindElements = (object[])v.ExtensionData["x-kubernetes-group-version-kind"];
@@ -125,28 +95,13 @@ public string GetClassNameForSchemaDefinition(JsonSchema definition)
12595
return GetClassName(definition);
12696
}
12797

128-
if (schemaToNameMapCooked.TryGetValue(definition, out var name))
129-
{
130-
return name;
131-
}
132-
133-
var schemaName = schemaToNameMapUnprocessed[definition];
134-
135-
var parts = schemaName.Split(".");
136-
var group = parts[parts.Length - 3];
137-
var version = parts[parts.Length - 2];
138-
var entityName = parts[parts.Length - 1];
139-
if (!schemaDefinitionsInMultipleGroups.Contains(schemaName))
140-
{
141-
group = null;
142-
}
14398

144-
return $"{group}{version}{entityName}".ToPascalCase();
99+
return schemaToNameMapCooked[definition];
145100
}
146101

147-
private static Dictionary<JsonSchema, string> InitSchemaToNameCooked(OpenApiDocument swaggercooked)
102+
private static Dictionary<JsonSchema, string> InitSchemaToNameCooked(OpenApiDocument swagger)
148103
{
149-
return swaggercooked.Definitions.ToDictionary(x => x.Value, x => x.Key.Replace(".", "").ToPascalCase());
104+
return swagger.Definitions.ToDictionary(x => x.Value, x => x.Key.Replace(".", "").ToPascalCase());
150105
}
151106
}
152107
}

gen/KubernetesGenerator/GeneralNameHelper.cs renamed to gen/LibKubernetesGenerator/GeneralNameHelper.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Text.RegularExpressions;
45
using CaseExtensions;
56
using NJsonSchema;
67
using NSwag;
78
using Nustache.Core;
89

9-
namespace KubernetesGenerator
10+
namespace LibKubernetesGenerator
1011
{
1112
internal class GeneralNameHelper : INustacheHelper
1213
{
@@ -57,7 +58,7 @@ private string GetInterfaceName(JsonSchema definition)
5758
if (definition.Properties.TryGetValue("spec", out var specProperty))
5859
{
5960
// ignore empty spec placeholder
60-
if (specProperty.Reference.ActualProperties.Any())
61+
if (specProperty.Reference?.ActualProperties.Any() == true)
6162
{
6263
interfaces.Add($"ISpec<{classNameHelper.GetClassNameForSchemaDefinition(specProperty.Reference)}>");
6364
}
@@ -196,7 +197,7 @@ public static string GetMethodName(OpenApiOperation watchOperation, string suffi
196197

197198
default:
198199
// This tries to remove the version from the method name, e.g. watchCoreV1NamespacedPod => WatchNamespacedPod
199-
methodName = methodName.Replace(tag, string.Empty, StringComparison.OrdinalIgnoreCase);
200+
methodName = Regex.Replace(methodName, tag, string.Empty, RegexOptions.IgnoreCase);
200201
methodName += "Async";
201202
break;
202203
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.Text;
3+
using Nustache.Core;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Text;
8+
9+
namespace LibKubernetesGenerator
10+
{
11+
internal static class GeneratorExecutionContextExt
12+
{
13+
public static void RenderToContext(this GeneratorExecutionContext context, string templatefile, object data, string generatedfile)
14+
{
15+
context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.projectdir", out var root);
16+
var generated = Render.FileToString(Path.Combine(root, "..", "..", "gen", "LibKubernetesGenerator", "templates", templatefile), data);
17+
context.AddSource(generatedfile, SourceText.From(generated, Encoding.UTF8));
18+
}
19+
}
20+
}

gen/KubernetesGenerator/INustacheHelper.cs renamed to gen/LibKubernetesGenerator/INustacheHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace KubernetesGenerator
1+
namespace LibKubernetesGenerator
22
{
33
public interface INustacheHelper
44
{

0 commit comments

Comments
 (0)