diff --git a/src/Meziantou.Analyzer/Rules/DoNotUseAsyncVoidAnalyzer.cs b/src/Meziantou.Analyzer/Rules/DoNotUseAsyncVoidAnalyzer.cs index 4f7feb58..6efb0a50 100755 --- a/src/Meziantou.Analyzer/Rules/DoNotUseAsyncVoidAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/DoNotUseAsyncVoidAnalyzer.cs @@ -1,6 +1,8 @@ -using System.Collections.Immutable; +using System; +using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Operations; namespace Meziantou.Analyzer.Rules; @@ -25,6 +27,16 @@ public override void Initialize(AnalysisContext context) context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.Method); + context.RegisterOperationAction(AnalyzeLocalFunction, OperationKind.LocalFunction); + } + + private void AnalyzeLocalFunction(OperationAnalysisContext context) + { + var operation = (ILocalFunctionOperation)context.Operation; + if (operation.Symbol is { ReturnsVoid: true, IsAsync: true }) + { + context.ReportDiagnostic(Rule, operation); + } } private static void AnalyzeSymbol(SymbolAnalysisContext context) diff --git a/tests/Meziantou.Analyzer.Test/Rules/DoNotUseAsyncVoidAnalyzerTests.cs b/tests/Meziantou.Analyzer.Test/Rules/DoNotUseAsyncVoidAnalyzerTests.cs index 1afeb8da..50efa8bb 100755 --- a/tests/Meziantou.Analyzer.Test/Rules/DoNotUseAsyncVoidAnalyzerTests.cs +++ b/tests/Meziantou.Analyzer.Test/Rules/DoNotUseAsyncVoidAnalyzerTests.cs @@ -52,4 +52,52 @@ class Sample .ValidateAsync(); } + [Fact] + public async Task LocalFunction_Void() + { + await CreateProjectBuilder() + .WithSourceCode(""" + class Sample + { + void A() + { + void Local() => throw null; + } + } + """) + .ValidateAsync(); + } + + [Fact] + public async Task LocalFunction_AsyncVoid() + { + await CreateProjectBuilder() + .WithSourceCode(""" + class Sample + { + void A() + { + [|async void Local() => throw null;|] + } + } + """) + .ValidateAsync(); + } + + [Fact] + public async Task LocalFunction_AsyncTask() + { + await CreateProjectBuilder() + .WithSourceCode(""" + class Sample + { + void A() + { + async System.Threading.Tasks.Task Local() => throw null; + } + } + """) + .ValidateAsync(); + } + }