Skip to content

Commit ef2e86f

Browse files
committed
Bang wrong nullable warnings.
Maybe it is better to revert nullable?
1 parent b0b3c8e commit ef2e86f

7 files changed

Lines changed: 35 additions & 36 deletions

File tree

IDisposableAnalyzers/Analyzers/AssignmentAnalyzer.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ bool IsNullCheck(ExpressionSyntax candidate)
142142
isPattern.Pattern is ConstantPatternSyntax constantPattern &&
143143
constantPattern.Expression.IsKind(SyntaxKind.NullLiteralExpression))
144144
{
145-
return !IsAssignedBefore(ifStatement);
145+
return !IsAssignedBefore(ifStatement!);
146146
}
147147

148148
break;
@@ -152,13 +152,13 @@ when binary.IsKind(SyntaxKind.EqualsExpression):
152152
if (binary.Left.IsKind(SyntaxKind.NullLiteralExpression) &&
153153
IsSymbol(binary.Right))
154154
{
155-
return !IsAssignedBefore(ifStatement);
155+
return !IsAssignedBefore(ifStatement!);
156156
}
157157

158158
if (IsSymbol(binary.Left) &&
159159
binary.Right.IsKind(SyntaxKind.NullLiteralExpression))
160160
{
161-
return !IsAssignedBefore(ifStatement);
161+
return !IsAssignedBefore(ifStatement!);
162162
}
163163

164164
break;
@@ -174,7 +174,7 @@ when binary.IsKind(SyntaxKind.EqualsExpression):
174174
if (invocation.ArgumentList.Arguments.TrySingle(x => x.Expression?.IsKind(SyntaxKind.NullLiteralExpression) == true, out _) &&
175175
invocation.ArgumentList.Arguments.TrySingle(x => IsSymbol(x.Expression), out _))
176176
{
177-
return !IsAssignedBefore(ifStatement);
177+
return !IsAssignedBefore(ifStatement!);
178178
}
179179
}
180180
else if (invocation.Expression is MemberAccessExpressionSyntax memberAccess &&
@@ -187,7 +187,7 @@ memberAccess.Name is IdentifierNameSyntax memberIdentifier &&
187187
if (invocation.ArgumentList.Arguments.TrySingle(x => x.Expression?.IsKind(SyntaxKind.NullLiteralExpression) == true, out _) &&
188188
invocation.ArgumentList.Arguments.TrySingle(x => IsSymbol(x.Expression), out _))
189189
{
190-
return !IsAssignedBefore(ifStatement);
190+
return !IsAssignedBefore(ifStatement!);
191191
}
192192
}
193193

IDisposableAnalyzers/Analyzers/DisposeCallAnalyzer.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,14 @@ declaration is VariableDeclaratorSyntax declarator &&
127127

128128
bool DeclarationIsAssignment()
129129
{
130-
return localDeclarationStatement.Parent == expressionStatement.Parent &&
130+
return localDeclarationStatement!.Parent == expressionStatement!.Parent &&
131131
declarator is { Initializer: { Value: { } value } } &&
132132
Disposable.IsCreation(value, context.SemanticModel, context.CancellationToken) == Result.Yes;
133133
}
134134

135135
bool IsTrivialTryFinally()
136136
{
137-
return expressionStatement.Parent is BlockSyntax block &&
138-
block.Statements.Count == 1 &&
139-
block.Parent is FinallyClauseSyntax finallyClause &&
140-
finallyClause.Parent is TryStatementSyntax tryStatement &&
137+
return expressionStatement!.Parent is BlockSyntax { Statements: { Count: 1 }, Parent: FinallyClauseSyntax { Parent: TryStatementSyntax tryStatement } } &&
141138
!tryStatement.Catches.Any();
142139
}
143140

