From 1ffd5f0feab546dc7eb4499fd066ea9407e2f18e Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 10 Mar 2025 20:18:10 +0800 Subject: [PATCH 1/5] Support CouldNotFindPluginEntryClass & CouldNotFindContextProperty diagnostics --- .../Localize/LocalizeSourceGenerator.cs | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs index 5dc3058..a9594fd 100644 --- a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs +++ b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs @@ -465,8 +465,9 @@ private static PluginClassInfo GetValidPluginInfo( ImmutableArray pluginClasses, SourceProductionContext context) { - var nonNullExistClasses = pluginClasses.Where(p => p != null && p.PropertyName != null).ToArray(); - if (nonNullExistClasses.Length == 0) + // If p is null, this class does not implement IPluginI18n + var iPluginI18nClasses = pluginClasses.Where(p => p != null).ToArray(); + if (iPluginI18nClasses.Length == 0) { context.ReportDiagnostic(Diagnostic.Create( SourceGeneratorDiagnostics.CouldNotFindPluginEntryClass, @@ -475,7 +476,24 @@ private static PluginClassInfo GetValidPluginInfo( return null; } - foreach (var pluginClass in nonNullExistClasses) + // If p.PropertyName is null, this class does not have PluginInitContext property + var iPluginI18nClassesWithContext = iPluginI18nClasses.Where(p => p.PropertyName != null).ToArray(); + if (iPluginI18nClassesWithContext.Length == 0) + { + foreach (var pluginClass in iPluginI18nClasses) + { + context.ReportDiagnostic(Diagnostic.Create( + SourceGeneratorDiagnostics.CouldNotFindContextProperty, + pluginClass.Location, + pluginClass.ClassName + )); + } + return null; + } + + // Rest classes have implemented IPluginI18n and have PluginInitContext property + // Check if the property is valid + foreach (var pluginClass in iPluginI18nClassesWithContext) { if (pluginClass.IsValid == true) { From d6ff876deac36adf46b96cb801637d93d76f8765 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 10 Mar 2025 20:18:23 +0800 Subject: [PATCH 2/5] Improve class & method name in diagnostics --- .../SourceGeneratorDiagnostics.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs index e74c915..8d114cb 100644 --- a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs +++ b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs @@ -17,7 +17,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor CouldNotFindPluginEntryClass = new DiagnosticDescriptor( "FLSG0002", "Could not find the main class of plugin", - $"Could not find the main class of your plugin. It must implement {Constants.PluginInterfaceName}.", + $"Could not find the main class of your plugin. It must implement `{Constants.PluginInterfaceName}`.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -26,7 +26,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor CouldNotFindContextProperty = new DiagnosticDescriptor( "FLSG0003", "Could not find plugin context property", - $"Could not find a property of type {Constants.PluginContextTypeName} in {{0}}. It must be a public static or internal static property of the main class of your plugin.", + $"Could not find a property of type `{Constants.PluginContextTypeName}` in `{{0}}`. It must be a public static or internal static property of the main class of your plugin.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -35,7 +35,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor ContextPropertyNotStatic = new DiagnosticDescriptor( "FLSG0004", "Plugin context property is not static", - "Context property {0} is not static. It must be static.", + "Context property `{0}` is not static. It must be static.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -44,7 +44,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor ContextPropertyIsPrivate = new DiagnosticDescriptor( "FLSG0005", "Plugin context property is private", - "Context property {0} is private. It must be either internal or public.", + "Context property `{0}` is private. It must be either internal or public.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -53,7 +53,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor ContextPropertyIsProtected = new DiagnosticDescriptor( "FLSG0006", "Plugin context property is protected", - "Context property {0} is protected. It must be either internal or public.", + "Context property `{0}` is protected. It must be either internal or public.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -62,7 +62,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor LocalizationKeyUnused = new DiagnosticDescriptor( "FLSG0007", "Localization key is unused", - $"Method '{Constants.ClassName}.{{0}}' is never used", + $"Method `{Constants.ClassName}.{{0}}` is never used", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true From 43d8fe1c2be0df5de22f701e057a3d8357e60b47 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 10 Mar 2025 20:33:57 +0800 Subject: [PATCH 3/5] Remove CouldNotFindResourceDictionaries diagnostic --- .../AnalyzerReleases.Unshipped.md | 3 +-- .../Localize/LocalizeSourceGenerator.cs | 9 --------- .../SourceGeneratorDiagnostics.cs | 15 +++------------ 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md b/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md index f60d258..3234335 100644 --- a/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md +++ b/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md @@ -4,10 +4,9 @@ Rule ID | Category | Severity | Notes --------|----------|----------|------- -FLSG0001 | Localization | Warning | FLSG0001_CouldNotFindResourceDictionaries +FLSG0001 | Localization | Warning | FLSG0001_LocalizationKeyUnused FLSG0002 | Localization | Warning | FLSG0002_CouldNotFindPluginEntryClass FLSG0003 | Localization | Warning | FLSG0003_CouldNotFindContextProperty FLSG0004 | Localization | Warning | FLSG0004_ContextPropertyNotStatic FLSG0005 | Localization | Warning | FLSG0005_ContextPropertyIsPrivate FLSG0006 | Localization | Warning | FLSG0006_ContextPropertyIsProtected -FLSG0007 | Localization | Warning | FLSG0007_LocalizationKeyUnused diff --git a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs index a9594fd..fd5aed1 100644 --- a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs +++ b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs @@ -84,15 +84,6 @@ private void Execute(SourceProductionContext spc, ImmutableArray AdditionalTexts) data) { var xamlFiles = data.AdditionalTexts; - if (xamlFiles.Length == 0) - { - spc.ReportDiagnostic(Diagnostic.Create( - SourceGeneratorDiagnostics.CouldNotFindResourceDictionaries, - Location.None - )); - return; - } - var compilation = data.Item1.Compilation; var configOptions = data.Item1.Item1.ConfigOptionsProvider; var pluginClasses = data.Item1.Item1.Item1.PluginClassInfos; diff --git a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs index 8d114cb..562b649 100644 --- a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs +++ b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs @@ -5,10 +5,10 @@ namespace Flow.Launcher.Localization.SourceGenerators { public static class SourceGeneratorDiagnostics { - public static readonly DiagnosticDescriptor CouldNotFindResourceDictionaries = new DiagnosticDescriptor( + public static readonly DiagnosticDescriptor LocalizationKeyUnused = new DiagnosticDescriptor( "FLSG0001", - "Could not find resource dictionaries", - "Could not find resource dictionaries. There must be a file named [LANG].xaml file (for example, en.xaml), and it must be specified in in your .csproj file.", + "Localization key is unused", + $"Method `{Constants.ClassName}.{{0}}` is never used", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -58,14 +58,5 @@ public static class SourceGeneratorDiagnostics DiagnosticSeverity.Warning, isEnabledByDefault: true ); - - public static readonly DiagnosticDescriptor LocalizationKeyUnused = new DiagnosticDescriptor( - "FLSG0007", - "Localization key is unused", - $"Method `{Constants.ClassName}.{{0}}` is never used", - "Localization", - DiagnosticSeverity.Warning, - isEnabledByDefault: true - ); } } From ed871118a495b4bd0fc6e1717724a3c82e7017eb Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 10 Mar 2025 22:20:23 +0800 Subject: [PATCH 4/5] Revert "Remove CouldNotFindResourceDictionaries diagnostic" This reverts commit 43d8fe1c2be0df5de22f701e057a3d8357e60b47. --- .../AnalyzerReleases.Unshipped.md | 3 ++- .../Localize/LocalizeSourceGenerator.cs | 9 +++++++++ .../SourceGeneratorDiagnostics.cs | 15 ++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md b/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md index 3234335..f60d258 100644 --- a/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md +++ b/Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md @@ -4,9 +4,10 @@ Rule ID | Category | Severity | Notes --------|----------|----------|------- -FLSG0001 | Localization | Warning | FLSG0001_LocalizationKeyUnused +FLSG0001 | Localization | Warning | FLSG0001_CouldNotFindResourceDictionaries FLSG0002 | Localization | Warning | FLSG0002_CouldNotFindPluginEntryClass FLSG0003 | Localization | Warning | FLSG0003_CouldNotFindContextProperty FLSG0004 | Localization | Warning | FLSG0004_ContextPropertyNotStatic FLSG0005 | Localization | Warning | FLSG0005_ContextPropertyIsPrivate FLSG0006 | Localization | Warning | FLSG0006_ContextPropertyIsProtected +FLSG0007 | Localization | Warning | FLSG0007_LocalizationKeyUnused diff --git a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs index fd5aed1..a9594fd 100644 --- a/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs +++ b/Flow.Launcher.Localization.SourceGenerators/Localize/LocalizeSourceGenerator.cs @@ -84,6 +84,15 @@ private void Execute(SourceProductionContext spc, ImmutableArray AdditionalTexts) data) { var xamlFiles = data.AdditionalTexts; + if (xamlFiles.Length == 0) + { + spc.ReportDiagnostic(Diagnostic.Create( + SourceGeneratorDiagnostics.CouldNotFindResourceDictionaries, + Location.None + )); + return; + } + var compilation = data.Item1.Compilation; var configOptions = data.Item1.Item1.ConfigOptionsProvider; var pluginClasses = data.Item1.Item1.Item1.PluginClassInfos; diff --git a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs index 562b649..8d114cb 100644 --- a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs +++ b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs @@ -5,10 +5,10 @@ namespace Flow.Launcher.Localization.SourceGenerators { public static class SourceGeneratorDiagnostics { - public static readonly DiagnosticDescriptor LocalizationKeyUnused = new DiagnosticDescriptor( + public static readonly DiagnosticDescriptor CouldNotFindResourceDictionaries = new DiagnosticDescriptor( "FLSG0001", - "Localization key is unused", - $"Method `{Constants.ClassName}.{{0}}` is never used", + "Could not find resource dictionaries", + "Could not find resource dictionaries. There must be a file named [LANG].xaml file (for example, en.xaml), and it must be specified in in your .csproj file.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true @@ -58,5 +58,14 @@ public static class SourceGeneratorDiagnostics DiagnosticSeverity.Warning, isEnabledByDefault: true ); + + public static readonly DiagnosticDescriptor LocalizationKeyUnused = new DiagnosticDescriptor( + "FLSG0007", + "Localization key is unused", + $"Method `{Constants.ClassName}.{{0}}` is never used", + "Localization", + DiagnosticSeverity.Warning, + isEnabledByDefault: true + ); } } From 5aebd6211616ba7ef12957bfdc30504daac45ad0 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 10 Mar 2025 22:43:15 +0800 Subject: [PATCH 5/5] Adjust diagnostic description --- .../SourceGeneratorDiagnostics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs index 8d114cb..d162cdb 100644 --- a/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs +++ b/Flow.Launcher.Localization.SourceGenerators/SourceGeneratorDiagnostics.cs @@ -8,7 +8,7 @@ public static class SourceGeneratorDiagnostics public static readonly DiagnosticDescriptor CouldNotFindResourceDictionaries = new DiagnosticDescriptor( "FLSG0001", "Could not find resource dictionaries", - "Could not find resource dictionaries. There must be a file named [LANG].xaml file (for example, en.xaml), and it must be specified in in your .csproj file.", + "Could not find resource dictionaries. There must be a `en.xaml` file under `Language` folder.", "Localization", DiagnosticSeverity.Warning, isEnabledByDefault: true