Skip to content

Commit 42a0fe1

Browse files
Code gen generate service collection extension (#809)
* GenerateServiceCollectionExtension * Fix mergeerror * fix warning
1 parent d7940c2 commit 42a0fe1

File tree

5 files changed

+80
-3
lines changed

5 files changed

+80
-3
lines changed

src/HassModel/NetDaemon.HassModel.CodeGenerator/CodeGeneration/EntitiesGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private static TypeDeclarationSyntax GenerateRootEntitiesClass(IEnumerable<Entit
5454
.ToPublic();
5555
}).ToArray();
5656

57-
return ClassWithInjected<IHaContext>("Entities")
57+
return ClassWithInjected<IHaContext>(EntitiesClassName)
5858
.ToPublic()
5959
.AddModifiers(Token(SyntaxKind.PartialKeyword))
6060
.WithBase((string)"IEntities")

src/HassModel/NetDaemon.HassModel.CodeGenerator/CodeGeneration/Generator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.CodeAnalysis.CSharp;
2+
using NetDaemon.HassModel.CodeGenerator.CodeGeneration;
23
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
34

45
namespace NetDaemon.HassModel.CodeGenerator;
@@ -11,11 +12,12 @@ public static IEnumerable<MemberDeclarationSyntax> GenerateTypes(
1112
{
1213
var orderedServiceDomains = services.OrderBy(x => x.Domain).ToArray();
1314

15+
var helpers = HelpersGenerator.Generate(domains, orderedServiceDomains);
1416
var entityClasses = EntitiesGenerator.Generate(domains);
1517
var serviceClasses = ServicesGenerator.Generate(orderedServiceDomains);
1618
var extensionMethodClasses = ExtensionMethodsGenerator.Generate(orderedServiceDomains, domains);
1719

18-
return new[] { entityClasses, serviceClasses, extensionMethodClasses }.SelectMany(x => x).ToList();
20+
return new[] {helpers, entityClasses, serviceClasses, extensionMethodClasses }.SelectMany(x => x).ToArray();
1921
}
2022

2123
public static CompilationUnitSyntax BuildCompilationUnit(string namespaceName, params MemberDeclarationSyntax[] generatedTypes)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
2+
using static Microsoft.CodeAnalysis.CSharp.SyntaxKind;
3+
4+
namespace NetDaemon.HassModel.CodeGenerator.CodeGeneration;
5+
6+
internal static class HelpersGenerator
7+
{
8+
public static IEnumerable<MemberDeclarationSyntax> Generate(IReadOnlyCollection<EntityDomainMetadata> domains, IEnumerable<HassServiceDomain> orderedServiceDomains)
9+
{
10+
var extensionClass = GenerateServiceCollectionExtension(domains, orderedServiceDomains);
11+
return new[] { extensionClass };
12+
}
13+
14+
/// <summary>
15+
/// Generates the ServiceCollectionExtensions class
16+
/// </summary>
17+
/// public static class GeneratedExtensions
18+
/// {
19+
/// ...
20+
/// }
21+
private static ClassDeclarationSyntax GenerateServiceCollectionExtension(IReadOnlyCollection<EntityDomainMetadata> domains, IEnumerable<HassServiceDomain> orderedServiceDomains)
22+
{
23+
return
24+
ClassDeclaration("GeneratedExtensions").WithModifiers(TokenList(Token(PublicKeyword), Token(StaticKeyword)))
25+
.WithMembers(new SyntaxList<MemberDeclarationSyntax>(new[]
26+
{
27+
BuildAddHomeAssistantGenerated(domains, orderedServiceDomains)
28+
}
29+
));
30+
}
31+
32+
/// <summary>
33+
/// Generates the AddHomeAssistantGenerated method
34+
/// </summary>
35+
//
36+
// public static IServiceCollection AddGeneratedCode(this IServiceCollection serviceCollection)
37+
// {
38+
// serviceCollection.AddTransient<Entities>();
39+
// serviceCollection.AddTransient<AutomationEntities>();
40+
// serviceCollection.AddTransient<BinarySensorEntities>();
41+
// serviceCollection.AddTransient<Services>();
42+
// serviceCollection.AddTransient<AlarmControlPanelServices>();
43+
// return serviceCollection;
44+
// }
45+
private static MethodDeclarationSyntax BuildAddHomeAssistantGenerated(IEnumerable<EntityDomainMetadata> domains, IEnumerable<HassServiceDomain> orderedServiceDomains)
46+
{
47+
48+
var injectableTypes = GetInjectableTypes(domains, orderedServiceDomains);
49+
50+
var statements = injectableTypes.Select(name =>
51+
ExpressionStatement(InvocationExpression(
52+
MemberAccessExpression(SimpleMemberAccessExpression, IdentifierName("serviceCollection"),
53+
GenericName(Identifier("AddTransient"))
54+
.WithTypeArgumentList(TypeArgumentList(SingletonSeparatedList<TypeSyntax>(IdentifierName(name))))))));
55+
56+
return MethodDeclaration(IdentifierName("IServiceCollection"), Identifier("AddHomeAssistantGenerated"))
57+
.WithModifiers(TokenList(Token(PublicKeyword), Token(StaticKeyword)))
58+
.WithParameterList(ParameterList(SingletonSeparatedList(Parameter(Identifier("serviceCollection"))
59+
.WithModifiers(TokenList(Token(ThisKeyword))).WithType(IdentifierName("IServiceCollection")))))
60+
.WithBody(Block(
61+
statements
62+
.Append<StatementSyntax>(ReturnStatement(IdentifierName("serviceCollection")))))
63+
.WithSummaryComment("Registers all injectable generated types in the serviceCollection");
64+
}
65+
66+
private static IEnumerable<string> GetInjectableTypes(IEnumerable<EntityDomainMetadata> domains, IEnumerable<HassServiceDomain> orderedServiceDomains) =>
67+
domains.Select(d => d.EntitiesForDomainClassName)
68+
.Prepend(EntitiesClassName)
69+
.Append(ServicesClassName)
70+
.Union(orderedServiceDomains.Select(d => GetServicesTypeName(d.Domain)));
71+
}

src/HassModel/NetDaemon.HassModel.CodeGenerator/CodeGeneration/ServicesGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ private static TypeDeclarationSyntax GenerateRootServicesType(IEnumerable<string
4343
return ParseProperty(propertyCode).ToPublic();
4444
}).ToArray();
4545

