evaluate method
Evaluates the rule and returns derived facts.
Implementation
@override
List<Fact> evaluate(
Map<String, List<List<Object>>> facts,
Map<String, List<List<Object>>> derived,
) {
final result = <Fact>[];
final calls = facts['Call'] ?? [];
final pointsTo = getCombined('VarPointsTo', facts, derived);
for (final call in calls) {
final site = call[0];
final receiver = call[1];
final method = call[2];
// Static calls (receiver == -1) always resolve
if (receiver == -1) {
result.add(Fact('CallGraph', [site, method]));
continue;
}
// Instance calls only resolve if receiver points to something
for (final pt in pointsTo) {
if (pt[0] == receiver) {
result.add(Fact('CallGraph', [site, method]));
break; // One edge per call site
}
}
}
return result;
}