IDisposableAnalyzers/CodeFixes/AddToCompositeDisposableFix.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContex
4545
{
4646
foreach (var diagnostic in context.Diagnostics)
4747
{
48-
if (syntaxRoot.TryFindNodeOrAncestor(diagnostic, out ExpressionStatementSyntax? statement))
48+
if (syntaxRoot.TryFindNodeOrAncestor(diagnostic, out ExpressionStatementSyntax? statement) &&
49+
statement is { Expression: { } expression })
4950
{
5051
if (TryGetField(statement, semanticModel, context.CancellationToken, out var field))
5152
{
@@ -75,7 +76,7 @@ IEnumerable<ExpressionSyntax> Expressions(InitializerExpressionSyntax old)
7576
{
7677
if (old.Expressions.Count == 0)
7778
{
78-
yield return statement.Expression.WithAdditionalAnnotations(Formatter.Annotation);
79+
yield return expression.WithAdditionalAnnotations(Formatter.Annotation);
7980
}
8081
else
8182
{
@@ -85,7 +86,7 @@ IEnumerable<ExpressionSyntax> Expressions(InitializerExpressionSyntax old)
8586
}
8687

8788
yield return old.Expressions.Last().WithoutTrailingTrivia();
88-
yield return statement.Expression.WithAdditionalAnnotations(Formatter.Annotation);
89+
yield return expression.WithAdditionalAnnotations(Formatter.Annotation);
8990
}
9091
}
9192

@@ -113,7 +114,7 @@ IEnumerable<SyntaxToken> Separators(InitializerExpressionSyntax old)
113114
}
114115
}
115116

116-
return separators.Append(SyntaxFactory.Token(default, SyntaxKind.CommaToken, statement.GetTrailingTrivia()));
117+
return separators.Append(SyntaxFactory.Token(default, SyntaxKind.CommaToken, statement!.GetTrailingTrivia()));
117118
}
118119

119120
break;
@@ -122,7 +123,7 @@ when argumentList.Arguments.TryFirst(x => !(x.Expression is LiteralExpressionSyn
122123
editor.RemoveNode(statement);
123124
editor.ReplaceNode(
124125
argumentList,
125-
x => x.AddArguments(SyntaxFactory.Argument(statement.Expression)));
126+
x => x.AddArguments(SyntaxFactory.Argument(expression)));
126127
break;
127128
default:
128129
editor.RemoveNode(statement);
@@ -133,26 +134,26 @@ when argumentList.Arguments.TryFirst(x => !(x.Expression is LiteralExpressionSyn
133134

134135
editor.ReplaceNode(
135136
objectCreation,
136-
x => x.WithInitializer(CreateInitializer(statement)));
137+
x => x.WithInitializer(CreateInitializer(statement!)));
137138
break;
138139
}
139140

140141
return;
141142
}
142143

143144
_ = editor.ReplaceNode(
144-
statement.Expression,
145+
expression,
145146
x => SyntaxFactory.InvocationExpression(
146147
SyntaxFactory.MemberAccessExpression(
147148
SyntaxKind.SimpleMemberAccessExpression,
148-
IDisposableFactory.MemberAccess(field.Identifier, semanticModel, cancellationToken),
149+
IDisposableFactory.MemberAccess(field!.Identifier, semanticModel, cancellationToken),
149150
SyntaxFactory.IdentifierName("Add")),
150-
SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(statement.Expression))))
151+
SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(x))))
151152
.WithTriviaFrom(x));
152153

