📄
SolutionExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; namespace Reacher; public static class SolutionExtensions { public static async Task<ReachabilityAnalysis> AnalyzeReachabilityFromEntryPoints( this Solution solution, CancellationToken cancellationToken ) { var compilations = await solution.GetCompilations(cancellationToken); return AnalyzeReachability( compilations, [.. compilations.Select(c => c.GetEntryPoint(cancellationToken)).OfType<IMethodSymbol>()], cancellationToken ); } public static async Task<ReachabilityAnalysis> AnalyzeReachabilityFromPublicMembers( this Solution solution, CancellationToken cancellationToken ) { var compilations = await solution.GetCompilations(cancellationToken); return AnalyzeReachability( compilations, [.. compilations.SelectMany(CompilationExtensions.GetPublicMembers)], cancellationToken ); } private static ReachabilityAnalysis AnalyzeReachability( IReadOnlyCollection<Compilation> compilations, IEnumerable<IMethodSymbol> entryPoints, CancellationToken cancellationToken ) { var analysis = new ReachabilityAnalysis(compilations); foreach (var entryPoint in entryPoints) { analysis.Analyze(entryPoint, cancellationToken); } return analysis; } private static async Task<Compilation[]> GetCompilations( this Solution solution, CancellationToken cancellationToken ) => await solution .Projects.ToAsyncEnumerable() .Select(async (p, ct) => await p.GetCompilationAsync(ct)) .OfType<Compilation>() .ToArrayAsync(cancellationToken); }