anchor.diff:    List<NullabilityEdge> getEdges(Object source, Object destination) {
       var sourceMatcher = NodeMatcher(source);
       var destinationMatcher = NodeMatcher(destination);
  -    return graph
  -        .getAllEdges()
  -        .where((e) =>
  -            sourceMatcher.matches(e.sourceNode) &&
  -            destinationMatcher.matches(e.destinationNode))
  -        .toList();
  +    var result = <NullabilityEdge>[];
  +    for (var edge in graph.getAllEdges()) {
  +      if (sourceMatcher.matches(edge.sourceNode) &&
  +          destinationMatcher.matches(edge.destinationNode)) {
  +        sourceMatcher.matched(edge.sourceNode);
  +        destinationMatcher.matched(edge.destinationNode);
  +        result.add(edge);
  +      }
  +    }
  +    return result;
     }
   
     /// Creates a [NodeMatcher] matching a substitution node whose inner and outer
  
positive.code:         'Unclear how to match node expectation of type ${expectation.runtimeType}');
    }
  
    bool matches(NullabilityNode node);
  }
  
  
negative.code:   _SubstitutionNodeMatcher(this.inner, this.outer);
  
    @override
    void matched(NullabilityNode node) {
      if (node is NullabilityNodeForSubstitution) {
        inner.matched(node.innerNode);
        outer.matched(node.outerNode);
      } else {
        throw StateError(
            'matched should only be called on nodes for which matches returned '
            'true');
      }
    }
  
    @override
    bool matches(NullabilityNode node) {
      return node is NullabilityNodeForSubstitution &&
          inner.matches(node.innerNode) &&
  