Skip to content

Commit 1673504

Browse files
committed
Use one internal static api instance
1 parent 107e4ee commit 1673504

File tree

4 files changed

+115
-7
lines changed

4 files changed

+115
-7
lines changed

Flow.Launcher.Localization.Shared/Constants.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public static class Constants
2424
public const string EnumLocalizeAttributeName = "EnumLocalizeAttribute";
2525
public const string EnumLocalizeKeyAttributeName = "EnumLocalizeKeyAttribute";
2626
public const string EnumLocalizeValueAttributeName = "EnumLocalizeValueAttribute";
27+
// Use PublicApi instead of PublicAPI for possible combiguity with Flow.Launcher.Plugin.IPublicAPI
28+
public const string PublicApiClassName = "PublicApi";
29+
public const string PublicApiPrivatePropertyName = "instance";
30+
public const string PublicApiInternalPropertyName = "Instance";
2731

2832
public static readonly Regex LanguagesXamlRegex = new Regex(@"\\Languages\\[^\\]+\.xaml$", RegexOptions.IgnoreCase);
2933
public static readonly string[] OldLocalizationClasses = { "IPublicAPI", "Internationalization" };

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,8 @@ private void GenerateSource(
227227
string getTranslation = null;
228228
if (useDI)
229229
{
230-
// Use Api from LocalizeSourceGenerator
231-
getTranslation = $"{assemblyNamespace}.{Constants.ClassName}.Api.GetTranslation";
230+
// Use instance from PublicApiSourceGenerator
231+
getTranslation = $"{assemblyNamespace}.{Constants.PublicApiClassName}.{Constants.PublicApiInternalPropertyName}.GetTranslation";
232232
}
233233
else if (pluginInfo?.IsValid == true)
234234
{

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -510,11 +510,8 @@ private static void GenerateSource(
510510
string getTranslation = null;
511511
if (useDI)
512512
{
513-
sourceBuilder.AppendLine($"{tabString}private static Flow.Launcher.Plugin.IPublicAPI? api = null;");
514-
// Internal for EnumSourceGenerator to use
515-
sourceBuilder.AppendLine($"{tabString}internal static Flow.Launcher.Plugin.IPublicAPI Api => api ??= CommunityToolkit.Mvvm.DependencyInjection.Ioc.Default.GetRequiredService<Flow.Launcher.Plugin.IPublicAPI>();");
516-
sourceBuilder.AppendLine();
517-
getTranslation = "Api.GetTranslation";
513+
// Use instance from PublicApiSourceGenerator
514+
getTranslation = $"{assemblyNamespace}.{Constants.PublicApiClassName}.{Constants.PublicApiInternalPropertyName}.GetTranslation";
518515
}
519516
else if (pluginInfo?.IsValid == true)
520517
{
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
using System;
2+
using System.Text;
3+
using Flow.Launcher.Localization.Shared;
4+
using Microsoft.CodeAnalysis.Diagnostics;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.Text;
7+
8+
namespace Flow.Launcher.Localization.SourceGenerators.Localize
9+
{
10+
[Generator]
11+
public partial class PublicApiSourceGenerator : IIncrementalGenerator
12+
{
13+
#region Fields
14+
15+
private static readonly Version PackageVersion = typeof(PublicApiSourceGenerator).Assembly.GetName().Version;
16+
17+
#endregion
18+
19+
#region Incremental Generator
20+
21+
/// <summary>
22+
/// Initializes the generator and registers source output based on build property FLLUseDependencyInjection.
23+
/// </summary>
24+
/// <param name="context">The initialization context.</param>
25+
public void Initialize(IncrementalGeneratorInitializationContext context)
26+
{
27+
var compilation = context.CompilationProvider;
28+
29+
var configOptions = context.AnalyzerConfigOptionsProvider;
30+
31+
var compilationEnums = configOptions.Combine(compilation);
32+
33+
context.RegisterSourceOutput(compilationEnums, Execute);
34+
}
35+
36+
/// <summary>
37+
/// Executes the generation of public api property based on the provided data.
38+
/// </summary>
39+
/// <param name="spc">The source production context.</param>
40+
/// <param name="data">The provided data.</param>
41+
private void Execute(SourceProductionContext spc,
42+
(AnalyzerConfigOptionsProvider ConfigOptionsProvider, Compilation Compilation) data)
43+
{
44+
var compilation = data.Compilation;
45+
var configOptions = data.ConfigOptionsProvider;
46+
47+
var assemblyNamespace = compilation.AssemblyName ?? Constants.DefaultNamespace;
48+
var useDI = configOptions.GetFLLUseDependencyInjection();
49+
50+
// If we do not use dependency injection, we do not need to generate the public api property
51+
if (!useDI) return;
52+
53+
GenerateSource(spc, assemblyNamespace);
54+
}
55+
56+
#endregion
57+
58+
#region Generate Source
59+
60+
private void GenerateSource(
61+
SourceProductionContext spc,
62+
string assemblyNamespace)
63+
{
64+
var tabString = Helper.Spacing(1);
65+
66+
var sourceBuilder = new StringBuilder();
67+
68+
// Generate header
69+
GeneratedHeaderFromPath(sourceBuilder);
70+
sourceBuilder.AppendLine();
71+
72+
// Generate nullable enable
73+
sourceBuilder.AppendLine("#nullable enable");
74+
sourceBuilder.AppendLine();
75+
76+
// Generate namespace
77+
sourceBuilder.AppendLine($"namespace {assemblyNamespace};");
78+
sourceBuilder.AppendLine();
79+
80+
// Generate class
81+
sourceBuilder.AppendLine($"[System.CodeDom.Compiler.GeneratedCode(\"{nameof(PublicApiSourceGenerator)}\", \"{PackageVersion}\")]");
82+
sourceBuilder.AppendLine($"internal static class {Constants.PublicApiClassName}");
83+
sourceBuilder.AppendLine("{");
84+
85+
// Generate properties
86+
sourceBuilder.AppendLine($"{tabString}private static Flow.Launcher.Plugin.IPublicAPI? {Constants.PublicApiPrivatePropertyName} = null;");
87+
sourceBuilder.AppendLine();
88+
sourceBuilder.AppendLine($"{tabString}/// <summary>");
89+
sourceBuilder.AppendLine($"{tabString}/// Get <see cref=\"Flow.Launcher.Plugin.IPublicAPI\"> instance");
90+
sourceBuilder.AppendLine($"{tabString}/// </summary>");
91+
sourceBuilder.AppendLine($"{tabString}internal static Flow.Launcher.Plugin.IPublicAPI {Constants.PublicApiInternalPropertyName} => {Constants.PublicApiPrivatePropertyName} ??= CommunityToolkit.Mvvm.DependencyInjection.Ioc.Default.GetRequiredService<Flow.Launcher.Plugin.IPublicAPI>();");
92+
sourceBuilder.AppendLine();
93+
94+
sourceBuilder.AppendLine($"}}");
95+
96+
// Add source to context
97+
spc.AddSource($"{Constants.PublicApiClassName}.{assemblyNamespace}.g.cs", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));
98+
}
99+
100+
private static void GeneratedHeaderFromPath(StringBuilder sb)
101+
{
102+
sb.AppendLine("/// <auto-generated/>");
103+
}
104+
105+
#endregion
106+
}
107+
}

0 commit comments

Comments
 (0)