Skip to content

Commit c596c09

Browse files
Auto generate static ctor with AutoDetectViewPropertiesToSubscribe to Catel views
1 parent e41e5e0 commit c596c09

8 files changed

+74
-8
lines changed

src/Catel.SourceGenerators.Tests/XamlConstructors/UserControlConstructorSourceGeneratorTests.Generates_Constructors_When_No_Constructors#MyUserControl_UserControlConstructors.g.verified.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace MyNamespace
1010
{
1111
partial class MyUserControl
1212
{
13+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.UserControlConstructors", "1.0.0.0")]
1314
private static T GetService<T>()
1415
where T : class
1516
{
@@ -21,6 +22,17 @@ private static T GetService<T>()
2122
return Catel.IoC.IoCContainer.ServiceProvider.GetRequiredService<T>();
2223
}
2324

25+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.UserControlConstructors", "1.0.0.0")]
26+
private static void InitializeViewPropertyMappings()
27+
{
28+
if (CatelEnvironment.IsInDesignMode)
29+
{
30+
return;
31+
}
32+
33+
typeof(MyUserControl).AutoDetectViewPropertiesToSubscribe(IoCContainer.ServiceProvider.GetRequiredService<IViewPropertySelector>());
34+
}
35+
2436
partial void OnInitializingComponent();
2537

2638
partial void OnInitializedComponent();

src/Catel.SourceGenerators.Tests/XamlConstructors/UserControlConstructorSourceGeneratorTests.Generates_Empty_Constructor_And_Attributes_For_UserControl#MyUserControl_UserControlConstructors.g.verified.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace MyNamespace
1010
{
1111
partial class MyUserControl
1212
{
13+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.UserControlConstructors", "1.0.0.0")]
1314
private static T GetService<T>()
1415
where T : class
1516
{
@@ -21,6 +22,17 @@ private static T GetService<T>()
2122
return Catel.IoC.IoCContainer.ServiceProvider.GetRequiredService<T>();
2223
}
2324

25+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.UserControlConstructors", "1.0.0.0")]
26+
private static void InitializeViewPropertyMappings()
27+
{
28+
if (CatelEnvironment.IsInDesignMode)
29+
{
30+
return;
31+
}
32+
33+
typeof(MyUserControl).AutoDetectViewPropertiesToSubscribe(IoCContainer.ServiceProvider.GetRequiredService<IViewPropertySelector>());
34+
}
35+
2436
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.UserControlConstructors", "1.0.0.0")]
2537
public MyUserControl()
2638
: this(GetService<MyNamespace.ILogger<MyNamespace.MyUserControl>>(), GetService<MyNamespace.IUserControlWrapperService>())

src/Catel.SourceGenerators.Tests/XamlConstructors/ValueConverterConstructorSourceGeneratorTests.Generates_Empty_Constructor_For_Generic_ValueConverter#MyConverter_BehaviorConstructors.g.verified.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace MyNamespace
1010
{
1111
partial class MyConverter
1212
{
13+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.ValueConverterConstructors", "1.0.0.0")]
1314
private static T GetService<T>()
1415
where T : class
1516
{

src/Catel.SourceGenerators/Extensions/IndentedStringBuilderExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ public static void AppendGeneratedCodeAttribute(this IndentedStringBuilder write
2323
writer.AppendLine($"""[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Catel.{generatorName}", "{GeneratorVersion}")]""");
2424
}
2525

26-
public static void AppendResolveServiceMethod(this IndentedStringBuilder writer)
26+
public static void AppendResolveServiceMethod(this IndentedStringBuilder writer, string generatorName)
2727
{
28+
writer.AppendGeneratedCodeAttribute(generatorName);
2829
writer.AppendLine($"private static T GetService<T>()");
2930
writer.AppendLine($" where T : class");
3031
writer.StartBlock();

src/Catel.SourceGenerators/XamlConstructors/BehaviorConstructorsSourceGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ private static void Execute(SourceProductionContext sourceProductionContext, Beh
149149
sourceBuilder.AppendLine($"partial class {ctorInfo.ClassName}");
150150
sourceBuilder.StartBlock();
151151

152-
sourceBuilder.AppendResolveServiceMethod();
152+
sourceBuilder.AppendResolveServiceMethod("BehaviorConstructors");
153153

154154
// Generate empty constructor
155155
sourceBuilder.AppendGeneratedCodeAttribute("BehaviorConstructors");

src/Catel.SourceGenerators/XamlConstructors/UserControlConstructorsInfo.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
public readonly string FileName;
99
public readonly string NamespaceName;
1010
public readonly string ClassName;
11+
public readonly bool CreateStaticConstructor;
1112
public readonly EquatableArray<ConstructorInfo> Constructors;
1213

1314
public UserControlConstructorsInfo(string fileName, string namespaceName, string className,
14-
IReadOnlyList<ConstructorInfo> constructors)
15+
bool createStaticConstructor, IReadOnlyList<ConstructorInfo> constructors)
1516
{
1617
FileName = fileName;
1718
NamespaceName = namespaceName;
1819
ClassName = className;
20+
CreateStaticConstructor = createStaticConstructor;
1921
Constructors = new(constructors);
2022
}
2123

src/Catel.SourceGenerators/XamlConstructors/UserControlConstructorsSourceGenerator.cs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
using System.Collections.Generic;
44
using System.Collections.Immutable;
5+
using System.ComponentModel;
56
using System.Diagnostics;
67
using System.Linq;
78
using System.Text;
@@ -93,11 +94,22 @@ private static bool IsSyntaxTargetForGeneration(SyntaxNode node)
9394
{
9495
return null;
9596
}
97+
98+
var isCatelView = false;
9699
var baseType = classSymbol.BaseType;
97100
while (baseType is not null)
98101
{
99102
var displayString = baseType.ToDisplayString();
100-
if (displayString == "System.Windows.Controls.Control" ||
103+
if (!isCatelView)
104+
{
105+
if (displayString.Contains("Catel.Windows.Controls.UserControl") ||
106+
displayString.Contains("Catel.Windows.Controls.UserControl"))
107+
{
108+
isCatelView = true;
109+
}
110+
}
111+
112+
if (displayString == "System.Windows.Controls.Control" ||
101113
displayString == "System.Windows.Controls.UserControl" ||
102114
displayString == "System.Windows.Window")
103115
{
@@ -155,7 +167,9 @@ private static bool IsSyntaxTargetForGeneration(SyntaxNode node)
155167

156168
return new UserControlConstructorsInfo(
157169
classDeclarationSyntax.SyntaxTree.FilePath,
158-
classSymbol.ContainingNamespace.ToDisplayString(), classSymbol.Name,
170+
classSymbol.ContainingNamespace.ToDisplayString(),
171+
classSymbol.Name,
172+
isCatelView && classSymbol.Constructors.Any(x => x.IsStatic),
159173
ctors);
160174
}
161175

@@ -172,7 +186,9 @@ private static bool IsSyntaxTargetForGeneration(SyntaxNode node)
172186

173187
var info = new UserControlConstructorsInfo(
174188
classDeclarationSyntax.SyntaxTree.FilePath,
175-
classSymbol.ContainingNamespace.ToDisplayString(), classSymbol.Name,
189+
classSymbol.ContainingNamespace.ToDisplayString(),
190+
classSymbol.Name,
191+
isCatelView && classSymbol.Constructors.Any(x => x.IsStatic),
176192
classConstructors);
177193
return info;
178194
}
@@ -201,7 +217,29 @@ private static void Execute(SourceProductionContext sourceProductionContext, Use
201217
sourceBuilder.AppendLine($"partial class {ctorsInfo.ClassName}");
202218
sourceBuilder.StartBlock();
203219

204-
sourceBuilder.AppendResolveServiceMethod();
220+
sourceBuilder.AppendResolveServiceMethod("UserControlConstructors");
221+
222+
sourceBuilder.AppendGeneratedCodeAttribute("UserControlConstructors");
223+
sourceBuilder.AppendLine("private static void InitializeViewPropertyMappings()");
224+
sourceBuilder.StartBlock();
225+
sourceBuilder.AppendLine("if (CatelEnvironment.IsInDesignMode)");
226+
sourceBuilder.StartBlock();
227+
sourceBuilder.AppendLine("return;");
228+
sourceBuilder.EndBlock();
229+
sourceBuilder.AppendLine();
230+
sourceBuilder.AppendLine($"typeof({ctorsInfo.ClassName}).AutoDetectViewPropertiesToSubscribe(IoCContainer.ServiceProvider.GetRequiredService<IViewPropertySelector>());");
231+
sourceBuilder.EndBlock();
232+
233+
if (ctorsInfo.CreateStaticConstructor)
234+
{
235+
sourceBuilder.AppendGeneratedCodeAttribute("UserControlConstructors");
236+
sourceBuilder.AppendLine($"static {ctorsInfo.ClassName})");
237+
sourceBuilder.StartBlock();
238+
sourceBuilder.AppendLine("InitializeViewPropertyMappings();");
239+
sourceBuilder.EndBlock();
240+
}
241+
242+
sourceBuilder.AppendLine();
205243

206244
foreach (var ctorInfo in ctorsInfo.Constructors)
207245
{

src/Catel.SourceGenerators/XamlConstructors/ValueConverterConstructorsSourceGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ private static void Execute(SourceProductionContext sourceProductionContext, Val
130130
sourceBuilder.AppendLine($"partial class {ctorInfo.ClassName}");
131131
sourceBuilder.StartBlock();
132132

133-
sourceBuilder.AppendResolveServiceMethod();
133+
sourceBuilder.AppendResolveServiceMethod("ValueConverterConstructors");
134134

135135
// Generate empty constructor
136136
sourceBuilder.AppendGeneratedCodeAttribute("ValueConverterConstructors");

0 commit comments

Comments
 (0)