up
This commit is contained in:
@@ -44,6 +44,11 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
return schemaResult;
|
||||
}
|
||||
|
||||
if (TryParseFlatGraph(root, out var flatResult))
|
||||
{
|
||||
return flatResult;
|
||||
}
|
||||
|
||||
throw new CallgraphParserValidationException("Callgraph artifact payload is empty or missing required fields.");
|
||||
}
|
||||
|
||||
@@ -68,20 +73,22 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
throw new CallgraphParserValidationException("Callgraph node is missing an id.");
|
||||
}
|
||||
|
||||
nodes.Add(new CallgraphNode(
|
||||
Id: id.Trim(),
|
||||
Name: nodeElement.TryGetProperty("name", out var nameEl) ? nameEl.GetString() ?? id.Trim() : id.Trim(),
|
||||
Kind: nodeElement.TryGetProperty("kind", out var kindEl) ? kindEl.GetString() ?? "function" : "function",
|
||||
Namespace: nodeElement.TryGetProperty("namespace", out var nsEl) ? nsEl.GetString() : null,
|
||||
File: nodeElement.TryGetProperty("file", out var fileEl) ? fileEl.GetString() : null,
|
||||
Line: nodeElement.TryGetProperty("line", out var lineEl) && lineEl.ValueKind == JsonValueKind.Number ? lineEl.GetInt32() : null,
|
||||
Purl: GetString(nodeElement, "purl"),
|
||||
SymbolDigest: GetString(nodeElement, "symbol_digest", "symbolDigest"),
|
||||
BuildId: GetString(nodeElement, "build_id", "buildId"),
|
||||
Language: GetString(nodeElement, "language"),
|
||||
Evidence: GetStringArray(nodeElement, "evidence"),
|
||||
Analyzer: GetStringDictionary(nodeElement, "analyzer"),
|
||||
CodeId: GetString(nodeElement, "code_id", "codeId")));
|
||||
nodes.Add(new CallgraphNode
|
||||
{
|
||||
Id = id.Trim(),
|
||||
Name = nodeElement.TryGetProperty("name", out var nameEl) ? nameEl.GetString() ?? id.Trim() : id.Trim(),
|
||||
Kind = nodeElement.TryGetProperty("kind", out var kindEl) ? kindEl.GetString() ?? "function" : "function",
|
||||
Namespace = nodeElement.TryGetProperty("namespace", out var nsEl) ? nsEl.GetString() : null,
|
||||
File = nodeElement.TryGetProperty("file", out var fileEl) ? fileEl.GetString() : null,
|
||||
Line = nodeElement.TryGetProperty("line", out var lineEl) && lineEl.ValueKind == JsonValueKind.Number ? lineEl.GetInt32() : null,
|
||||
Purl = GetString(nodeElement, "purl"),
|
||||
SymbolDigest = GetString(nodeElement, "symbol_digest", "symbolDigest"),
|
||||
BuildId = GetString(nodeElement, "build_id", "buildId"),
|
||||
Language = GetString(nodeElement, "language"),
|
||||
Evidence = GetStringArray(nodeElement, "evidence"),
|
||||
Analyzer = GetStringDictionary(nodeElement, "analyzer"),
|
||||
CodeId = GetString(nodeElement, "code_id", "codeId")
|
||||
});
|
||||
}
|
||||
|
||||
var edges = new List<CallgraphEdge>();
|
||||
@@ -97,15 +104,17 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
}
|
||||
|
||||
var type = edgeElement.TryGetProperty("type", out var typeEl) ? typeEl.GetString() ?? "call" : "call";
|
||||
edges.Add(new CallgraphEdge(
|
||||
source.Trim(),
|
||||
target.Trim(),
|
||||
type,
|
||||
Purl: GetString(edgeElement, "purl"),
|
||||
SymbolDigest: GetString(edgeElement, "symbol_digest", "symbolDigest"),
|
||||
Candidates: GetStringArray(edgeElement, "candidates"),
|
||||
Confidence: GetNullableDouble(edgeElement, "confidence"),
|
||||
Evidence: GetStringArray(edgeElement, "evidence")));
|
||||
edges.Add(new CallgraphEdge
|
||||
{
|
||||
SourceId = source.Trim(),
|
||||
TargetId = target.Trim(),
|
||||
Type = type,
|
||||
Purl = GetString(edgeElement, "purl"),
|
||||
SymbolDigest = GetString(edgeElement, "symbol_digest", "symbolDigest"),
|
||||
Candidates = GetStringArray(edgeElement, "candidates"),
|
||||
Confidence = GetNullableDouble(edgeElement, "confidence"),
|
||||
Evidence = GetStringArray(edgeElement, "evidence")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,15 +126,18 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
? schemaEl.GetString()
|
||||
: formatVersion;
|
||||
|
||||
var roots = ParseRoots(root);
|
||||
var entrypoints = ParseEntrypoints(root);
|
||||
var analyzer = GetStringDictionary(root, "analyzer") ?? GetStringDictionary(root, "toolchain");
|
||||
|
||||
result = new CallgraphParseResult(
|
||||
nodes,
|
||||
edges,
|
||||
Array.Empty<CallgraphRoot>(),
|
||||
roots,
|
||||
string.IsNullOrWhiteSpace(formatVersion) ? "1.0" : formatVersion!.Trim(),
|
||||
string.IsNullOrWhiteSpace(schemaVersion) ? "1.0" : schemaVersion!.Trim(),
|
||||
analyzer);
|
||||
analyzer,
|
||||
entrypoints);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -149,20 +161,22 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
throw new CallgraphParserValidationException("Callgraph node is missing an id.");
|
||||
}
|
||||
|
||||
nodes.Add(new CallgraphNode(
|
||||
Id: id.Trim(),
|
||||
Name: nodeElement.TryGetProperty("name", out var nameEl) ? nameEl.GetString() ?? id.Trim() : id.Trim(),
|
||||
Kind: nodeElement.TryGetProperty("kind", out var kindEl) ? kindEl.GetString() ?? "function" : "function",
|
||||
Namespace: nodeElement.TryGetProperty("namespace", out var nsEl) ? nsEl.GetString() : null,
|
||||
File: nodeElement.TryGetProperty("file", out var fileEl) ? fileEl.GetString() : null,
|
||||
Line: nodeElement.TryGetProperty("line", out var lineEl) && lineEl.ValueKind == JsonValueKind.Number ? lineEl.GetInt32() : null,
|
||||
Purl: GetString(nodeElement, "purl"),
|
||||
SymbolDigest: GetString(nodeElement, "symbol_digest", "symbolDigest"),
|
||||
BuildId: GetString(nodeElement, "build_id", "buildId"),
|
||||
Language: GetString(nodeElement, "language"),
|
||||
Evidence: GetStringArray(nodeElement, "evidence"),
|
||||
Analyzer: GetStringDictionary(nodeElement, "analyzer"),
|
||||
CodeId: GetString(nodeElement, "code_id", "codeId")));
|
||||
nodes.Add(new CallgraphNode
|
||||
{
|
||||
Id = id.Trim(),
|
||||
Name = nodeElement.TryGetProperty("name", out var nameEl) ? nameEl.GetString() ?? id.Trim() : id.Trim(),
|
||||
Kind = nodeElement.TryGetProperty("kind", out var kindEl) ? kindEl.GetString() ?? "function" : "function",
|
||||
Namespace = nodeElement.TryGetProperty("namespace", out var nsEl) ? nsEl.GetString() : null,
|
||||
File = nodeElement.TryGetProperty("file", out var fileEl) ? fileEl.GetString() : null,
|
||||
Line = nodeElement.TryGetProperty("line", out var lineEl) && lineEl.ValueKind == JsonValueKind.Number ? lineEl.GetInt32() : null,
|
||||
Purl = GetString(nodeElement, "purl"),
|
||||
SymbolDigest = GetString(nodeElement, "symbol_digest", "symbolDigest"),
|
||||
BuildId = GetString(nodeElement, "build_id", "buildId"),
|
||||
Language = GetString(nodeElement, "language"),
|
||||
Evidence = GetStringArray(nodeElement, "evidence"),
|
||||
Analyzer = GetStringDictionary(nodeElement, "analyzer"),
|
||||
CodeId = GetString(nodeElement, "code_id", "codeId")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,15 +203,17 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
? typeEl.GetString() ?? "call"
|
||||
: "call";
|
||||
|
||||
edges.Add(new CallgraphEdge(
|
||||
from.Trim(),
|
||||
to.Trim(),
|
||||
kind,
|
||||
Purl: GetString(edgeElement, "purl"),
|
||||
SymbolDigest: GetString(edgeElement, "symbol_digest", "symbolDigest"),
|
||||
Candidates: GetStringArray(edgeElement, "candidates"),
|
||||
Confidence: GetNullableDouble(edgeElement, "confidence"),
|
||||
Evidence: GetStringArray(edgeElement, "evidence")));
|
||||
edges.Add(new CallgraphEdge
|
||||
{
|
||||
SourceId = from.Trim(),
|
||||
TargetId = to.Trim(),
|
||||
Type = kind,
|
||||
Purl = GetString(edgeElement, "purl"),
|
||||
SymbolDigest = GetString(edgeElement, "symbol_digest", "symbolDigest"),
|
||||
Candidates = GetStringArray(edgeElement, "candidates"),
|
||||
Confidence = GetNullableDouble(edgeElement, "confidence"),
|
||||
Evidence = GetStringArray(edgeElement, "evidence")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,7 +229,7 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
|
||||
|
||||
foreach (var nodeId in uniqueNodeIds)
|
||||
{
|
||||
nodes.Add(new CallgraphNode(nodeId, nodeId, "function", null, null, null, null, null, null, null, null, null, null));
|
||||
nodes.Add(new CallgraphNode { Id = nodeId, Name = nodeId, Kind = "function" });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user