153154
StatementSyntax? PreviousStatement()
154155
{
155-
return statement.Parent is BlockSyntax block &&
156+
return statement is { Parent: BlockSyntax block } &&
156157
block.Statements.TryElementAt(block.Statements.IndexOf(statement) - 1, out var result)
157158
? result
158159
: null;
@@ -163,9 +164,9 @@ bool IsField(ExpressionSyntax e)
163164
switch (e)
164165
{
165166
case IdentifierNameSyntax identifierName
166-
when identifierName.Identifier.ValueText == field.Identifier.ValueText:
167+
when identifierName.Identifier.ValueText == field!.Identifier.ValueText:
167168
case MemberAccessExpressionSyntax { Expression: ThisExpressionSyntax _, Name: { } name }
168-
when name.Identifier.ValueText == field.Identifier.ValueText:
169+
when name.Identifier.ValueText == field!.Identifier.ValueText:
169170
return true;
170171
default:
171172
return false;
@@ -192,7 +193,7 @@ async Task CreateAndInitializeAsync(DocumentEditor editor, CancellationToken can
192193
cancellationToken).ConfigureAwait(false);
193194

194195
_ = editor.ReplaceNode(
195-
statement,
196+
statement!,
196197
x => x.WithExpression(
197198
SyntaxFactory.AssignmentExpression(
198199
SyntaxKind.SimpleAssignmentExpression,

IDisposableAnalyzers/CodeFixes/CreateAndAssignFieldFix.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContex
4545
async Task CreateAndAssignFieldAsync(DocumentEditor editor, CancellationToken cancellationToken)
4646
{
4747
var fieldAccess = await editor.AddFieldAsync(
48-
containingType,
48+
containingType!,
4949
local.Identifier.ValueText,
5050
Accessibility.Private,
5151
DeclarationModifiers.ReadOnly,
@@ -62,7 +62,8 @@ async Task CreateAndAssignFieldAsync(DocumentEditor editor, CancellationToken ca
6262
}
6363
else if (diagnostic.Id == Descriptors.IDISP004DoNotIgnoreCreated.Id &&
6464
node.TryFirstAncestorOrSelf<ExpressionStatementSyntax>(out var statement) &&
65-
statement.TryFirstAncestor<ConstructorDeclarationSyntax>(out var ctor))
65+
statement.TryFirstAncestor<ConstructorDeclarationSyntax>(out var ctor) &&
66+
ctor is { Parent: TypeDeclarationSyntax parent })
6667
{
6768
context.RegisterCodeFix(
6869
"Create and assign field.",
@@ -73,7 +74,7 @@ async Task CreateAndAssignFieldAsync(DocumentEditor editor, CancellationToken ca
7374
async Task CreateAndAssignFieldAsync(DocumentEditor editor, CancellationToken cancellationToken)
7475
{
7576
var fieldAccess = await editor.AddFieldAsync(
76-
(TypeDeclarationSyntax)ctor.Parent,
77+
parent,
7778
"disposable",
7879
Accessibility.Private,
7980
DeclarationModifiers.ReadOnly,
@@ -82,7 +83,7 @@ async Task CreateAndAssignFieldAsync(DocumentEditor editor, CancellationToken ca
8283
.ConfigureAwait(false);
8384

8485
_ = editor.ReplaceNode(
85-
statement,
86+
statement!,
8687
x => SyntaxFactory.ExpressionStatement(
8788
SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, fieldAccess, x.Expression))
8889
.WithTriviaFrom(x));

IDisposableAnalyzers/CodeFixes/DisposeMemberFix.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContex
4646

4747
void Dispose(DocumentEditor editor, CancellationToken cancellationToken)
4848
{
49-
if (TryFindIfNotDisposingReturn(disposeDeclaration, out var ifNotDisposingReturn) &&
49+
if (TryFindIfNotDisposingReturn(disposeDeclaration!, out var ifNotDisposingReturn) &&
5050
ifNotDisposingReturn.Parent is BlockSyntax)
5151
{
5252
editor.InsertAfter(
5353
ifNotDisposingReturn,
5454
IDisposableFactory.DisposeStatement(disposable, editor.SemanticModel, cancellationToken));
5555
}
56-
else if (TryFindIfDisposing(disposeDeclaration, out var ifDisposing))
56+
else if (TryFindIfDisposing(disposeDeclaration!, out var ifDisposing))
5757
{
5858
_ = editor.ReplaceNode(
5959
ifDisposing.Statement,
@@ -66,7 +66,7 @@ void Dispose(DocumentEditor editor, CancellationToken cancellationToken)
6666
ifDisposing = SyntaxFactory.IfStatement(
6767
SyntaxFactory.IdentifierName(parameters[0].Identifier),
6868
SyntaxFactory.Block(IDisposableFactory.DisposeStatement(disposable, editor.SemanticModel, cancellationToken)));
69-
if (DisposeMethod.TryFindBaseCall(disposeDeclaration, editor.SemanticModel, cancellationToken, out var baseCall))
69+
if (DisposeMethod.TryFindBaseCall(disposeDeclaration!, editor.SemanticModel, cancellationToken, out var baseCall))
7070
{
7171
editor.InsertBefore(baseCall.Parent, ifDisposing);
7272
}
@@ -103,7 +103,7 @@ void Dispose(DocumentEditor editor, CancellationToken cancellationToken)
103103

104104
void Dispose(DocumentEditor editor, CancellationToken cancellationToken)
105105
{
106-
if (DisposeMethod.TryFindBaseCall(disposeDeclaration, editor.SemanticModel, cancellationToken, out var baseCall))
106+
if (DisposeMethod.TryFindBaseCall(disposeDeclaration!, editor.SemanticModel, cancellationToken, out var baseCall))
107107
{
108108
editor.InsertBefore(
109109
baseCall.Parent,

IDisposableAnalyzers/CodeFixes/ImplementIDisposableFix.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ async Task OverrideDisposeAsync(DocumentEditor editor, CancellationToken cancell
7676
SyntaxFactory.ParseTypeName("bool"),
7777
cancellationToken).ConfigureAwait(false);
7878

79-
_ = editor.AddMethod(classDeclaration, MethodFactory.OverrideDispose(disposed, baseDispose))
79+
_ = editor.AddMethod(classDeclaration, MethodFactory.OverrideDispose(disposed, baseDispose!))
8080
.AddThrowIfDisposed(classDeclaration, disposed, cancellationToken);
8181
}
8282
}
@@ -188,7 +188,7 @@ await editor.ThisDisposedTrueAsync(cancellationToken).ConfigureAwait(false),
188188

189189
bool CanImplement()
190190
{
191-
return !type.TryFindFirstMethodRecursive("Dispose", out var disposeMethod) ||
191+
return !type!.TryFindFirstMethodRecursive("Dispose", out var disposeMethod) ||
192192
disposeMethod.Parameters.Length != 0;
193193
}
194194
}

IDisposableAnalyzers/Helpers/Walkers/ReturnValueWalker.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ private bool TryHandleInvocation(InvocationExpressionSyntax invocation, [NotNull
164164
bool IsParameter(ExpressionSyntax value)
165165
{
166166
return value is IdentifierNameSyntax id &&
167-
baseMethod.TryFindParameter(id.Identifier.ValueText, out _);
167+
baseMethod!.TryFindParameter(id.Identifier.ValueText, out _);
168168
}
169169
}
170170

@@ -198,7 +198,7 @@ bool IsParameter(ExpressionSyntax value)
198198
bool IsParameter(ExpressionSyntax value)
199199
{
200200
return value is IdentifierNameSyntax id &&
201-
localFunction.ParameterList.TryFind(id.Identifier.ValueText, out _);
201+
localFunction!.ParameterList.TryFind(id.Identifier.ValueText, out _);
202202
}
203203
}
204204
}
@@ -264,7 +264,7 @@ symbol is IMethodSymbol method &&
264264
method.Parameters.TryFirst(x => x.Name == identifierName.Identifier.ValueText, out var parameter))
265265
{
266266
if (this.search != ReturnValueSearch.RecursiveInside &&
267-
invocation.TryFindArgument(parameter, out var argument))
267+
invocation!.TryFindArgument(parameter, out var argument))
268268
{
269269
this.AddReturnValue(argument.Expression);
270270
}

0 commit comments

Comments
 (0)