6
6
using Flow . Launcher . Localization . Shared ;
7
7
using Microsoft . CodeAnalysis ;
8
8
using Microsoft . CodeAnalysis . CSharp . Syntax ;
9
+ using Microsoft . CodeAnalysis . Diagnostics ;
9
10
using Microsoft . CodeAnalysis . Text ;
10
11
11
12
namespace Flow . Launcher . Localization . SourceGenerators . Localize
@@ -36,9 +37,18 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
36
37
. Where ( ed => ed . AttributeLists . Count > 0 )
37
38
. Collect ( ) ;
38
39
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
+
39
47
var compilation = context . CompilationProvider ;
40
48
41
- var compilationEnums = enumDeclarations . Combine ( compilation ) ;
49
+ var configOptions = context . AnalyzerConfigOptionsProvider ;
50
+
51
+ var compilationEnums = enumDeclarations . Combine ( pluginClasses ) . Combine ( configOptions ) . Combine ( compilation ) ;
42
52
43
53
context . RegisterSourceOutput ( compilationEnums , Execute ) ;
44
54
}
@@ -49,14 +59,24 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
49
59
/// <param name="spc">The source production context.</param>
50
60
/// <param name="data">The provided data.</param>
51
61
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 )
53
66
{
54
- var enums = data . Enums ;
55
67
var compilation = data . Compilation ;
68
+ var configOptions = data . Item1 . ConfigOptionsProvider ;
69
+ var pluginClasses = data . Item1 . Item1 . PluginClassInfos ;
70
+ var enumsDeclarations = data . Item1 . Item1 . EnumsDeclarations ;
56
71
57
72
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 ;
58
78
59
- foreach ( var enumDeclaration in enums . Distinct ( ) )
79
+ foreach ( var enumDeclaration in enumsDeclarations . Distinct ( ) )
60
80
{
61
81
var semanticModel = compilation . GetSemanticModel ( enumDeclaration . SyntaxTree ) ;
62
82
var enumSymbol = semanticModel . GetDeclaredSymbol ( enumDeclaration ) as INamedTypeSymbol ;
@@ -65,7 +85,7 @@ private void Execute(SourceProductionContext spc,
65
85
if ( enumSymbol ? . GetAttributes ( ) . Any ( ad =>
66
86
ad . AttributeClass ? . Name == Constants . EnumLocalizeAttributeName ) ?? false )
67
87
{
68
- GenerateSource ( spc , enumSymbol , assemblyName ) ;
88
+ GenerateSource ( spc , enumSymbol , useDI , pluginInfo , assemblyName ) ;
69
89
}
70
90
}
71
91
}
@@ -74,7 +94,12 @@ private void Execute(SourceProductionContext spc,
74
94
75
95
#region Generate Source
76
96
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 )
78
103
{
79
104
var enumFullName = enumSymbol . ToDisplayString ( SymbolDisplayFormat . FullyQualifiedFormat ) ;
80
105
var enumDataClassName = $ "{ enumSymbol . Name } { Constants . EnumLocalizeClassSuffix } ";
@@ -129,6 +154,20 @@ private void GenerateSource(SourceProductionContext spc, INamedTypeSymbol enumSy
129
154
sourceBuilder . AppendLine ( $ "{ tabString } public string LocalizationValue {{ get; set; }}") ;
130
155
sourceBuilder . AppendLine ( ) ;
131
156
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
+
132
171
// Generate GetValues method
133
172
sourceBuilder . AppendLine ( $ "{ tabString } /// <summary>") ;
134
173
sourceBuilder . AppendLine ( $ "{ tabString } /// Get all values of <see cref=\" { enumFullName } \" />") ;
@@ -141,19 +180,19 @@ private void GenerateSource(SourceProductionContext spc, INamedTypeSymbol enumSy
141
180
if ( enumFields . Length == 0 ) return ;
142
181
foreach ( var enumField in enumFields )
143
182
{
144
- GenerateEnumField ( sourceBuilder , enumField , enumName , tabString ) ;
183
+ GenerateEnumField ( sourceBuilder , getTranslation , enumField , enumName , tabString ) ;
145
184
}
146
185
sourceBuilder . AppendLine ( $ "{ tabString } { tabString } }};") ;
147
186
sourceBuilder . AppendLine ( $ "{ tabString } }}") ;
148
187
sourceBuilder . AppendLine ( ) ;
149
188
150
189
// Generate UpdateLabels method
151
- GenerateUpdateLabelsMethod ( sourceBuilder , enumDataClassName , tabString ) ;
190
+ GenerateUpdateLabelsMethod ( sourceBuilder , getTranslation , enumDataClassName , tabString ) ;
152
191
153
192
sourceBuilder . AppendLine ( $ "}}") ;
154
193
155
194
// 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 ) ) ;
157
196
}
158
197
159
198
private static void GeneratedHeaderFromPath ( StringBuilder sb , string enumFullName )
@@ -170,15 +209,19 @@ private static void GeneratedHeaderFromPath(StringBuilder sb, string enumFullNam
170
209
}
171
210
}
172
211
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 )
174
218
{
175
219
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } new()") ;
176
220
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } {{") ;
177
221
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } { tabString } Value = { enumName } .{ enumField . EnumFieldName } ,") ;
178
222
if ( enumField . UseLocalizationKey )
179
223
{
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 } \" ),") ;
182
225
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } { tabString } LocalizationKey = \" { enumField . LocalizationKey } \" ,") ;
183
226
}
184
227
else
@@ -192,7 +235,11 @@ private static void GenerateEnumField(StringBuilder sb, EnumField enumField, str
192
235
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } }},") ;
193
236
}
194
237
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 )
196
243
{
197
244
sb . AppendLine ( $ "{ tabString } /// <summary>") ;
198
245
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
204
251
sb . AppendLine ( $ "{ tabString } { tabString } {{") ;
205
252
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } if (!string.IsNullOrEmpty(item.LocalizationKey))") ;
206
253
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);") ;
208
255
sb . AppendLine ( $ "{ tabString } { tabString } { tabString } }}") ;
209
256
sb . AppendLine ( $ "{ tabString } { tabString } }}") ;
210
257
sb . AppendLine ( $ "{ tabString } }}") ;
0 commit comments