Skip to content

Commit 3296f13

Browse files
committed
Handle Task.Run in Identity
1 parent e93c22a commit 3296f13

3 files changed

Lines changed: 15 additions & 16 deletions

File tree

IDisposableAnalyzers.Test/Helpers/DisposableWalkerTests.Assigns.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ private void M(IDisposable arg)
212212

213213
[TestCase("Task.FromResult(File.OpenRead(fileName))")]
214214
[TestCase("Task.FromResult(File.OpenRead(fileName)).ConfigureAwait(true)")]
215-
//[TestCase("Task.Run(() => File.OpenRead(fileName))")]
216-
//[TestCase("Task.Run(() => { return File.OpenRead(fileName); })")]
217-
//[TestCase("Task.Run(() => File.OpenRead(fileName)).ConfigureAwait(true)")]
215+
[TestCase("Task.Run(() => File.OpenRead(fileName))")]
216+
[TestCase("Task.Run(() => { return File.OpenRead(fileName); })")]
217+
[TestCase("Task.Run(() => File.OpenRead(fileName)).ConfigureAwait(true)")]
218218
public static void AssigningFieldAwait(string expression)
219219
{
220220
var code = @"
@@ -250,10 +250,10 @@ public void Dispose()
250250

251251
[TestCase("Task.FromResult(File.OpenRead(fileName)).Result")]
252252
[TestCase("Task.FromResult(File.OpenRead(fileName)).GetAwaiter().GetResult()")]
253-
//[TestCase("Task.Run(() => File.OpenRead(fileName)).Result")]
254-
//[TestCase("Task.Run(() => File.OpenRead(fileName)).GetAwaiter().GetResult()")]
255-
//[TestCase("Task.Run(() => { return File.OpenRead(fileName); }).Result")]
256-
//[TestCase("Task.Run(() => { return File.OpenRead(fileName); }).GetAwaiter().GetResult()")]
253+
[TestCase("Task.Run(() => File.OpenRead(fileName)).Result")]
254+
[TestCase("Task.Run(() => File.OpenRead(fileName)).GetAwaiter().GetResult()")]
255+
[TestCase("Task.Run(() => { return File.OpenRead(fileName); }).Result")]
256+
[TestCase("Task.Run(() => { return File.OpenRead(fileName); }).GetAwaiter().GetResult()")]
257257
public static void AssigningFieldGetAwaiterGetResult(string expression)
258258
{
259259
var code = @"

IDisposableAnalyzers/Helpers/Walkers/DisposableWalker.DisposedByReturnValue.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,9 @@ private static bool DisposedByReturnValue<TSource, TSymbol, TNode>(Target<TSourc
136136
{
137137
switch (target.Symbol)
138138
{
139-
case IPropertySymbol { ContainingType: { MetadataName: "Task`1" }, Name: "Result" }:
140-
return true;
141139
case IMethodSymbol { ReturnsVoid: true }:
142140
case IMethodSymbol { ReturnType: { MetadataName: "Task" } }:
143141
return false;
144-
case IMethodSymbol { ReturnType: { MetadataName: "ConfiguredTaskAwaitable`1" } }:
145-
case IMethodSymbol { ReturnType: { MetadataName: "TaskAwaiter`1" } }:
146-
case IMethodSymbol { ContainingSymbol: { MetadataName: "TaskAwaiter`1" }, Name: "GetResult" }:
147-
return true;
148-
case IMethodSymbol { ReturnType: INamedTypeSymbol { MetadataName: "Task`1" } taskOfT }
149-
when taskOfT.TypeArguments.TrySingle(out var type):
150-
return Disposable.IsAssignableFrom(type, recursion.SemanticModel.Compilation);
151142
case IMethodSymbol { ReturnType: { } returnType, DeclaringSyntaxReferences: { Length: 0 } }:
152143
// we assume here, not sure it is the best assumption.
153144
return Disposable.IsAssignableFrom(returnType, recursion.SemanticModel.Compilation);

IDisposableAnalyzers/Helpers/Walkers/DisposableWalker.Identity.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ when invocation.IsSymbol(KnownSymbol.Task.FromResult, recursion.SemanticModel, r
2626
=> Recursive(invocation, recursion),
2727
{ Parent: MemberAccessExpressionSyntax { Name: IdentifierNameSyntax { Identifier: { ValueText: "GetAwaiter" } }, Parent: InvocationExpressionSyntax invocation } }
2828
=> Recursive(invocation, recursion),
29+
{ Parent: LambdaExpressionSyntax { Parent: ArgumentSyntax { Parent: ArgumentListSyntax { Parent: InvocationExpressionSyntax invocation } } } }
30+
when invocation.IsSymbol(KnownSymbol.Task.Run, recursion.SemanticModel, recursion.CancellationToken)
31+
=> Recursive(invocation, recursion),
32+
{ Parent:ReturnStatementSyntax returnStatement}
33+
when returnStatement.TryFirstAncestor(out LambdaExpressionSyntax? lambda) &&
34+
lambda is { Parent: ArgumentSyntax { Parent: ArgumentListSyntax { Parent: InvocationExpressionSyntax invocation } } } &&
35+
invocation.IsSymbol(KnownSymbol.Task.Run, recursion.SemanticModel, recursion.CancellationToken)
36+
=> Recursive(invocation, recursion),
2937
{ Parent: MemberAccessExpressionSyntax { Expression: { } expression, Name: IdentifierNameSyntax { Identifier: { ValueText: "Result" } } } memberAccess }
3038
when recursion.SemanticModel.TryGetNamedType(expression, recursion.CancellationToken, out var type) &&
3139
type.IsAssignableTo(KnownSymbol.Task, recursion.SemanticModel.Compilation)

0 commit comments

Comments
 (0)