save progress

This commit is contained in:
StellaOps Bot
2025-12-18 09:10:36 +02:00
parent b4235c134c
commit 28823a8960
169 changed files with 11995 additions and 449 deletions

View File

@@ -113,7 +113,9 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
SymbolDigest = GetString(edgeElement, "symbol_digest", "symbolDigest"),
Candidates = GetStringArray(edgeElement, "candidates"),
Confidence = GetNullableDouble(edgeElement, "confidence"),
Evidence = GetStringArray(edgeElement, "evidence")
Evidence = GetStringArray(edgeElement, "evidence"),
Gates = ParseGates(edgeElement),
GateMultiplierBps = GetNullableInt(edgeElement, "gate_multiplier_bps", "gateMultiplierBps") ?? 10000
});
}
}
@@ -212,7 +214,9 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
SymbolDigest = GetString(edgeElement, "symbol_digest", "symbolDigest"),
Candidates = GetStringArray(edgeElement, "candidates"),
Confidence = GetNullableDouble(edgeElement, "confidence"),
Evidence = GetStringArray(edgeElement, "evidence")
Evidence = GetStringArray(edgeElement, "evidence"),
Gates = ParseGates(edgeElement),
GateMultiplierBps = GetNullableInt(edgeElement, "gate_multiplier_bps", "gateMultiplierBps") ?? 10000
});
}
}
@@ -285,7 +289,9 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
SymbolDigest = GetString(edgeElement, "symbol_digest", "symbolDigest"),
Candidates = GetStringArray(edgeElement, "candidates"),
Confidence = GetNullableDouble(edgeElement, "confidence"),
Evidence = GetStringArray(edgeElement, "evidence")
Evidence = GetStringArray(edgeElement, "evidence"),
Gates = ParseGates(edgeElement),
GateMultiplierBps = GetNullableInt(edgeElement, "gate_multiplier_bps", "gateMultiplierBps") ?? 10000
});
}
@@ -434,4 +440,73 @@ public sealed class SimpleJsonCallgraphParser : ICallgraphParser
};
}
private static int? GetNullableInt(JsonElement element, string name1, string? name2 = null)
{
if (element.TryGetProperty(name1, out var v1) && v1.ValueKind == JsonValueKind.Number && v1.TryGetInt32(out var i1))
{
return i1;
}
if (!string.IsNullOrEmpty(name2)
&& element.TryGetProperty(name2!, out var v2)
&& v2.ValueKind == JsonValueKind.Number
&& v2.TryGetInt32(out var i2))
{
return i2;
}
return null;
}
private static IReadOnlyList<CallgraphGate>? ParseGates(JsonElement edgeElement)
{
if (!edgeElement.TryGetProperty("gates", out var gatesEl) || gatesEl.ValueKind != JsonValueKind.Array)
{
return null;
}
var gates = new List<CallgraphGate>(gatesEl.GetArrayLength());
foreach (var gateEl in gatesEl.EnumerateArray())
{
if (gateEl.ValueKind != JsonValueKind.Object)
{
continue;
}
var typeRaw = GetString(gateEl, "type");
if (!TryParseGateType(typeRaw, out var gateType))
{
continue;
}
gates.Add(new CallgraphGate
{
Type = gateType,
Detail = GetString(gateEl, "detail") ?? string.Empty,
GuardSymbol = GetString(gateEl, "guard_symbol", "guardSymbol") ?? string.Empty,
SourceFile = GetString(gateEl, "source_file", "sourceFile"),
LineNumber = GetNullableInt(gateEl, "line_number", "lineNumber"),
Confidence = GetNullableDouble(gateEl, "confidence") ?? 1.0,
DetectionMethod = GetString(gateEl, "detection_method", "detectionMethod") ?? string.Empty
});
}
return gates.Count == 0 ? null : gates;
}
private static bool TryParseGateType(string? raw, out CallgraphGateType gateType)
{
gateType = default;
if (string.IsNullOrWhiteSpace(raw))
{
return false;
}
var normalized = raw.Trim()
.Replace("_", string.Empty, StringComparison.Ordinal)
.Replace("-", string.Empty, StringComparison.Ordinal);
return Enum.TryParse(normalized, ignoreCase: true, out gateType);
}
}