66using Flow . Launcher . Localization . Shared ;
77using Microsoft . CodeAnalysis ;
88using Microsoft . CodeAnalysis . CSharp . Syntax ;
9+ using Microsoft . CodeAnalysis . Diagnostics ;
910using Microsoft . CodeAnalysis . Text ;
1011
1112namespace 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