diff --git a/ChangeLog.md b/ChangeLog.md index 048cc09096..a5a4a3fe3e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix analyzer [RCS1055](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1055) ([PR](https://github.com/dotnet/roslynator/pull/1361)) - Fix analyzer [RCS1261](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1261) ([PR](https://github.com/dotnet/roslynator/pull/1374)) - Fix analyzer [RCS0056](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0056) ([PR](https://github.com/dotnet/roslynator/pull/1373)) +- Fix analyzer [RCS1211](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1211) ([PR](https://github.com/dotnet/roslynator/pull/1377)) ## [4.9.0] - 2024-01-10 diff --git a/src/Analyzers/CSharp/Analysis/RemoveUnnecessaryElseAnalyzer.cs b/src/Analyzers/CSharp/Analysis/RemoveUnnecessaryElseAnalyzer.cs index d5260a194e..5320ebc1ae 100644 --- a/src/Analyzers/CSharp/Analysis/RemoveUnnecessaryElseAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/RemoveUnnecessaryElseAnalyzer.cs @@ -61,6 +61,9 @@ private static bool IsFixable(ElseClauseSyntax elseClause, SemanticModel semanti if (ifStatementStatement is not BlockSyntax ifBlock) return CSharpFacts.IsJumpStatement(ifStatementStatement.Kind()); + if (elseClause.SpanContainsDirectives()) + return false; + if (elseClause.Statement is BlockSyntax elseBlock) { if (LocalDeclaredVariablesOverlap(elseBlock, ifBlock, semanticModel)) diff --git a/src/Tests/Analyzers.Tests/RCS1211RemoveUnnecessaryElseTests.cs b/src/Tests/Analyzers.Tests/RCS1211RemoveUnnecessaryElseTests.cs index 0d98052322..4f27173d03 100644 --- a/src/Tests/Analyzers.Tests/RCS1211RemoveUnnecessaryElseTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1211RemoveUnnecessaryElseTests.cs @@ -46,6 +46,30 @@ int M(bool flag) "); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveUnnecessaryElse)] + public async Task TestNoDiagnostic_PreprocessorDirectives() + { + await VerifyNoDiagnosticAsync(@" +#define FOO +class C +{ + int M(bool flag) + { + if(flag) + { + return 1; + } + else + { +#if FOO + return 0; +#endif + } + } +} +"); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveUnnecessaryElse)] public async Task TestNoDiagnostic_OverlappingLocalVariables() {