Skip to content

Commit

Permalink
Isolate each Analyzer assembly by loading into its own context.
Browse files Browse the repository at this point in the history
  • Loading branch information
JoeRobich committed Feb 8, 2021
1 parent b3e5183 commit 5a6bf2d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 4 deletions.
4 changes: 1 addition & 3 deletions src/Analyzers/AnalyzerReferenceInformationProvider.cs
Expand Up @@ -23,10 +23,8 @@ internal class AnalyzerReferenceInformationProvider : IAnalyzerInformationProvid

private AnalyzersAndFixers GetAnalyzersAndFixers(Project project)
{
var context = new AnalyzerLoadContext();

var analyzerAssemblies = project.AnalyzerReferences
.Select(reference => TryLoadAssemblyFrom(reference.FullPath, context))
.Select(reference => TryLoadAssemblyFrom(reference.FullPath, new AnalyzerLoadContext()))
.OfType<Assembly>()
.ToImmutableArray();

Expand Down
49 changes: 48 additions & 1 deletion tests/Analyzers/ThirdPartyAnalyzerFormatterTests.cs
Expand Up @@ -120,7 +120,7 @@ void M()
}

[Fact]
public async Task TestIDisposableAnalyzer_Loads()
public async Task TestIDisposableAnalyzer_AddsUsing()
{
var analyzerReferences = GetAnalyzerReferences("IDisposable");

Expand All @@ -141,6 +141,53 @@ void M()
var expectedCode = @"
using System.IO;
class C
{
void M()
{
using (var stream = File.OpenRead(string.Empty))
{
var b = stream.ReadByte();
}
}
}
";

var editorConfig = new Dictionary<string, string>()
{
// Turn off all diagnostics analyzers
["dotnet_analyzer_diagnostic.severity"] = "none",

// Prefer using. IDISP017
["dotnet_diagnostic.IDISP017.severity"] = "error",
};

await AssertCodeChangedAsync(testCode, expectedCode, editorConfig, fixCategory: FixCategory.Analyzers, analyzerReferences: analyzerReferences);
}

[Fact]
public async Task TestLoadingAllAnalyzers_LoadsDependenciesFromAllSearchPaths()
{
// Loads all analyzer references.
var analyzerReferences = _analyzerReferencesProject.AnalyzerReferences;

var testCode = @"
using System.IO;
class C
{
void M()
{
var stream = File.OpenRead(string.Empty);
var b = stream.ReadByte();
stream.Dispose();
}
}
";

var expectedCode = @"
using System.IO;
class C
{
void M()
Expand Down
Expand Up @@ -9,6 +9,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="AspNetCoreAnalyzers" Version="0.2.0.1-dev" PrivateAssets="all" />
<PackageReference Include="IDisposableAnalyzers" Version="3.4.8" PrivateAssets="all" />
</ItemGroup>

Expand Down

0 comments on commit 5a6bf2d

Please sign in to comment.