@NotNull
  @Override
  public PsiTypeParameter createTypeParameter(String name, PsiClassType[] superTypes) {
    @NonNls StringBuilder builder = new StringBuilder();
    builder.append("public <").append(name);
    if (superTypes.length > 1
        || superTypes.length == 1
            && !superTypes[0].equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) {
      builder.append(" extends ");
      for (PsiClassType type : superTypes) {
        if (type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) continue;
        builder.append(type.getCanonicalText()).append('&');
      }

      builder.delete(builder.length() - 1, builder.length());
    }
    builder.append("> void foo(){}");
    try {
      return createMethodFromText(builder.toString(), null).getTypeParameters()[0];
    } catch (RuntimeException e) {
      throw new IncorrectOperationException("type parameter text: " + builder.toString());
    }
  }
 @NotNull
 @Override
 public PsiDocTag createParamTag(
     @NotNull final String parameterName, @NonNls final String description)
     throws IncorrectOperationException {
   @NonNls final StringBuilder builder = new StringBuilder();
   builder.append(" * @param ");
   builder.append(parameterName);
   builder.append(" ");
   final String[] strings = description.split("\\n");
   for (int i = 0; i < strings.length; i++) {
     if (i > 0) builder.append("\n * ");
     builder.append(strings[i]);
   }
   return createDocTagFromText(builder.toString());
 }
 @NotNull
 @Override
 public PsiReferenceList createReferenceList(
     @NotNull final PsiJavaCodeReferenceElement[] references) throws IncorrectOperationException {
   @NonNls final StringBuilder builder = new StringBuilder();
   builder.append("void method()");
   if (references.length > 0) {
     builder.append(" throws ");
     for (int i = 0; i < references.length; i++) {
       if (i > 0) builder.append(", ");
       builder.append(references[i].getCanonicalText());
     }
   }
   builder.append(';');
   return createMethodFromText(builder.toString(), null).getThrowsList();
 }
 @NotNull
 @Override
 public PsiParameterList createParameterList(
     @NotNull final String[] names, @NotNull final PsiType[] types)
     throws IncorrectOperationException {
   @NonNls StringBuilder builder = new StringBuilder();
   builder.append("void method(");
   for (int i = 0; i < names.length; i++) {
     if (i > 0) builder.append(", ");
     builder.append(types[i].getCanonicalText()).append(' ').append(names[i]);
   }
   builder.append(");");
   return createMethodFromText(builder.toString(), null).getParameterList();
 }