adopt newer source generator (#1417)
* build on net8 * fix fmt * remove net8 for build * fix fmt * fix file load * mv proj * fix path * address comment * address comments
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
|
3D1864AA-1FFC-4512-BB13-46055E410F73
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.0.31903.59
|
VisualStudioVersion = 17.0.31903.59
|
||||||
@@ -19,8 +19,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "simple", "examples\simple\s
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "watch", "examples\watch\watch.csproj", "{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "watch", "examples\watch\watch.csproj", "{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3D1864AA-1FFC-4512-BB13-46055E410F73}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubernetesClient", "src\KubernetesClient\KubernetesClient.csproj", "{35DD7248-F9EC-4272-A32C-B0C59E5A6FA7}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubernetesClient", "src\KubernetesClient\KubernetesClient.csproj", "{35DD7248-F9EC-4272-A32C-B0C59E5A6FA7}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}"
|
||||||
@@ -39,8 +37,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "customResource", "examples\
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "generic", "examples\generic\generic.csproj", "{F06D4C3A-7825-43A8-832B-6BDE3D355486}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "generic", "examples\generic\generic.csproj", "{F06D4C3A-7825-43A8-832B-6BDE3D355486}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibKubernetesGenerator", "src\LibKubernetesGenerator\LibKubernetesGenerator.csproj", "{64C71596-B916-46EF-8115-B53E238F79D4}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "portforward", "examples\portforward\portforward.csproj", "{DFBB1025-BD22-459D-A04D-E2AB31E129E2}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "portforward", "examples\portforward\portforward.csproj", "{DFBB1025-BD22-459D-A04D-E2AB31E129E2}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "prometheus", "examples\prometheus\prometheus.csproj", "{682B94E4-1761-48FF-B5D0-87B45DC0C735}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "prometheus", "examples\prometheus\prometheus.csproj", "{682B94E4-1761-48FF-B5D0-87B45DC0C735}"
|
||||||
@@ -451,7 +447,6 @@ Global
|
|||||||
{1AA79D75-E7C4-4C0C-928B-FB12EC3CBF68} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{1AA79D75-E7C4-4C0C-928B-FB12EC3CBF68} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{DDB14203-DD5B-452A-A1E0-9FD98629101F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{DDB14203-DD5B-452A-A1E0-9FD98629101F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{1DDB0CCF-7CCE-4A60-BAC6-9AE1779DEDB5} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{35DD7248-F9EC-4272-A32C-B0C59E5A6FA7} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
|
|
||||||
{806AD0E5-833F-42FB-A870-4BCEE7F4B17F} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
{806AD0E5-833F-42FB-A870-4BCEE7F4B17F} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
||||||
{04DE2C84-117D-4E21-8B45-B7AE627697BD} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{04DE2C84-117D-4E21-8B45-B7AE627697BD} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{B9647AD4-F6B0-406F-8B79-6781E31600EC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{B9647AD4-F6B0-406F-8B79-6781E31600EC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
@@ -459,21 +454,17 @@ Global
|
|||||||
{4D2AE427-F856-49E5-B61D-EA6B17D89051} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
{4D2AE427-F856-49E5-B61D-EA6B17D89051} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
||||||
{95672061-5799-4454-ACDB-D6D330DB1EC4} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{95672061-5799-4454-ACDB-D6D330DB1EC4} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{F06D4C3A-7825-43A8-832B-6BDE3D355486} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{F06D4C3A-7825-43A8-832B-6BDE3D355486} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{64C71596-B916-46EF-8115-B53E238F79D4} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
|
|
||||||
{DFBB1025-BD22-459D-A04D-E2AB31E129E2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{DFBB1025-BD22-459D-A04D-E2AB31E129E2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{682B94E4-1761-48FF-B5D0-87B45DC0C735} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{682B94E4-1761-48FF-B5D0-87B45DC0C735} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{17AB0AD8-6C90-42DD-880C-16B5AC4A373F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{17AB0AD8-6C90-42DD-880C-16B5AC4A373F} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{80F19E8A-F097-4AA4-A68C-D417B96BBC68} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
|
|
||||||
{FD90C861-56C6-4536-B7F5-AC7779296384} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
{FD90C861-56C6-4536-B7F5-AC7779296384} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
||||||
{F626860C-F141-45B3-9DDD-88AD3932ACAF} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{F626860C-F141-45B3-9DDD-88AD3932ACAF} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{973CCB4A-F344-4C4F-81A5-0F40F7F43C07} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{973CCB4A-F344-4C4F-81A5-0F40F7F43C07} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{21201F30-5463-4FC6-93C3-FBF157F0D46C} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
|
|
||||||
{9128F6DC-6B7A-417F-937A-90461D6989A8} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
{9128F6DC-6B7A-417F-937A-90461D6989A8} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
|
||||||
{8E266190-AE6E-44A8-948D-BD974AA82428} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{8E266190-AE6E-44A8-948D-BD974AA82428} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{C0759F88-A010-4DEF-BD3B-E183D3328FFC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{C0759F88-A010-4DEF-BD3B-E183D3328FFC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{05DC8884-AC54-4603-AC25-AE9D9F24E7AE} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{05DC8884-AC54-4603-AC25-AE9D9F24E7AE} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{CC41E248-2139-427E-8DD4-B047A8924FD2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
{CC41E248-2139-427E-8DD4-B047A8924FD2} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
|
||||||
{F1C8276A-8A60-4362-96B8-A006314446AE} = {3D1864AA-1FFC-4512-BB13-46055E410F73}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}
|
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}
|
||||||
|
|||||||
@@ -123,10 +123,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="Generator" />
|
<ProjectReference Include="..\LibKubernetesGenerator\generators\LibKubernetesGenerator\LibKubernetesGenerator.csproj"
|
||||||
<AdditionalFiles Include="..\..\swagger.json"
|
|
||||||
Generator="model,modelext,api,version,versionconverterstub" />
|
|
||||||
<ProjectReference Include="..\LibKubernetesGenerator\LibKubernetesGenerator.csproj"
|
|
||||||
OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -5,9 +5,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="Generator" />
|
<ProjectReference Include="..\LibKubernetesGenerator\generators\LibKubernetesGenerator.Automapper\LibKubernetesGenerator.Automapper.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
||||||
<AdditionalFiles Include="..\..\swagger.json" Generator="versionconverterautomap,version" />
|
|
||||||
<ProjectReference Include="..\LibKubernetesGenerator\LibKubernetesGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
|
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
|
||||||
<RootNamespace>k8s</RootNamespace>
|
<RootNamespace>k8s</RootNamespace>
|
||||||
|
<!-- seems bug in net7 json generator, some types missing in its result
|
||||||
|
net8 is still in preview, will enable it after net8 release -->
|
||||||
|
<!-- <PublishAot Condition="'$(TargetFramework)' == 'net8.0'">true</PublishAot> -->
|
||||||
|
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -75,10 +79,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="Generator" />
|
<ProjectReference Include="..\LibKubernetesGenerator\generators\LibKubernetesGenerator\LibKubernetesGenerator.csproj"
|
||||||
<AdditionalFiles Include="..\..\swagger.json"
|
|
||||||
Generator="model,modelext,api,version,versionconverterstub" />
|
|
||||||
<ProjectReference Include="..\LibKubernetesGenerator\LibKubernetesGenerator.csproj"
|
|
||||||
OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace LibKubernetesGenerator
|
|||||||
{
|
{
|
||||||
internal class ApiGenerator
|
internal class ApiGenerator
|
||||||
{
|
{
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
|
||||||
{
|
{
|
||||||
var data = swagger.Operations
|
var data = swagger.Operations
|
||||||
.Where(o => o.Method != OpenApiOperationMethod.Options)
|
.Where(o => o.Method != OpenApiOperationMethod.Options)
|
||||||
|
|||||||
18
src/LibKubernetesGenerator/EmbedResource.cs
Normal file
18
src/LibKubernetesGenerator/EmbedResource.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace LibKubernetesGenerator;
|
||||||
|
|
||||||
|
internal static class EmbedResource
|
||||||
|
{
|
||||||
|
public static string GetResource(string name)
|
||||||
|
{
|
||||||
|
var assembly = Assembly.GetExecutingAssembly();
|
||||||
|
|
||||||
|
var resourceName = assembly.GetName().Name + "." + name;
|
||||||
|
|
||||||
|
using var stream = assembly.GetManifestResourceStream(resourceName);
|
||||||
|
using var reader = new StreamReader(stream ?? throw new FileNotFoundException(resourceName));
|
||||||
|
return reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.Text;
|
using Microsoft.CodeAnalysis.Text;
|
||||||
using Nustache.Core;
|
using Nustache.Core;
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace LibKubernetesGenerator
|
namespace LibKubernetesGenerator
|
||||||
{
|
{
|
||||||
internal static class GeneratorExecutionContextExt
|
internal static class GeneratorExecutionContextExt
|
||||||
{
|
{
|
||||||
public static void RenderToContext(this GeneratorExecutionContext context, string templatefile, object data, string generatedfile)
|
public static void RenderToContext(this IncrementalGeneratorPostInitializationContext context, string templatefile, object data, string generatedfile)
|
||||||
{
|
{
|
||||||
context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.projectdir", out var root);
|
var template = EmbedResource.GetResource(templatefile);
|
||||||
var generated = Render.FileToString(Path.Combine(root, "..", "LibKubernetesGenerator", "templates", templatefile), data);
|
var generated = Render.StringToString(template, data);
|
||||||
context.AddSource(generatedfile, SourceText.From(generated, Encoding.UTF8));
|
context.AddSource(generatedfile, SourceText.From(generated, Encoding.UTF8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,146 +2,142 @@ using Autofac;
|
|||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using NSwag;
|
using NSwag;
|
||||||
using Nustache.Core;
|
using Nustache.Core;
|
||||||
|
#if GENERATE_AUTOMAPPER
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
#endif
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace LibKubernetesGenerator
|
namespace LibKubernetesGenerator
|
||||||
{
|
{
|
||||||
[Generator]
|
[Generator]
|
||||||
public class KubernetesClientSourceGenerator : ISourceGenerator
|
public class KubernetesClientSourceGenerator : IIncrementalGenerator
|
||||||
{
|
{
|
||||||
private static readonly object Execlock = new object();
|
private static readonly object Execlock = new object();
|
||||||
|
|
||||||
public void ExecuteInner(GeneratorExecutionContext context)
|
private static (OpenApiDocument, IContainer) BuildContainer()
|
||||||
{
|
{
|
||||||
lock (Execlock)
|
var swagger = OpenApiDocument.FromJsonAsync(EmbedResource.GetResource("swagger.json")).GetAwaiter().GetResult();
|
||||||
|
var container = BuildContainer(swagger);
|
||||||
|
// TODO move to Handlebars.Net
|
||||||
|
// here is to clean up the custom helpers in static Nustache.Core.Helpers
|
||||||
{
|
{
|
||||||
var swaggerfile = context.AdditionalFiles.First(f => f.Path.EndsWith("swagger.json"));
|
var ch = typeof(Helpers).GetField("CustomHelpers", BindingFlags.Static | BindingFlags.NonPublic);
|
||||||
var swagger = OpenApiDocument.FromJsonAsync(swaggerfile.GetText().ToString()).GetAwaiter().GetResult();
|
((Dictionary<string, Helper>)ch.GetValue(null)).Clear();
|
||||||
|
|
||||||
context.AnalyzerConfigOptions.GetOptions(swaggerfile).TryGetValue("build_metadata.AdditionalFiles.Generator", out var generatorSetting);
|
|
||||||
var generators = new HashSet<string>(generatorSetting.Split(','));
|
|
||||||
|
|
||||||
var builder = new ContainerBuilder();
|
|
||||||
|
|
||||||
builder.RegisterType<ClassNameHelper>()
|
|
||||||
.WithParameter(new NamedParameter(nameof(swagger), swagger))
|
|
||||||
.AsSelf()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<StringHelpers>()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<MetaHelper>()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<PluralHelper>()
|
|
||||||
.WithParameter(new TypedParameter(typeof(OpenApiDocument), swagger))
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<GeneralNameHelper>()
|
|
||||||
.AsSelf()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<TypeHelper>()
|
|
||||||
.AsSelf()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<ParamHelper>()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<UtilHelper>()
|
|
||||||
.AsImplementedInterfaces()
|
|
||||||
;
|
|
||||||
|
|
||||||
builder.RegisterType<ModelExtGenerator>();
|
|
||||||
builder.RegisterType<ModelGenerator>();
|
|
||||||
builder.RegisterType<ApiGenerator>();
|
|
||||||
builder.RegisterType<VersionConverterStubGenerator>();
|
|
||||||
builder.RegisterType<VersionConverterAutoMapperGenerator>();
|
|
||||||
builder.RegisterType<VersionGenerator>();
|
|
||||||
|
|
||||||
var container = builder.Build();
|
|
||||||
// TODO move to Handlebars.Net
|
|
||||||
{
|
|
||||||
var ch = typeof(Helpers).GetField("CustomHelpers", BindingFlags.Static | BindingFlags.NonPublic);
|
|
||||||
((Dictionary<string, Helper>)ch.GetValue(null)).Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var helper in container.Resolve<IEnumerable<INustacheHelper>>())
|
|
||||||
{
|
|
||||||
helper.RegisterHelper();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (generators.Contains("api"))
|
|
||||||
{
|
|
||||||
container.Resolve<ApiGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generators.Contains("model"))
|
|
||||||
{
|
|
||||||
container.Resolve<ModelGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generators.Contains("modelext"))
|
|
||||||
{
|
|
||||||
container.Resolve<ModelExtGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generators.Contains("versionconverterstub"))
|
|
||||||
{
|
|
||||||
container.Resolve<VersionConverterStubGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generators.Contains("versionconverterautomap"))
|
|
||||||
{
|
|
||||||
container.Resolve<VersionConverterAutoMapperGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generators.Contains("version"))
|
|
||||||
{
|
|
||||||
container.Resolve<VersionGenerator>().Generate(swagger, context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var helper in container.Resolve<IEnumerable<INustacheHelper>>())
|
||||||
|
{
|
||||||
|
helper.RegisterHelper();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (swagger, container);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
private static IContainer BuildContainer(OpenApiDocument swagger)
|
||||||
{
|
{
|
||||||
try
|
var builder = new ContainerBuilder();
|
||||||
{
|
|
||||||
ExecuteInner(context);
|
builder.RegisterType<ClassNameHelper>()
|
||||||
}
|
.WithParameter(new NamedParameter(nameof(swagger), swagger))
|
||||||
catch (Exception e)
|
.AsSelf()
|
||||||
{
|
.AsImplementedInterfaces()
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
;
|
||||||
new DiagnosticDescriptor(
|
|
||||||
"K8SCSG01",
|
builder.RegisterType<StringHelpers>()
|
||||||
e.Message,
|
.AsImplementedInterfaces()
|
||||||
e.StackTrace,
|
;
|
||||||
"Kubernetes C# code generator",
|
|
||||||
DiagnosticSeverity.Error,
|
builder.RegisterType<MetaHelper>()
|
||||||
true), Location.None));
|
.AsImplementedInterfaces()
|
||||||
}
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<PluralHelper>()
|
||||||
|
.WithParameter(new TypedParameter(typeof(OpenApiDocument), swagger))
|
||||||
|
.AsImplementedInterfaces()
|
||||||
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<GeneralNameHelper>()
|
||||||
|
.AsSelf()
|
||||||
|
.AsImplementedInterfaces()
|
||||||
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<TypeHelper>()
|
||||||
|
.AsSelf()
|
||||||
|
.AsImplementedInterfaces()
|
||||||
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<ParamHelper>()
|
||||||
|
.AsImplementedInterfaces()
|
||||||
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<UtilHelper>()
|
||||||
|
.AsImplementedInterfaces()
|
||||||
|
;
|
||||||
|
|
||||||
|
builder.RegisterType<ModelExtGenerator>();
|
||||||
|
builder.RegisterType<ModelGenerator>();
|
||||||
|
builder.RegisterType<ApiGenerator>();
|
||||||
|
builder.RegisterType<VersionConverterStubGenerator>();
|
||||||
|
builder.RegisterType<VersionConverterAutoMapperGenerator>();
|
||||||
|
builder.RegisterType<VersionGenerator>();
|
||||||
|
|
||||||
|
return builder.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(GeneratorInitializationContext context)
|
public void Initialize(IncrementalGeneratorInitializationContext generatorContext)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if GENERATE_BASIC
|
||||||
// if (!Debugger.IsAttached)
|
generatorContext.RegisterPostInitializationOutput(ctx =>
|
||||||
// {
|
{
|
||||||
// Debugger.Launch();
|
lock (Execlock)
|
||||||
// }
|
{
|
||||||
|
var (swagger, container) = BuildContainer();
|
||||||
|
|
||||||
|
container.Resolve<VersionGenerator>().Generate(swagger, ctx);
|
||||||
|
|
||||||
|
container.Resolve<ModelGenerator>().Generate(swagger, ctx);
|
||||||
|
container.Resolve<ModelExtGenerator>().Generate(swagger, ctx);
|
||||||
|
container.Resolve<VersionConverterStubGenerator>().Generate(swagger, ctx);
|
||||||
|
|
||||||
|
container.Resolve<ApiGenerator>().Generate(swagger, ctx);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GENERATE_AUTOMAPPER
|
||||||
|
var automappersrc = generatorContext.CompilationProvider.Select((c, _) => c.SyntaxTrees.First(s => PathSuffixMath(s.FilePath, "AutoMapper/VersionConverter.cs")));
|
||||||
|
generatorContext.RegisterSourceOutput(automappersrc, (ctx, srctree) =>
|
||||||
|
{
|
||||||
|
lock (Execlock)
|
||||||
|
{
|
||||||
|
var (swagger, container) = BuildContainer();
|
||||||
|
|
||||||
|
container.Resolve<VersionConverterAutoMapperGenerator>().Generate(swagger, ctx, srctree);
|
||||||
|
}
|
||||||
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GENERATE_AUTOMAPPER
|
||||||
|
private IEnumerable<string> PathSplit(string path)
|
||||||
|
{
|
||||||
|
var p = path;
|
||||||
|
|
||||||
|
while (!string.IsNullOrEmpty(p))
|
||||||
|
{
|
||||||
|
yield return Path.GetFileName(p);
|
||||||
|
p = Path.GetDirectoryName(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool PathSuffixMath(string path, string suffix)
|
||||||
|
{
|
||||||
|
var s = PathSplit(suffix).ToList();
|
||||||
|
return PathSplit(path).Take(s.Count).SequenceEqual(s);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +1,48 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<NoWarn>CA1812</NoWarn>
|
<NoWarn>CA1812</NoWarn>
|
||||||
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.2.0" PrivateAssets="all" />
|
<Compile Include="$(MSBuildThisFileDirectory)/*.cs" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
|
<EmbeddedResource Include="$(MSBuildThisFileDirectory)/../../swagger.json" WithCulture="false" Visible="false" />
|
||||||
</ItemGroup>
|
<EmbeddedResource Include="$(MSBuildThisFileDirectory)/templates/*" WithCulture="false" />
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Autofac" Version="7.1.0" GeneratePathProperty="true" PrivateAssets="all" />
|
<ItemGroup>
|
||||||
<PackageReference Include="CaseExtensions" Version="1.1.0" GeneratePathProperty="true" PrivateAssets="all" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.4.0" PrivateAssets="all" />
|
||||||
<PackageReference Include="NSwag.Core" Version="13.20.0" GeneratePathProperty="true" PrivateAssets="all" />
|
</ItemGroup>
|
||||||
<PackageReference Include="Nustache" Version="1.16.0.10" GeneratePathProperty="true" PrivateAssets="all" NoWarn="NU1701" />
|
|
||||||
<PackageReference Include="NJsonSchema" Version="10.9.0" GeneratePathProperty="true" PrivateAssets="all" />
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="7.0.0" GeneratePathProperty="true" PrivateAssets="all" />
|
<PackageReference Include="Autofac" Version="7.1.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" GeneratePathProperty="true" PrivateAssets="all" />
|
<PackageReference Include="CaseExtensions" Version="1.1.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
<PackageReference Include="Namotion.Reflection" Version="3.0.0" GeneratePathProperty="true" PrivateAssets="all" />
|
<PackageReference Include="NSwag.Core" Version="13.20.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="7.0.2" GeneratePathProperty="true" PrivateAssets="all" />
|
<PackageReference Include="Nustache" Version="1.16.0.10" GeneratePathProperty="true" PrivateAssets="all" NoWarn="NU1701" />
|
||||||
</ItemGroup>
|
<PackageReference Include="NJsonSchema" Version="10.9.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
|
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="7.0.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
<PropertyGroup>
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
|
<PackageReference Include="Namotion.Reflection" Version="3.0.0" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
</PropertyGroup>
|
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="7.0.2" GeneratePathProperty="true" PrivateAssets="all" />
|
||||||
|
</ItemGroup>
|
||||||
<Target Name="GetDependencyTargetPaths">
|
|
||||||
<ItemGroup>
|
<PropertyGroup>
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGAutofac)\lib\netstandard2.0\Autofac.dll" IncludeRuntimeDependency="false" />
|
<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGCaseExtensions)\lib\netstandard2.0\CaseExtensions.dll" IncludeRuntimeDependency="false" />
|
</PropertyGroup>
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGNSwag_Core)\lib\netstandard2.0\NSwag.Core.dll" IncludeRuntimeDependency="false" />
|
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGNustache)\lib\net20\Nustache.Core.dll" IncludeRuntimeDependency="false" />
|
<Target Name="GetDependencyTargetPaths">
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGNJsonSchema)\lib\netstandard2.0\NJsonSchema.dll" IncludeRuntimeDependency="false" />
|
<ItemGroup>
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGMicrosoft_Bcl_AsyncInterfaces)\lib\netstandard2.0\Microsoft.Bcl.AsyncInterfaces.dll" IncludeRuntimeDependency="false" />
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGAutofac)\lib\netstandard2.0\Autofac.dll" IncludeRuntimeDependency="false" />
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGNewtonsoft_Json)\lib\netstandard1.0\Newtonsoft.Json.dll" IncludeRuntimeDependency="false" />
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGCaseExtensions)\lib\netstandard2.0\CaseExtensions.dll" IncludeRuntimeDependency="false" />
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGNamotion_Reflection)\lib\netstandard2.0\Namotion.Reflection.dll" IncludeRuntimeDependency="false" />
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGNSwag_Core)\lib\netstandard2.0\NSwag.Core.dll" IncludeRuntimeDependency="false" />
|
||||||
<TargetPathWithTargetPlatformMoniker Include="$(PKGSystem_Diagnostics_DiagnosticSource)\lib\netstandard2.0\System.Diagnostics.DiagnosticSource.dll" IncludeRuntimeDependency="false" />
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGNustache)\lib\net20\Nustache.Core.dll" IncludeRuntimeDependency="false" />
|
||||||
</ItemGroup>
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGNJsonSchema)\lib\netstandard2.0\NJsonSchema.dll" IncludeRuntimeDependency="false" />
|
||||||
</Target>
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGMicrosoft_Bcl_AsyncInterfaces)\lib\netstandard2.0\Microsoft.Bcl.AsyncInterfaces.dll" IncludeRuntimeDependency="false" />
|
||||||
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGNewtonsoft_Json)\lib\netstandard1.0\Newtonsoft.Json.dll" IncludeRuntimeDependency="false" />
|
||||||
</Project>
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGNamotion_Reflection)\lib\netstandard2.0\Namotion.Reflection.dll" IncludeRuntimeDependency="false" />
|
||||||
|
<TargetPathWithTargetPlatformMoniker Include="$(PKGSystem_Diagnostics_DiagnosticSource)\lib\netstandard2.0\System.Diagnostics.DiagnosticSource.dll" IncludeRuntimeDependency="false" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -27,10 +27,10 @@ namespace LibKubernetesGenerator
|
|||||||
|
|
||||||
private static string GetKind(JsonSchema definition)
|
private static string GetKind(JsonSchema definition)
|
||||||
{
|
{
|
||||||
var groupVersionKindElements = (object[])definition.ExtensionData["x-kubernetes-group-version-kind"];
|
var groupVersionKindElements = (object[])definition.ExtensionData["x-kubernetes-group-version-kind"];
|
||||||
var groupVersionKind = (Dictionary<string, object>)groupVersionKindElements[0];
|
var groupVersionKind = (Dictionary<string, object>)groupVersionKindElements[0];
|
||||||
|
|
||||||
return groupVersionKind["kind"] as string;
|
return groupVersionKind["kind"] as string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GetGroup(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
|
public static void GetGroup(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace LibKubernetesGenerator
|
|||||||
this.classNameHelper = classNameHelper;
|
this.classNameHelper = classNameHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
|
||||||
{
|
{
|
||||||
// Generate the interface declarations
|
// Generate the interface declarations
|
||||||
var skippedTypes = new HashSet<string> { "V1WatchEvent" };
|
var skippedTypes = new HashSet<string> { "V1WatchEvent" };
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace LibKubernetesGenerator
|
|||||||
this.classNameHelper = classNameHelper;
|
this.classNameHelper = classNameHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
|
||||||
{
|
{
|
||||||
foreach (var kv in swagger.Definitions)
|
foreach (var kv in swagger.Definitions)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.Text;
|
using Microsoft.CodeAnalysis.Text;
|
||||||
using NSwag;
|
using NSwag;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
@@ -19,7 +17,7 @@ namespace LibKubernetesGenerator
|
|||||||
this.classNameHelper = classNameHelper;
|
this.classNameHelper = classNameHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, SourceProductionContext context, SyntaxTree manualconverter)
|
||||||
{
|
{
|
||||||
var allGeneratedModelClassNames = new List<string>();
|
var allGeneratedModelClassNames = new List<string>();
|
||||||
|
|
||||||
@@ -32,7 +30,6 @@ namespace LibKubernetesGenerator
|
|||||||
|
|
||||||
var manualMaps = new List<(string, string)>();
|
var manualMaps = new List<(string, string)>();
|
||||||
|
|
||||||
var manualconverter = context.Compilation.SyntaxTrees.First(s => PathSuffixMath(s.FilePath, "AutoMapper/VersionConverter.cs"));
|
|
||||||
manualMaps = Regex.Matches(manualconverter.GetText().ToString(), @"\.CreateMap<(?<T1>.+?),\s?(?<T2>.+?)>")
|
manualMaps = Regex.Matches(manualconverter.GetText().ToString(), @"\.CreateMap<(?<T1>.+?),\s?(?<T2>.+?)>")
|
||||||
.OfType<Match>()
|
.OfType<Match>()
|
||||||
.Select(x => (x.Groups["T1"].Value, x.Groups["T2"].Value))
|
.Select(x => (x.Groups["T1"].Value, x.Groups["T2"].Value))
|
||||||
@@ -81,22 +78,5 @@ internal static partial class VersionConverter
|
|||||||
|
|
||||||
context.AddSource($"VersionConverter.g.cs", SourceText.From(sbversion.ToString(), Encoding.UTF8));
|
context.AddSource($"VersionConverter.g.cs", SourceText.From(sbversion.ToString(), Encoding.UTF8));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<string> PathSplit(string path)
|
|
||||||
{
|
|
||||||
var p = path;
|
|
||||||
|
|
||||||
while (!string.IsNullOrEmpty(p))
|
|
||||||
{
|
|
||||||
yield return Path.GetFileName(p);
|
|
||||||
p = Path.GetDirectoryName(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool PathSuffixMath(string path, string suffix)
|
|
||||||
{
|
|
||||||
var s = PathSplit(suffix).ToList();
|
|
||||||
return PathSplit(path).Take(s.Count).SequenceEqual(s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace LibKubernetesGenerator
|
|||||||
this.classNameHelper = classNameHelper;
|
this.classNameHelper = classNameHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
|
||||||
{
|
{
|
||||||
var allGeneratedModelClassNames = new List<string>();
|
var allGeneratedModelClassNames = new List<string>();
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace LibKubernetesGenerator;
|
|||||||
|
|
||||||
internal class VersionGenerator
|
internal class VersionGenerator
|
||||||
{
|
{
|
||||||
public void Generate(OpenApiDocument swagger, GeneratorExecutionContext context)
|
public void Generate(OpenApiDocument swagger, IncrementalGeneratorPostInitializationContext context)
|
||||||
{
|
{
|
||||||
context.AddSource("k8sver.cs", $"// <auto-generated />\n" + "internal static partial class ThisAssembly { internal const string KubernetesSwaggerVersion = \"" + swagger.Info.Version + "\";}");
|
context.AddSource("k8sver.cs", $"// <auto-generated />\n" + "internal static partial class ThisAssembly { internal const string KubernetesSwaggerVersion = \"" + swagger.Info.Version + "\";}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<DefineConstants>$(DefineConstants);GENERATE_AUTOMAPPER;</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<Import Project="../../LibKubernetesGenerator.target" />
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<DefineConstants>$(DefineConstants);GENERATE_BASIC;</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<Import Project="../../LibKubernetesGenerator.target" />
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -16,3 +16,15 @@ namespace k8s.Models
|
|||||||
|
|
||||||
{{/.}}
|
{{/.}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if NET8_0_OR_GREATER
|
||||||
|
namespace k8s
|
||||||
|
{
|
||||||
|
{{#.}}
|
||||||
|
[JsonSerializable(typeof({{GetClassName . }}))]
|
||||||
|
{{/.}}
|
||||||
|
internal partial class SourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user