Core/MemberCollectors/AttributedMembersCollector.cs
+23
-0
diff --git a/Core/MemberCollectors/AttributedMembersCollector.cs b/Core/MemberCollectors/AttributedMembersCollector.cs
new file mode 100644
index 0000000..309fd02
@@ -0,0 +1,23 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
namespace Reacher.MemberCollectors;
internal sealed class AttributedMembersCollector(string attributeName) : MembersCollector()
{
public static IEnumerable<ISymbol> CollectMembers(string attributeName, IEnumerable<Compilation> compilations)
{
var collector = new AttributedMembersCollector(attributeName);
compilations.Accept(collector);
return collector.Members;
}
protected override bool ShouldMemberBeIncluded(ISymbol member) =>
member
.GetAttributes()
.Any(attr =>
attr.AttributeClass?.Name is string name
&& (name == attributeName || name == attributeName + "Attribute")
);
}
Core/SolutionExtensions.cs
+17
-0
diff --git a/Core/SolutionExtensions.cs b/Core/SolutionExtensions.cs
index 38ca9f8..be4ae4a 100644
@@ -27,6 +27,23 @@ public static class SolutionExtensions
}
/// <summary>
/// Runs a reachability analysis from all members in the solution with the given attribute.
/// </summary>
public static async Task<ReachabilityAnalysis> AnalyzeReachabilityFromAttributedMembers(
this Solution solution,
string attributeName,
CancellationToken cancellationToken
)
{
var compilations = await solution.GetCompilations(cancellationToken);
return AnalyzeReachability(
compilations,
AttributedMembersCollector.CollectMembers(attributeName, compilations),
cancellationToken
);
}
/// <summary>
/// Runs a reachability analysis from all public members of public types of all projects in the solution.
/// </summary>
public static async Task<ReachabilityAnalysis> AnalyzeReachabilityFromPublicMembers(
Poc/Program.cs
+3
-3
diff --git a/Poc/Program.cs b/Poc/Program.cs
index 07519ca..e10d8b6 100644
@@ -17,9 +17,9 @@ test.Test();
Noop();
var analysis = args is []
? await solution.AnalyzeReachabilityFromEntryPoints(default)
: await solution.AnalyzeReachabilityFromDocumentationCommentIds(args, default);
var analysis = args is [var attributeName]
? await solution.AnalyzeReachabilityFromAttributedMembers(attributeName, default)
: await solution.AnalyzeReachabilityFromEntryPoints(default);
Console.WriteLine("Reachable members:");
foreach (