This commit is contained in:
StellaOps Bot
2025-12-14 23:20:14 +02:00
parent 3411e825cd
commit b058dbe031
356 changed files with 68310 additions and 1108 deletions

View File

@@ -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" });
}
}