46-
return ClassWithInjected<IHaContext>("Services").WithBase((string)"IServices").AddMembers(properties).ToPublic();
46+
return ClassWithInjected<IHaContext>(ServicesClassName).WithBase((string)"IServices").AddMembers(properties).ToPublic();
4747
}
4848

4949
private static TypeDeclarationSyntax GenerateRootServicesInterface(IEnumerable<string> domains)

src/HassModel/NetDaemon.HassModel.CodeGenerator/Helpers/NamingHelper.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace NetDaemon.HassModel.CodeGenerator.Helpers;
55

66
internal static class NamingHelper
77
{
8+
public const string EntitiesClassName = "Entities";
9+
public const string ServicesClassName = "Services";
10+
811
public static string GetEntitiesForDomainClassName(string prefix)
912
{
1013
var normalizedDomain = prefix.ToNormalizedPascalCase();
@@ -72,6 +75,7 @@ public static string SimplifyTypeName(Type type)
7275
{
7376
"System",
7477
"System.Collections.Generic",
78+
"Microsoft.Extensions.DependencyInjection",
7579
typeof(JsonPropertyNameAttribute).Namespace!,
7680
typeof(IHaContext).Namespace!,
7781
typeof(Entity).Namespace!,

0 commit comments

Comments
 (0)