code: static String getTypeString(DocEnv env, Type t, boolean full) {
          // TODO: should annotations be included here?
          if (t.isAnnotated()) {
              t = t.unannotatedType();
          }
          switch (t.getTag()) {
          case ARRAY:
              StringBuilder s = new StringBuilder();
              while (t.hasTag(ARRAY)) {
                  s.append("[]");
                  t = env.types.elemtype(t);
              }
              s.insert(0, getTypeString(env, t, full));
              return s.toString();
          case CLASS:
              return ParameterizedTypeImpl.
                          parameterizedTypeToString(env, (ClassType)t, full);
          case WILDCARD:
              Type.WildcardType a = (Type.WildcardType)t;
              return WildcardTypeImpl.wildcardTypeToString(env, a, full);
          default:
              return t.tsym.getQualifiedName().toString();
          }
      }
docs: Return the string representation of a type use.  Bounds of type
  variables are not included; bounds of wildcard types are.
  Class names are qualified if "full" is true.