📄
ui/tests/TestGraph.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
using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; namespace Cfa.Ui.Tests; internal static class TestGraph { public static CallGraphAnalysis Create() { var tree = CSharpSyntaxTree.ParseText( """ class Flow { void Request(int id) { } void Entry(int id) { } void Validate(int id) { } void Handle(int id) { } void Save(int id) { } } """, path: "/repo/Flow.cs" ); var compilation = CSharpCompilation.Create( "Example", [tree], [MetadataReference.CreateFromFile(typeof(object).Assembly.Location)], new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) ); var members = compilation .GetTypeByMetadataName("Flow")! .GetMembers() .OfType<IMethodSymbol>() .ToDictionary(method => method.Name); var outgoing = ImmutableDictionary.CreateBuilder<ISymbol, IImmutableList<CallAnalysis>>( SymbolEqualityComparer.Default ); var incoming = ImmutableDictionary.CreateBuilder<ISymbol, IImmutableList<CallAnalysis>>( SymbolEqualityComparer.Default ); outgoing[members["Entry"]] = [ new(members["Validate"], LinkKind.Direct, CallReach.SameType), new(members["Handle"], LinkKind.Event, CallReach.CrossAssembly), ]; outgoing[members["Handle"]] = [new(members["Save"], LinkKind.Direct, CallReach.SameType)]; outgoing[members["Save"]] = [new(members["Save"], LinkKind.Direct, CallReach.SameType)]; incoming[members["Entry"]] = [new(members["Request"], LinkKind.Direct, CallReach.CrossAssembly)]; var appearances = ImmutableDictionary.CreateBuilder<ISymbol, uint>(SymbolEqualityComparer.Default); foreach (var member in members.Values) { appearances[member] = 1; } return new(members["Entry"], outgoing.ToImmutable(), incoming.ToImmutable(), appearances.ToImmutable()); } }