Skip to content

Commit a8cd6dc

Browse files
authored
Add code fix for CS0037 (#929)
1 parent 94fb0b3 commit a8cd6dc

File tree

5 files changed

+105
-7
lines changed

5 files changed

+105
-7
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
- Convert more syntax to implicit object creation (RCS1250) ([#910](https://github.com/josefpihrt/roslynator/pull/910)).
13+
- Add code fix for CS0037 ([#929](https://github.com/josefpihrt/roslynator/pull/929)).
1314

1415
### Changed
1516

docs/cs/CS0037.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
## Code Fixes
1111

12+
* Remove property or field initializer
1213
* Replace 'null' with default value
1314

15+
1416
*\(Generated with [DotMarkdown](http://github.com/JosefPihrt/DotMarkdown)\)*

src/CodeFixes/CSharp/CodeFixes/RemovePropertyOrFieldInitializerCodeFixProvider.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
using System.Collections.Immutable;
44
using System.Composition;
5-
using System.Diagnostics;
65
using System.Threading.Tasks;
76
using Microsoft.CodeAnalysis;
87
using Microsoft.CodeAnalysis.CodeActions;
@@ -24,6 +23,7 @@ public override ImmutableArray<string> FixableDiagnosticIds
2423
get
2524
{
2625
return ImmutableArray.Create(
26+
CompilerDiagnosticIdentifiers.CS0037_CannotConvertNullToTypeBecauseItIsNonNullableValueType,
2727
CompilerDiagnosticIdentifiers.CS0573_CannotHaveInstancePropertyOrFieldInitializersInStruct,
2828
CompilerDiagnosticIdentifiers.CS8050_OnlyAutoImplementedPropertiesCanHaveInitializers);
2929
}
@@ -41,12 +41,9 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
4141
if (!TryFindToken(root, context.Span.Start, out SyntaxToken token))
4242
return;
4343

44-
SyntaxDebug.Assert(token.IsKind(SyntaxKind.IdentifierToken), token);
44+
SyntaxDebug.Assert(token.IsKind(SyntaxKind.IdentifierToken, SyntaxKind.NullKeyword), token);
4545

46-
if (!token.IsKind(SyntaxKind.IdentifierToken))
47-
return;
48-
49-
switch (token.Parent)
46+
switch (GetNode(token))
5047
{
5148
case PropertyDeclarationSyntax propertyDeclaration:
5249
{
@@ -83,12 +80,36 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
8380

8481
return context.Document.ReplaceNodeAsync(variableDeclarator, newNode, ct);
8582
},
86-
GetEquivalenceKey(CompilerDiagnosticIdentifiers.CS0573_CannotHaveInstancePropertyOrFieldInitializersInStruct, CodeFixIdentifiers.RemovePropertyOrFieldInitializer));
83+
GetEquivalenceKey(diagnostic, CodeFixIdentifiers.RemovePropertyOrFieldInitializer));
8784

8885
context.RegisterCodeFix(codeAction, diagnostic);
8986
break;
9087
}
9188
}
89+
90+
static SyntaxNode GetNode(SyntaxToken token)
91+
{
92+
if (token.IsKind(SyntaxKind.IdentifierToken))
93+
return token.Parent;
94+
95+
if (token.IsKind(SyntaxKind.NullKeyword))
96+
{
97+
SyntaxNode node = token.Parent;
98+
99+
if (node.IsKind(SyntaxKind.NullLiteralExpression))
100+
{
101+
node = node.Parent;
102+
103+
if (node.IsKind(SyntaxKind.SuppressNullableWarningExpression))
104+
node = node.Parent;
105+
106+
if (node.IsKind(SyntaxKind.EqualsValueClause))
107+
return node.Parent;
108+
}
109+
}
110+
111+
return null;
112+
}
92113
}
93114
}
94115
}

src/CodeFixes/CodeFixes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
</CodeFix>
121121
<CodeFix Id="RCF0024" Identifier="RemovePropertyOrFieldInitializer" Title="Remove property or field initializer">
122122
<FixableDiagnosticIds>
123+
<Id>CS0037</Id>
123124
<Id>CS0573</Id>
124125
<Id>CS8050</Id>
125126
</FixableDiagnosticIds>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) Josef Pihrt and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
using System.Threading.Tasks;
4+
using Roslynator.Testing.CSharp;
5+
using Xunit;
6+
7+
namespace Roslynator.CSharp.CodeFixes.Tests
8+
{
9+
public class CS0037CannotConvertNullToTypeBecauseItIsNonNullableValueTypeTests : AbstractCSharpCompilerDiagnosticFixVerifier<RemovePropertyOrFieldInitializerCodeFixProvider>
10+
{
11+
public override string DiagnosticId { get; } = CompilerDiagnosticIdentifiers.CS0037_CannotConvertNullToTypeBecauseItIsNonNullableValueType;
12+
13+
[Fact, Trait(Traits.CodeFix, CompilerDiagnosticIdentifiers.CS0037_CannotConvertNullToTypeBecauseItIsNonNullableValueType)]
14+
public async Task Test_RemovePropertyInitializer()
15+
{
16+
await VerifyFixAsync(@"
17+
using System;
18+
19+
class C
20+
{
21+
public StringSplitOptions Options { get; set } = null;
22+
}
23+
", @"
24+
using System;
25+
26+
class C
27+
{
28+
public StringSplitOptions Options { get; set }
29+
}
30+
", equivalenceKey: EquivalenceKey.Create(DiagnosticId, CodeFixIdentifiers.RemovePropertyOrFieldInitializer));
31+
}
32+
33+
[Fact, Trait(Traits.CodeFix, CompilerDiagnosticIdentifiers.CS0037_CannotConvertNullToTypeBecauseItIsNonNullableValueType)]
34+
public async Task Test_RemovePropertyInitializer_NullForgivingOperator()
35+
{
36+
await VerifyFixAsync(@"
37+
using System;
38+
39+
class C
40+
{
41+
public StringSplitOptions Options { get; set } = null!;
42+
}
43+
", @"
44+
using System;
45+
46+
class C
47+
{
48+
public StringSplitOptions Options { get; set }
49+
}
50+
", equivalenceKey: EquivalenceKey.Create(DiagnosticId, CodeFixIdentifiers.RemovePropertyOrFieldInitializer));
51+
}
52+
53+
[Fact, Trait(Traits.CodeFix, CompilerDiagnosticIdentifiers.CS0037_CannotConvertNullToTypeBecauseItIsNonNullableValueType)]
54+
public async Task Test_RemoveFieldInitializer()
55+
{
56+
await VerifyFixAsync(@"
57+
using System;
58+
59+
class C
60+
{
61+
public StringSplitOptions Options = null!;
62+
}
63+
", @"
64+
using System;
65+
66+
class C
67+
{
68+
public StringSplitOptions Options;
69+
}
70+
", equivalenceKey: EquivalenceKey.Create(DiagnosticId, CodeFixIdentifiers.RemovePropertyOrFieldInitializer));
71+
}
72+
}
73+
}

0 commit comments

Comments
 (0)