Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add suppression ability #72

Merged
merged 2 commits into from
Sep 18, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/Analyzer/ReferenceTrimmerAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,14 @@ private static void DumpUsedReferences(CompilationAnalysisContext context)
}

Dictionary<string, List<string>> packageAssembliesDict = new(StringComparer.OrdinalIgnoreCase);
Dictionary<string, string> packageNoWarn = new(StringComparer.OrdinalIgnoreCase);
foreach (DeclaredReference declaredReference in declaredReferences.References)
{
switch (declaredReference.Kind)
{
case DeclaredReferenceKind.Reference:
{
if (!usedReferences.Contains(declaredReference.AssemblyName))
if (!usedReferences.Contains(declaredReference.AssemblyName) && !declaredReference.NoWarn.Contains(RT0001Descriptor.Id))
{
context.ReportDiagnostic(Diagnostic.Create(RT0001Descriptor, Location.None, declaredReference.Spec));
}
Expand All @@ -106,7 +107,7 @@ private static void DumpUsedReferences(CompilationAnalysisContext context)
}
case DeclaredReferenceKind.ProjectReference:
{
if (!usedReferences.Contains(declaredReference.AssemblyName))
if (!usedReferences.Contains(declaredReference.AssemblyName) && !declaredReference.NoWarn.Contains(RT0002Descriptor.Id))
{
context.ReportDiagnostic(Diagnostic.Create(RT0002Descriptor, Location.None, declaredReference.Spec));
}
Expand All @@ -122,6 +123,7 @@ private static void DumpUsedReferences(CompilationAnalysisContext context)
}

packageAssemblies.Add(declaredReference.AssemblyName);
packageNoWarn[declaredReference.Spec] = declaredReference.NoWarn;
break;
}
}
Expand All @@ -132,7 +134,7 @@ private static void DumpUsedReferences(CompilationAnalysisContext context)
{
string packageName = kvp.Key;
List<string> packageAssemblies = kvp.Value;
if (!packageAssemblies.Any(usedReferences.Contains))
if (!packageAssemblies.Any(usedReferences.Contains) && !packageNoWarn[packageName].Contains(RT0003Descriptor.Id))
{
context.ReportDiagnostic(Diagnostic.Create(RT0003Descriptor, Location.None, packageName));
}
Expand Down
42 changes: 42 additions & 0 deletions src/E2ETests/E2ETests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ public void UnusedProjectReference()
});
}

[TestMethod]
public void UnusedProjectReferenceNoWarn()
{
RunMSBuild(
projectFile: "Library/Library.csproj",
expectedWarnings: Array.Empty<Warning>());
}

[TestMethod]
public void UnusedTransitiveProjectReference()
{
Expand Down Expand Up @@ -114,6 +122,19 @@ public void UnusedReferenceHintPath()
});
}

[TestMethod]
public void UnusedReferenceHintPathNoWarn()
{
// For direct references, MSBuild can't determine build order so we need to ensure the dependency is already built
RunMSBuild(
projectFile: "Dependency/Dependency.csproj",
expectedWarnings: Array.Empty<Warning>());

RunMSBuild(
projectFile: "Library/Library.csproj",
expectedWarnings: Array.Empty<Warning>());
}

[TestMethod]
public void UnusedReferenceItemSpec()
{
Expand All @@ -134,6 +155,19 @@ public void UnusedReferenceItemSpec()
});
}

[TestMethod]
public void UnusedReferenceItemSpecNoWarn()
{
// For direct references, MSBuild can't determine build order so we need to ensure the dependency is already built
RunMSBuild(
projectFile: "Dependency/Dependency.csproj",
expectedWarnings: Array.Empty<Warning>());

RunMSBuild(
projectFile: "Library/Library.csproj",
expectedWarnings: Array.Empty<Warning>());
}

[TestMethod]
public void UsedPackageReference()
{
Expand Down Expand Up @@ -161,6 +195,14 @@ public void UnusedPackageReference()
});
}

