save progress
This commit is contained in:
@@ -40,8 +40,8 @@ public sealed class DotNetCallGraphExtractor : ICallGraphExtractor
|
||||
workspace.WorkspaceFailed += (_, _) => { };
|
||||
|
||||
var solution = resolvedTarget.EndsWith(".sln", StringComparison.OrdinalIgnoreCase)
|
||||
? await workspace.OpenSolutionAsync(resolvedTarget, cancellationToken).ConfigureAwait(false)
|
||||
: (await workspace.OpenProjectAsync(resolvedTarget, cancellationToken).ConfigureAwait(false)).Solution;
|
||||
? await workspace.OpenSolutionAsync(resolvedTarget, cancellationToken: cancellationToken).ConfigureAwait(false)
|
||||
: (await workspace.OpenProjectAsync(resolvedTarget, cancellationToken: cancellationToken).ConfigureAwait(false)).Solution;
|
||||
|
||||
var nodesById = new Dictionary<string, CallGraphNode>(StringComparer.Ordinal);
|
||||
var edges = new HashSet<CallGraphEdge>(CallGraphEdgeComparer.Instance);
|
||||
@@ -203,18 +203,20 @@ public sealed class DotNetCallGraphExtractor : ICallGraphExtractor
|
||||
var (file, line) = GetSourceLocation(analysisRoot, syntax.GetLocation());
|
||||
|
||||
var (isEntrypoint, entryType) = EntrypointClassifier.IsEntrypoint(method);
|
||||
var symbol = FormatSymbol(method);
|
||||
var sink = SinkRegistry.MatchSink("dotnet", symbol);
|
||||
|
||||
return new CallGraphNode(
|
||||
NodeId: id,
|
||||
Symbol: method.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
|
||||
Symbol: symbol,
|
||||
File: file,
|
||||
Line: line,
|
||||
Package: method.ContainingAssembly?.Name ?? "unknown",
|
||||
Visibility: MapVisibility(method.DeclaredAccessibility),
|
||||
IsEntrypoint: isEntrypoint,
|
||||
EntrypointType: entryType,
|
||||
IsSink: false,
|
||||
SinkCategory: null);
|
||||
IsSink: sink is not null,
|
||||
SinkCategory: sink?.Category);
|
||||
}
|
||||
|
||||
private static CallGraphNode CreateInvokedNode(string analysisRoot, IMethodSymbol method)
|
||||
@@ -223,11 +225,12 @@ public sealed class DotNetCallGraphExtractor : ICallGraphExtractor
|
||||
var definitionLocation = method.Locations.FirstOrDefault(l => l.IsInSource) ?? Location.None;
|
||||
var (file, line) = GetSourceLocation(analysisRoot, definitionLocation);
|
||||
|
||||
var sink = SinkRegistry.MatchSink("dotnet", method.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
|
||||
var symbol = FormatSymbol(method);
|
||||
var sink = SinkRegistry.MatchSink("dotnet", symbol);
|
||||
|
||||
return new CallGraphNode(
|
||||
NodeId: id,
|
||||
Symbol: method.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
|
||||
Symbol: symbol,
|
||||
File: file,
|
||||
Line: line,
|
||||
Package: method.ContainingAssembly?.Name ?? "unknown",
|
||||
@@ -303,6 +306,41 @@ public sealed class DotNetCallGraphExtractor : ICallGraphExtractor
|
||||
return $"dotnet:{method.ContainingAssembly?.Name}:{method.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}";
|
||||
}
|
||||
|
||||
private static string FormatSymbol(IMethodSymbol method)
|
||||
{
|
||||
var namespaceName = method.ContainingNamespace is { IsGlobalNamespace: false }
|
||||
? method.ContainingNamespace.ToDisplayString()
|
||||
: string.Empty;
|
||||
|
||||
var typeName = method.ContainingType is null
|
||||
? string.Empty
|
||||
: string.Join('.', GetContainingTypeNames(method.ContainingType));
|
||||
|
||||
if (string.IsNullOrWhiteSpace(namespaceName))
|
||||
{
|
||||
return string.IsNullOrWhiteSpace(typeName)
|
||||
? method.Name
|
||||
: $"{typeName}.{method.Name}";
|
||||
}
|
||||
|
||||
return string.IsNullOrWhiteSpace(typeName)
|
||||
? $"{namespaceName}.{method.Name}"
|
||||
: $"{namespaceName}.{typeName}.{method.Name}";
|
||||
}
|
||||
|
||||
private static IEnumerable<string> GetContainingTypeNames(INamedTypeSymbol type)
|
||||
{
|
||||
var stack = new Stack<string>();
|
||||
var current = type;
|
||||
while (current is not null)
|
||||
{
|
||||
stack.Push(current.Name);
|
||||
current = current.ContainingType;
|
||||
}
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
private sealed class CallGraphEdgeComparer : IEqualityComparer<CallGraphEdge>
|
||||
{
|
||||
public static readonly CallGraphEdgeComparer Instance = new();
|
||||
|
||||
Reference in New Issue
Block a user