anchor.diff:    NullabilityNode get matchingNode => _matchingNodes.single;
   
     @override
  +  void matched(NullabilityNode node) {
  +    _matchingNodes.add(node);
  +  }
  +
  +  @override
     bool matches(NullabilityNode node) {
  -    _matchingNodes.add(node);
       return true;
     }
   }
  
positive.code:   final NullabilityNode _expectation;
  
    _ExactNodeMatcher(this._expectation);
  
    @override
    bool matches(NullabilityNode node) => node == _expectation;
  
negative.code:   List<NullabilityEdge> getEdges(Object source, Object destination) {
      var sourceMatcher = NodeMatcher(source);
      var destinationMatcher = NodeMatcher(destination);
      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
  