1
0
mirror of https://github.com/chylex/.NET-Community-Toolkit.git synced 2025-04-10 11:15:45 +02:00

Restore C# version check in ICommandGenerator

This commit is contained in:
Sergio Pedri 2021-12-14 12:38:40 +01:00
parent b354891cc2
commit 4667ba2ecd
2 changed files with 32 additions and 1 deletions
CommunityToolkit.Mvvm.SourceGenerators

View File

@ -95,4 +95,24 @@ public static void ReportDiagnostics(this IncrementalGeneratorInitializationCont
}
});
}
/// <summary>
/// Registers an output node into an <see cref="IncrementalGeneratorInitializationContext"/> to output diagnostics.
/// </summary>
/// <param name="context">The input <see cref="IncrementalGeneratorInitializationContext"/> instance.</param>
/// <param name="isSupported">An <see cref="IncrementalValueProvider{TValue}"/> instance indicating support for a feature.</param>
/// <param name="diagnostic">The <see cref="Diagnostic"/> to emit if <paramref name="isSupported"/> fails.</param>
public static void ReportDiagnosticsIsNotSupported(
this IncrementalGeneratorInitializationContext context,
IncrementalValueProvider<bool> isSupported,
Diagnostic diagnostic)
{
context.RegisterSourceOutput(isSupported, (context, isSupported) =>
{
if (!isSupported)
{
context.ReportDiagnostic(diagnostic);
}
});
}
}

View File

@ -29,12 +29,23 @@ public sealed partial class ICommandGenerator : IIncrementalGenerator
/// <inheritdoc/>
public void Initialize(IncrementalGeneratorInitializationContext context)
{
// Validate the language version
IncrementalValueProvider<bool> isGeneratorSupported =
context.ParseOptionsProvider
.Select(static (item, _) => item is CSharpParseOptions { LanguageVersion: >= LanguageVersion.CSharp9 });
// Emit the diagnostic, if needed
context.ReportDiagnosticsIsNotSupported(isGeneratorSupported, Diagnostic.Create(UnsupportedCSharpLanguageVersionError, null));
// Get all method declarations with at least one attribute
IncrementalValuesProvider<IMethodSymbol> methodSymbols =
context.SyntaxProvider
.CreateSyntaxProvider(
static (node, _) => node is MethodDeclarationSyntax { Parent: ClassDeclarationSyntax, AttributeLists.Count: > 0 },
static (context, _) => (IMethodSymbol)context.SemanticModel.GetDeclaredSymbol(context.Node)!);
static (context, _) => (IMethodSymbol)context.SemanticModel.GetDeclaredSymbol(context.Node)!)
.Combine(isGeneratorSupported)
.Where(static item => item.Right)
.Select(static (item, _) => item.Left);
// Filter the methods using [ICommand]
IncrementalValuesProvider<(IMethodSymbol Symbol, AttributeData Attribute)> methodSymbolsWithAttributeData =