private void annotateMethod(ExecutableElement methodElt, AnnotatedExecutableType methodType) {
    if (checker.isChecking() || methodType.isAnnotated()) {
      return;
    }
    // First annotate the receiver
    annotateThis(methodType.getReceiverType());

    // If it is from library
    if (checker.isFromLibrary(methodElt)) {
      Set<AnnotationMirror> set = AnnotationUtils.createAnnotationSet();
      set.add(checker.PEER);
      annotateConstants(methodType, set);
    }
    // methodType.isAnnotated() only checks the annotations on methodType,
    // but not the type of its receiver, parameters or return;
    if (!methodType.isAnnotated()) methodType.addAnnotation(checker.BOTTOM);
  }
    @Override
    public Void visitExecutable(AnnotatedExecutableType t, ElementKind p) {
      // The following lines are from super class, except adding the
      // traverse of the receiver
      scan(t.getReceiverType(), p);
      scan(t.getReturnType(), p);
      scanAndReduce(t.getParameterTypes(), p, null);
      scanAndReduce(t.getThrownTypes(), p, null);
      scanAndReduce(t.getTypeVariables(), p, null);

      ExecutableElement elt = t.getElement();
      annotateMethod(elt, t);
      return null;
    }
 @Override
 public final R visitExecutable(AnnotatedExecutableType type, AnnotatedTypeMirror p) {
   assert p instanceof AnnotatedExecutableType : p;
   AnnotatedExecutableType ex = (AnnotatedExecutableType) p;
   R r = scan(type.getReturnType(), ex.getReturnType());
   r = scanAndReduce(type.getReceiverType(), ex.getReceiverType(), r);
   r = scanAndReduce(type.getParameterTypes(), ex.getParameterTypes(), r);
   r = scanAndReduce(type.getThrownTypes(), ex.getThrownTypes(), r);
   r = scanAndReduce(type.getTypeVariables(), ex.getTypeVariables(), r);
   return r;
 }