code: private <T extends Element> void mapTypeParameters(final Map<TypeElement, List<T>> map,
              Element element, final T holder) {
  
          SimpleElementVisitor9<Void, Void> elementVisitor
                  = new SimpleElementVisitor9<Void, Void>() {
  
                      private void addParameters(TypeParameterElement e) {
                          for (TypeMirror type : utils.getBounds(e)) {
                              addTypeParameterToMap(map, type, holder);
                          }
                      }
  
                      @Override
                      public Void visitType(TypeElement e, Void p) {
                          for (TypeParameterElement param : e.getTypeParameters()) {
                              addParameters(param);
                          }
                          return null;
                      }
  
                      @Override
                      public Void visitExecutable(ExecutableElement e, Void p) {
                          for (TypeParameterElement param : e.getTypeParameters()) {
                              addParameters(param);
                          }
                          return null;
                      }
  
                      @Override
                      protected Void defaultAction(Element e, Void p) {
                          mapTypeParameters(map, e.asType(), holder);
                          return null;
                      }
  
                      @Override
                      public Void visitTypeParameter(TypeParameterElement e, Void p) {
                          addParameters(e);
                          return null;
                      }
                  };
          elementVisitor.visit(element);
      }
docs: Map the TypeElements to the members that use them as type parameters.
  
  @param map the map the insert the information into.
  @param element the te whose type parameters are being checked.
  @param holder the holder that owns the type parameters.