anchor.diff:      }
     }
   
  -  visitTypeParameterType(TypeParameterType node) {}
  +  void visitTypeParameterType(TypeParameterType node) {}
   
     /// Just treat a couple of whitelisted classes as having covariant type
     /// parameters.
  
positive.code:     }
    }
  
    visitCovariant(DartType type) => type?.accept(this);
  
    visitInvariant(DartType type) => shaker._invariantVisitor.visit(type);
  
    visitInvalidType(InvalidType node) {}
  
    visitDynamicType(DynamicType node) {
      // TODO(asgerf): Find a suitable model for untyped externals, e.g. track
      // them to the first type boundary.
    }
  
    visitVoidType(VoidType node) {}
  
    visitVectorType(VectorType node) {}
  
    visitInterfaceType(InterfaceType node) {
      if (isCovariant) {
        shaker._addInstantiatedExternalSubclass(node.classNode);
      }
  
negative.code:     }
    }
  
    void visitTypedefType(TypedefType node) {
      shaker.addUsedTypedef(node.typedefNode);
    }
  
    void visitFunctionType(FunctionType node) {
      visit(node.returnType);
      for (int i = 0; i < node.positionalParameters.length; ++i) {
        visitContravariant(node.positionalParameters[i]);
  