Skip to content

Commit 49c12b5

Browse files
committed
Support useDI & Fix api translation issue
1 parent 2baa32f commit 49c12b5

File tree

1 file changed

+61
-14
lines changed

1 file changed

+61
-14
lines changed

Flow.Launcher.Localization.SourceGenerators/Localize/EnumSourceGenerator.cs

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Flow.Launcher.Localization.Shared;
77
using Microsoft.CodeAnalysis;
88
using Microsoft.CodeAnalysis.CSharp.Syntax;
9+
using Microsoft.CodeAnalysis.Diagnostics;
910
using Microsoft.CodeAnalysis.Text;
1011

1112
namespace Flow.Launcher.Localization.SourceGenerators.Localize
@@ -36,9 +37,18 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
3637
.Where(ed => ed.AttributeLists.Count > 0)
3738
.Collect();
3839

40+
var pluginClasses = context.SyntaxProvider
41+
.CreateSyntaxProvider(
42+
predicate: (n, _) => n is ClassDeclarationSyntax,
43+
transform: (c, t) => Helper.GetPluginClassInfo((ClassDeclarationSyntax)c.Node, c.SemanticModel, t))
44+
.Where(info => info != null)
45+
.Collect();
46+
3947
var compilation = context.CompilationProvider;
4048

41-
var compilationEnums = enumDeclarations.Combine(compilation);
49+
var configOptions = context.AnalyzerConfigOptionsProvider;
50+
51+
var compilationEnums = enumDeclarations.Combine(pluginClasses).Combine(configOptions).Combine(compilation);
4252

