code: @Override
      public R visitType(TypeElement e, P p) {
          ElementKind k = e.getKind();
          switch(k) {
          case ANNOTATION_TYPE:
              return visitTypeAsAnnotationType(e, p);
  
          case CLASS:
              return visitTypeAsClass(e, p);
  
          case ENUM:
              return visitTypeAsEnum(e, p);
  
          case INTERFACE:
              return visitTypeAsInterface(e, p);
  
          default:
              throw new AssertionError("Bad kind " + k + " for TypeElement" + e);
          }
      }
docs: Visits a type element, dispatching to the visit method for the
  specific {@linkplain ElementKind kind} of type, {@code
  ANNOTATION_TYPE}, {@code CLASS}, {@code ENUM}, or {@code
  INTERFACE}.
  
  @param e {@inheritDoc}
  @param p {@inheritDoc}
  @return  the result of the kind-specific visit method