From 1f7ac375be6f9f277db0fd5f7603970d31a1d429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Hellander?= Date: Tue, 23 Apr 2024 21:48:07 +0200 Subject: [PATCH] Update SA1404 to not crash when attribute uses a namespace alias #3829 --- .../MaintainabilityRules/SA1404UnitTests.cs | 18 ++++++++++++++++++ ...AnalysisSuppressionMustHaveJustification.cs | 11 +++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test/MaintainabilityRules/SA1404UnitTests.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test/MaintainabilityRules/SA1404UnitTests.cs index fa93d26ae..1b32c9ae3 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test/MaintainabilityRules/SA1404UnitTests.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test/MaintainabilityRules/SA1404UnitTests.cs @@ -426,5 +426,23 @@ public void Bar() await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false); } + + [Theory] + [InlineData("global::System.Obsolete")] + [InlineData("global::My")] + [WorkItem(3829, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3829")] + public async Task TestGlobalOtherAttributeAsync(string name) + { + var testCode = $@"public class MyAttribute : System.Attribute +{{ +}} + +[{name}] +public class Foo +{{ +}}"; + + await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false); + } } } diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1404CodeAnalysisSuppressionMustHaveJustification.cs b/StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1404CodeAnalysisSuppressionMustHaveJustification.cs index 10b7e65d2..6933d86cd 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1404CodeAnalysisSuppressionMustHaveJustification.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1404CodeAnalysisSuppressionMustHaveJustification.cs @@ -100,8 +100,15 @@ public void HandleAttributeNode(SyntaxNodeAnalysisContext context) { if (!(attribute.Name is SimpleNameSyntax simpleNameSyntax)) { - QualifiedNameSyntax qualifiedNameSyntax = attribute.Name as QualifiedNameSyntax; - simpleNameSyntax = qualifiedNameSyntax.Right; + if (attribute.Name is AliasQualifiedNameSyntax aliasQualifiedNameSyntax) + { + simpleNameSyntax = aliasQualifiedNameSyntax.Name; + } + else + { + QualifiedNameSyntax qualifiedNameSyntax = attribute.Name as QualifiedNameSyntax; + simpleNameSyntax = qualifiedNameSyntax.Right; + } } if (simpleNameSyntax.Identifier.ValueText != nameof(SuppressMessageAttribute)