diff --git a/src/Meziantou.Analyzer/Internals/OperationExtensions.cs b/src/Meziantou.Analyzer/Internals/OperationExtensions.cs index a116101bc..ffbadffac 100644 --- a/src/Meziantou.Analyzer/Internals/OperationExtensions.cs +++ b/src/Meziantou.Analyzer/Internals/OperationExtensions.cs @@ -238,6 +238,28 @@ static bool IsValid(Location location, int operationLocation, int? staticContext } } + if (symbol.Kind is SymbolKind.Local) + { + // var a = Sample(a); // cannot use "a" + var ancestors = operation.Ancestors(); + var isInInitializer = false; + foreach (var ancestor in ancestors) + { + if (ancestor is IVariableDeclaratorOperation declaratorOperation) + { + if (declaratorOperation.Symbol.IsEqualTo(symbol)) + { + isInInitializer = true; + break; + } + } + } + + if (isInInitializer) + continue; + } + + yield return symbol; } } diff --git a/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs b/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs index 2ebe6e58c..dec7d0198 100644 --- a/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs +++ b/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs @@ -268,6 +268,12 @@ public ProjectBuilder WithNoFixCompilation() return this; } + public ProjectBuilder WithDefaultAnalyzerId(string id) + { + DefaultAnalyzerId = id; + return this; + } + public ProjectBuilder WithAnalyzer(DiagnosticAnalyzer diagnosticAnalyzer, string id = null, string message = null) { DiagnosticAnalyzer.Add(diagnosticAnalyzer); diff --git a/tests/Meziantou.Analyzer.Test/Rules/UseAnOverloadThatHasCancellationTokenAnalyzerTests.cs b/tests/Meziantou.Analyzer.Test/Rules/UseAnOverloadThatHasCancellationTokenAnalyzerTests.cs index 59fafa10f..b80b0454a 100644 --- a/tests/Meziantou.Analyzer.Test/Rules/UseAnOverloadThatHasCancellationTokenAnalyzerTests.cs +++ b/tests/Meziantou.Analyzer.Test/Rules/UseAnOverloadThatHasCancellationTokenAnalyzerTests.cs @@ -1019,4 +1019,23 @@ await CreateProjectBuilder() .ValidateAsync(); } + [Fact] + public async Task CancellationTokenNotAvailableAsVariableDeclarator() + { + const string SourceCode = @" +using System.Threading; +class Test +{ + public static void A() + { + CancellationToken Foo(CancellationToken cancellationToken = default) => cancellationToken; + + var token = [||]Foo(); + } +}"; + await CreateProjectBuilder() + .WithDefaultAnalyzerId("MA0032") + .WithSourceCode(SourceCode) + .ValidateAsync(); + } }