evaluate method

  1. @override
List<Fact> evaluate(
  1. Map<String, List<List<Object>>> facts,
  2. Map<String, List<List<Object>>> derived
)
override

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;
}