Skip to content

Commit c2a8957

Browse files
Fix not offering to remove unnecessary nullable pragmas (#79356)
2 parents d3571ef + e8f489e commit c2a8957

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,19 @@
1919
namespace Microsoft.CodeAnalysis.RemoveUnnecessaryNullableDirective;
2020

2121
[DiagnosticAnalyzer(LanguageNames.CSharp)]
22-
internal sealed class CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer
23-
: AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer
22+
internal sealed class CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer()
23+
: AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(IDEDiagnosticIds.RemoveUnnecessaryNullableDirectiveDiagnosticId,
24+
EnforceOnBuildValues.RemoveUnnecessaryNullableDirective,
25+
option: null,
26+
fadingOption: null,
27+
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnecessary_nullable_directive), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
28+
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Nullable_directive_is_unnecessary), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
2429
{
25-
public CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer()
26-
: base(IDEDiagnosticIds.RemoveUnnecessaryNullableDirectiveDiagnosticId,
27-
EnforceOnBuildValues.RemoveUnnecessaryNullableDirective,
28-
option: null,
29-
fadingOption: null,
30-
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnecessary_nullable_directive), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
31-
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Nullable_directive_is_unnecessary), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
32-
{
33-
}
34-
3530
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
3631
=> DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
3732

3833
protected override void InitializeWorker(AnalysisContext context)
39-
{
40-
context.RegisterCompilationStartAction(AnalyzeCompilation);
41-
}
34+
=> context.RegisterCompilationStartAction(AnalyzeCompilation);
4235

4336
private void AnalyzeCompilation(CompilationStartAnalysisContext context)
4437
{

src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/NullableImpactingSpanWalker.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ private static bool IsLanguageRestrictedToNonNullForm(TypeSyntax node)
9797
return true;
9898
}
9999

100+
// An attribute name cannot itself be nullable. `[CLSCompliant?]` is not a thing.
101+
if (node.IsParentKind(SyntaxKind.Attribute))
102+
return true;
103+
100104
return false;
101105

102106
// If this is Y in X.Y, walk up to X.Y

src/Analyzers/CSharp/Tests/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.CodeAnalysis.RemoveUnnecessaryNullableDirective;
99
using Microsoft.CodeAnalysis.Shared.Extensions;
1010
using Microsoft.CodeAnalysis.Test.Utilities;
11+
using Roslyn.Test.Utilities;
1112
using Xunit;
1213

1314
namespace Microsoft.CodeAnalysis.CSharp.Analyzers.UnitTests.RemoveUnnecessaryNullableDirective;
@@ -62,6 +63,32 @@ enum EnumName
6263
}
6364
""");
6465

66+
[Fact, WorkItem("https://github.com/dotnet/roslyn/issues/65401")]
67+
public Task TestUnnecessaryDisableEnumDeclaration_WithAttribute()
68+
=> VerifyCodeFixAsync(
69+
NullableContextOptions.Enable,
70+
"""
71+
[|#nullable disable|]
72+
using System;
73+
74+
[CLSCompliant(false)]
75+
enum EnumName
76+
{
77+
First,
78+
Second,
79+
}
80+
""",
81+
"""
82+
using System;
83+
84+
[CLSCompliant(false)]
85+
enum EnumName
86+
{
87+
First,
88+
Second,
89+
}
90+
""");
91+
6592
[Fact]
6693
public Task TestUnnecessaryDisableEnumDeclarationWithFileHeader()
6794
=> VerifyCodeFixAsync(

0 commit comments

Comments
 (0)