From 170901f584cf5742c3830efbfa3f60f54360708e Mon Sep 17 00:00:00 2001 From: Phil Scott Date: Tue, 13 Jul 2021 19:22:05 -0400 Subject: [PATCH] Adds additional check that analyzer is within a method Resolve #487 --- ...orInstanceAnsiConsoleOverStaticAnalyzer.cs | 6 +++++ .../Analyzers/UseInstanceAnsiConsoleTests.cs | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs index 54a7435..f6a4cde 100644 --- a/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs +++ b/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs @@ -37,6 +37,12 @@ namespace Spectre.Console.Analyzer return; } + // if we aren't in a method then it might be too complex for us to handle. + if (!invocationOperation.Syntax.Ancestors().OfType().Any()) + { + return; + } + if (!HasFieldAnsiConsole(invocationOperation.Syntax) && !HasParameterAnsiConsole(invocationOperation.Syntax)) { diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs index fd714c8..fb882a1 100644 --- a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs +++ b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs @@ -10,6 +10,28 @@ namespace Spectre.Console.Analyzer.Tests.Unit.Analyzers Descriptors.S1010_FavorInstanceAnsiConsoleOverStatic.Id, DiagnosticSeverity.Info); + [Fact] + public async void Should_only_warn_within_methods() + { + const string Source = @" +using Spectre.Console; + +internal sealed class Foo +{ + private readonly IAnsiConsole _console; + + public Foo(IAnsiConsole console = null) + { + _console = console ?? AnsiConsole.Create(new AnsiConsoleSettings()); + } +} +"; + + await SpectreAnalyzerVerifier + .VerifyAnalyzerAsync(Source) + .ConfigureAwait(false); + } + [Fact] public async void Instance_console_has_no_warnings() {