4353
context.RegisterSourceOutput(compilationEnums, Execute);
4454
}
@@ -49,14 +59,24 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
4959
/// <param name="spc">The source production context.</param>
5060
/// <param name="data">The provided data.</param>
5161
private void Execute(SourceProductionContext spc,
52-
(ImmutableArray<EnumDeclarationSyntax> Enums, Compilation Compilation) data)
62+
(((ImmutableArray<EnumDeclarationSyntax> EnumsDeclarations,
63+
ImmutableArray<PluginClassInfo> PluginClassInfos),
64+
AnalyzerConfigOptionsProvider ConfigOptionsProvider),
65+
Compilation Compilation) data)
5366
{
54-
var enums = data.Enums;
5567
var compilation = data.Compilation;
68+
var configOptions = data.Item1.ConfigOptionsProvider;
69+
var pluginClasses = data.Item1.Item1.PluginClassInfos;
70+
var enumsDeclarations = data.Item1.Item1.EnumsDeclarations;
5671

5772
var assemblyName = compilation.AssemblyName ?? Constants.DefaultNamespace;
73+
var useDI = configOptions.GetFLLUseDependencyInjection();
74+
75+
var pluginInfo = PluginInfoHelper.GetValidPluginInfoAndReportDiagnostic(pluginClasses, spc, useDI);
76+
77+
if (pluginInfo == null) return;
5878

59-
foreach (var enumDeclaration in enums.Distinct())
79+
foreach (var enumDeclaration in enumsDeclarations.Distinct())
6080
{
6181
var semanticModel = compilation.GetSemanticModel(enumDeclaration.SyntaxTree);
6282
var enumSymbol = semanticModel.GetDeclaredSymbol(enumDeclaration) as INamedTypeSymbol;
@@ -65,7 +85,7 @@ private void Execute(SourceProductionContext spc,
6585
if (enumSymbol?.GetAttributes().Any(ad =>
6686
ad.AttributeClass?.Name == Constants.EnumLocalizeAttributeName) ?? false)
6787
{
68-
GenerateSource(spc, enumSymbol, assemblyName);
88+
GenerateSource(spc, enumSymbol, useDI, pluginInfo, assemblyName);
6989
}
7090
}
7191
}
@@ -74,7 +94,12 @@ private void Execute(SourceProductionContext spc,
7494

7595
#region Generate Source
7696

77-
private void GenerateSource(SourceProductionContext spc, INamedTypeSymbol enumSymbol, string assemblyName)
97+
private void GenerateSource(
98+
SourceProductionContext spc,
99+
INamedTypeSymbol enumSymbol,
100+
bool useDI,
101+
PluginClassInfo pluginInfo,
102+
string assemblyName)
78103
{
79104
var enumFullName = enumSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
80105
var enumDataClassName = $"{enumSymbol.Name}{Constants.EnumLocalizeClassSuffix}";
@@ -129,6 +154,20 @@ private void GenerateSource(SourceProductionContext spc, INamedTypeSymbol enumSy
129154
sourceBuilder.AppendLine($"{tabString}public string LocalizationValue {{ get; set; }}");
130155
sourceBuilder.AppendLine();
131156

157+
// Generate API instance
158+
string getTranslation = null;
159+
if (useDI)
160+
{
161+
sourceBuilder.AppendLine($"{tabString}private static Flow.Launcher.Plugin.IPublicAPI? api = null;");
162+
sourceBuilder.AppendLine($"{tabString}private static Flow.Launcher.Plugin.IPublicAPI Api => api ??= CommunityToolkit.Mvvm.DependencyInjection.Ioc.Default.GetRequiredService<Flow.Launcher.Plugin.IPublicAPI>();");
163+
sourceBuilder.AppendLine();
164+
getTranslation = "Api.GetTranslation";
165+
}
166+
else if (pluginInfo?.IsValid == true)
167+
{
168+
getTranslation = $"{pluginInfo.ContextAccessor}.API.GetTranslation";
169+
}
170+
132171
// Generate GetValues method
133172
sourceBuilder.AppendLine($"{tabString}/// <summary>");
134173
sourceBuilder.AppendLine($"{tabString}/// Get all values of <see cref=\"{enumFullName}\"/>");
@@ -141,19 +180,19 @@ private void GenerateSource(SourceProductionContext spc, INamedTypeSymbol enumSy
141180
if (enumFields.Length == 0) return;
142181
foreach (var enumField in enumFields)
143182
{
144-
GenerateEnumField(sourceBuilder, enumField, enumName, tabString);
183+
GenerateEnumField(sourceBuilder, getTranslation, enumField, enumName, tabString);
145184
}
146185
sourceBuilder.AppendLine($"{tabString}{tabString}}};");
147186
sourceBuilder.AppendLine($"{tabString}}}");
148187
sourceBuilder.AppendLine();
149188

150189
// Generate UpdateLabels method
151-
GenerateUpdateLabelsMethod(sourceBuilder, enumDataClassName, tabString);
190+
GenerateUpdateLabelsMethod(sourceBuilder, getTranslation, enumDataClassName, tabString);
152191

153192
sourceBuilder.AppendLine($"}}");
154193

155194
// Add source to context
156-
spc.AddSource($"{Constants.ClassName}.{enumNamespace}.{enumDataClassName}.g.cs", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));
195+
spc.AddSource($"{Constants.ClassName}.{assemblyName}.{enumNamespace}.{enumDataClassName}.g.cs", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));
157196
}
158197

159198
private static void GeneratedHeaderFromPath(StringBuilder sb, string enumFullName)
@@ -170,15 +209,19 @@ private static void GeneratedHeaderFromPath(StringBuilder sb, string enumFullNam
170209
}
171210
}
172211

173-
private static void GenerateEnumField(StringBuilder sb, EnumField enumField, string enumName, string tabString)
212+
private static void GenerateEnumField(
213+
StringBuilder sb,
214+
string getTranslation,
215+
EnumField enumField,
216+
string enumName,
217+
string tabString)
174218
{
175219
sb.AppendLine($"{tabString}{tabString}{tabString}new()");
176220
sb.AppendLine($"{tabString}{tabString}{tabString}{{");
177221
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}Value = {enumName}.{enumField.EnumFieldName},");
178222
if (enumField.UseLocalizationKey)
179223
{
180-
// TODO
181-
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}Display = Main.Context.API.GetTranslation(\"{enumField.LocalizationKey}\"),");
224+
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}Display = {getTranslation}(\"{enumField.LocalizationKey}\"),");
182225
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}LocalizationKey = \"{enumField.LocalizationKey}\",");
183226
}
184227
else
@@ -192,7 +235,11 @@ private static void GenerateEnumField(StringBuilder sb, EnumField enumField, str
192235
sb.AppendLine($"{tabString}{tabString}{tabString}}},");
193236
}
194237

195-
private static void GenerateUpdateLabelsMethod(StringBuilder sb, string enumDataClassName, string tabString)
238+
private static void GenerateUpdateLabelsMethod(
239+
StringBuilder sb,
240+
string getTranslation,
241+
string enumDataClassName,
242+
string tabString)
196243
{
197244
sb.AppendLine($"{tabString}/// <summary>");
198245
sb.AppendLine($"{tabString}/// Update the labels of the enum values when culture info changes.");
@@ -204,7 +251,7 @@ private static void GenerateUpdateLabelsMethod(StringBuilder sb, string enumData
204251
sb.AppendLine($"{tabString}{tabString}{{");
205252
sb.AppendLine($"{tabString}{tabString}{tabString}if (!string.IsNullOrEmpty(item.LocalizationKey))");
206253
sb.AppendLine($"{tabString}{tabString}{tabString}{{");
207-
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}item.Display = Main.Context.API.GetTranslation(item.LocalizationKey);");
254+
sb.AppendLine($"{tabString}{tabString}{tabString}{tabString}item.Display = {getTranslation}(item.LocalizationKey);");
208255
sb.AppendLine($"{tabString}{tabString}{tabString}}}");
209256
sb.AppendLine($"{tabString}{tabString}}}");
210257
sb.AppendLine($"{tabString}}}");

0 commit comments

Comments
 (0)