-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInitializeComponentAttribute.SourceGenerator.cs
More file actions
50 lines (46 loc) · 1.79 KB
/
InitializeComponentAttribute.SourceGenerator.cs
File metadata and controls
50 lines (46 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Riverside.Extensions.WinUI
{
[Generator]
public partial class InitializeComponentGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
// No initialization required for this source generator
}
public void Execute(GeneratorExecutionContext context)
{
// Find all classes with the InitializeComponentAttribute
var classesWithAttribute = context.Compilation.SyntaxTrees
.SelectMany(syntaxTree => syntaxTree.GetRoot().DescendantNodes())
.OfType<ClassDeclarationSyntax>()
.Where(classDeclaration => classDeclaration.AttributeLists
.SelectMany(attributeList => attributeList.Attributes)
.Any(attribute => attribute.Name.ToString() == "InitializeComponent"));
foreach (var classDeclaration in classesWithAttribute)
{
var namespaceDeclaration = classDeclaration.Ancestors().OfType<NamespaceDeclarationSyntax>().FirstOrDefault();
var namespaceName = namespaceDeclaration?.Name.ToString() ?? "GlobalNamespace";
var className = classDeclaration.Identifier.Text;
var source = $@"
namespace {namespaceName}
{{
public partial class {className}
{{
public {className}()
{{
this.InitializeComponent();
}}
}}
}}";
context.AddSource($"{className}_InitializeComponent.g.cs", SourceText.From(source, Encoding.UTF8));
}
}
}
}