save progress
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user