diff --git a/ChangeLog.md b/ChangeLog.md index acc4d249b7..9fc22206a9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix analyzer [RCS1032](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1032) ([PR](https://github.com/dotnet/roslynator/pull/1289)) - Fix analyzer [RCS1176](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1176) ([PR](https://github.com/dotnet/roslynator/pull/1291)) - Fix analyzer [RCS1197](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1197) ([PR](https://github.com/dotnet/roslynator/pull/1166)) +- Fix analyzer [RCS1093](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1093) ([PR](https://github.com/dotnet/roslynator/pull/1296)) ## [4.6.4] - 2023-11-24 diff --git a/src/Analyzers/CSharp/Analysis/FileContainsNoCodeAnalyzer.cs b/src/Analyzers/CSharp/Analysis/FileContainsNoCodeAnalyzer.cs index 2dfa99c6bf..e7362d43c3 100644 --- a/src/Analyzers/CSharp/Analysis/FileContainsNoCodeAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/FileContainsNoCodeAnalyzer.cs @@ -1,5 +1,6 @@ // Copyright (c) .NET Foundation and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -40,11 +41,36 @@ private static void AnalyzeCompilationUnit(SyntaxNodeAnalysisContext context) if (compilationUnit.Span == token.Span && !token.HasTrailingTrivia - && !token.LeadingTrivia.Any(f => f.IsKind( - SyntaxKind.IfDirectiveTrivia, - SyntaxKind.ElseDirectiveTrivia, - SyntaxKind.ElifDirectiveTrivia, - SyntaxKind.EndIfDirectiveTrivia))) + && !token.LeadingTrivia.Any(trivia => + { + switch (trivia.Kind()) + { + case SyntaxKind.IfDirectiveTrivia: + case SyntaxKind.ElseDirectiveTrivia: + case SyntaxKind.ElifDirectiveTrivia: + case SyntaxKind.EndIfDirectiveTrivia: + { + return true; + } + case SyntaxKind.PragmaWarningDirectiveTrivia: + { + var pragma = (PragmaWarningDirectiveTriviaSyntax)trivia.GetStructure(); + + foreach (ExpressionSyntax errorCode in pragma.ErrorCodes) + { + if (errorCode is IdentifierNameSyntax identifierName + && string.Equals(identifierName.Identifier.ValueText, DiagnosticRules.FileContainsNoCode.Id, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + break; + } + } + + return false; + })) { SyntaxTree syntaxTree = compilationUnit.SyntaxTree; diff --git a/src/Tests/Analyzers.Tests/RCS1093FileContainsNoCodeTests.cs b/src/Tests/Analyzers.Tests/RCS1093FileContainsNoCodeTests.cs index 30f5dd22fb..2ef0c7aa28 100644 --- a/src/Tests/Analyzers.Tests/RCS1093FileContainsNoCodeTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1093FileContainsNoCodeTests.cs @@ -41,4 +41,18 @@ class C "); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.FileContainsNoCode)] + public async Task TestNoDiagnostic_PragmaWarningDirective() + { + await VerifyNoDiagnosticAsync(@"#pragma warning disable RCS1093 // Remove file with no code. +//using System; +//using System.Collections.Generic; +//using System.Data; +//using System.IO; + +//public class TestClass +//{ +//}"); + } }