Skip to content

Commit db9d104

Browse files
committed
Add tests for IServiceProvider.GetRequiredService
No repro for #210
1 parent 2ddaf9a commit db9d104

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

IDisposableAnalyzers.NetCoreTests/IDISP004DontIgnoreReturnValueOfTypeIDisposableTests/Valid.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,36 @@ public void Configure(
3232
}";
3333
RoslynAssert.Valid(Analyzer, code);
3434
}
35+
36+
[TestCase("var disposable = serviceProvider.GetRequiredService<Disposable>();")]
37+
[TestCase("_ = serviceProvider.GetRequiredService<Disposable>();")]
38+
[TestCase("var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();")]
39+
[TestCase("_ = serviceProvider.GetRequiredService<ILoggerFactory>();")]
40+
public static void IServiceProviderGetRequiredService(string statement)
41+
{
42+
var code = @"
43+
namespace N
44+
{
45+
using System;
46+
using Microsoft.Extensions.DependencyInjection;
47+
using Microsoft.Extensions.Logging;
48+
49+
public class C
50+
{
51+
public C(IServiceProvider serviceProvider)
52+
{
53+
var disposable = serviceProvider.GetRequiredService<Disposable>();
54+
}
55+
56+
public sealed class Disposable : IDisposable
57+
{
58+
public void Dispose()
59+
{
60+
}
61+
}
62+
}
63+
}".AssertReplace("var disposable = serviceProvider.GetRequiredService<Disposable>();", statement);
64+
RoslynAssert.Valid(Analyzer, code);
65+
}
3566
}
3667
}

IDisposableAnalyzers/Analyzers/FieldAndPropertyDeclarationAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ static bool IsAccessible(Accessibility accessibility, INamedTypeSymbol containin
131131
Accessibility.ProtectedOrInternal => true,
132132
Accessibility.ProtectedAndInternal => true,
133133
Accessibility.Public => true,
134-
_ => throw new ArgumentOutOfRangeException(nameof(accessibility), accessibility, "Unhandled accessibility")
134+
_ => throw new ArgumentOutOfRangeException(nameof(accessibility), accessibility, "Unhandled accessibility"),
135135
};
136136
}
137137
}

IDisposableAnalyzers/Helpers/Disposable.Disposes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ when Winform.IsComponentsAdd(invocation, recursion.SemanticModel, recursion.Canc
175175
when recursion.Target(argument) is { } target
176176
=> DisposedByReturnValue(target, recursion, out var wrapper) &&
177177
Disposes(wrapper, recursion),
178-
_ => false
178+
_ => false,
179179
};
180180

181181
bool IsDisposeOrReturnValueDisposed(InvocationExpressionSyntax invocation)

IDisposableAnalyzers/Helpers/Disposable.Ignores.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ when recursion.Target(argument) is { } target
8080
=> WrappedAndIgnored(),
8181
{ Parent: InitializerExpressionSyntax { Parent: ExpressionSyntax creation } }
8282
=> Ignores(creation, recursion),
83-
_ => false
83+
_ => false,
8484
};
8585

8686
bool WrappedAndIgnored()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// ReSharper disable All
2+
namespace ValidCode.NetCore
3+
{
4+
using System;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.Logging;
7+
8+
public class ServiceProviderUsage
9+
{
10+
public ServiceProviderUsage(IServiceProvider serviceProvider)
11+
{
12+
var disposable = serviceProvider.GetRequiredService<Disposable>();
13+
_ = serviceProvider.GetRequiredService<Disposable>();
14+
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
15+
_ = serviceProvider.GetRequiredService<ILoggerFactory>();
16+
}
17+
18+
public sealed class Disposable : IDisposable
19+
{
20+
public void Dispose()
21+
{
22+
}
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)