[TestMethod]
public void UnusedPackageReferenceNoWarn()
{
RunMSBuild(
projectFile: "Library/Library.csproj",
expectedWarnings: Array.Empty<Warning>());
}

[TestMethod]
public void UnusedPackageReferenceDocDisabled()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Library
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" NoWarn="RT0003"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Dependency
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Library
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="../Dependency/Dependency.csproj" NoWarn="RT0002" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Dependency
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Library
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Reference Include="Dependency">
<HintPath>..\Dependency\$(OutputPath)\Dependency.dll</HintPath>
<NoWarn>RT0001</NoWarn>
</Reference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Dependency
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Library
{
public static class Foo
{
public static string Bar() => "Baz";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Reference Include="..\Dependency\$(OutputPath)\Dependency.dll" NoWarn="RT0001"/>
</ItemGroup>

</Project>
10 changes: 6 additions & 4 deletions src/Shared/DeclaredReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public void SaveToFile(string filePath)
writer.Write(KindEnumToString[reference.Kind]);
writer.Write(FieldDelimiter);
writer.Write(reference.Spec);
writer.Write(FieldDelimiter);
writer.Write(reference.NoWarn);
writer.WriteLine();
}
}
Expand All @@ -46,23 +48,23 @@ public static DeclaredReferences ReadFromFile(string filePath)
string? line;
while ((line = reader.ReadLine()) != null)
{
string[] parts = line.Split(FieldDelimiters, 3);
if (parts.Length != 3)
string[] parts = line.Split(FieldDelimiters, 4);
if (parts.Length != 4)
{
throw new InvalidDataException($"File '{filePath}' is invalid. Line: {references.Count + 1}");
}

string assemblyName = parts[0];
DeclaredReferenceKind kind = KindStringToEnum[parts[1]];
string spec = parts[2];
DeclaredReference reference = new(assemblyName, kind, spec);
DeclaredReference reference = new(assemblyName, kind, spec, parts[3]);
references.Add(reference);
}

return new DeclaredReferences(references);
}
}

internal record DeclaredReference(string AssemblyName, DeclaredReferenceKind Kind, string Spec);
internal record DeclaredReference(string AssemblyName, DeclaredReferenceKind Kind, string Spec, string NoWarn);

internal enum DeclaredReferenceKind { Reference, ProjectReference, PackageReference }
6 changes: 3 additions & 3 deletions src/Tasks/CollectDeclaredReferencesTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public override bool Execute()
}
}

declaredReferences.Add(new DeclaredReference(referenceAssemblyName, DeclaredReferenceKind.Reference, referenceSpec));
declaredReferences.Add(new DeclaredReference(referenceAssemblyName, DeclaredReferenceKind.Reference, referenceSpec, reference.GetMetadata("NoWarn")));
}
}

Expand All @@ -137,7 +137,7 @@ public override bool Execute()
string projectReferenceAssemblyName = new AssemblyName(projectReference.GetMetadata("FusionName")).Name;
string referenceProjectFile = projectReference.GetMetadata("OriginalProjectReferenceItemSpec");

declaredReferences.Add(new DeclaredReference(projectReferenceAssemblyName, DeclaredReferenceKind.ProjectReference, referenceProjectFile));
declaredReferences.Add(new DeclaredReference(projectReferenceAssemblyName, DeclaredReferenceKind.ProjectReference, referenceProjectFile, projectReference.GetMetadata("NoWarn")));
}
}

Expand All @@ -160,7 +160,7 @@ public override bool Execute()

foreach (string assemblyName in packageInfo.CompileTimeAssemblies)
{
declaredReferences.Add(new DeclaredReference(assemblyName, DeclaredReferenceKind.PackageReference, packageReference.ItemSpec));
declaredReferences.Add(new DeclaredReference(assemblyName, DeclaredReferenceKind.PackageReference, packageReference.ItemSpec, packageReference.GetMetadata("NoWarn")));
stan-sz marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Expand Down