create class from usage: setup generics params as it is done for create from new ( IDEA-43214)

This commit is contained in:
anna
2011-03-11 15:04:05 +01:00
parent bc75f4be30
commit 066f5d8ce8
9 changed files with 65 additions and 17 deletions
@@ -67,7 +67,6 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
classReference.bindToElement(aClass);
}
setupInheritance(newExpression, aClass);
setupGenericParameters(newExpression, aClass);
PsiExpressionList argList = newExpression.getArgumentList();
Project project = aClass.getProject();
@@ -132,17 +131,6 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
return supConstructor;
}
private static void setupGenericParameters(PsiNewExpression expr, PsiClass targetClass) throws IncorrectOperationException {
PsiJavaCodeReferenceElement ref = getReferenceElement(expr);
int numParams = ref.getTypeParameters().length;
if (numParams == 0) return;
PsiElementFactory factory = JavaPsiFacade.getInstance(expr.getProject()).getElementFactory();
targetClass.getTypeParameterList().add(factory.createTypeParameterFromText("T", null));
for (int i = 2; i <= numParams; i++) {
targetClass.getTypeParameterList().add(factory.createTypeParameterFromText("T" + (i-1), null));
}
}
private static void setupInheritance(PsiNewExpression element, PsiClass targetClass) throws IncorrectOperationException {
if (element.getParent() instanceof PsiReferenceExpression) return;
@@ -227,7 +215,7 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
return QuickFixBundle.message("create.class.from.new.text", varName);
}
private static PsiJavaCodeReferenceElement getReferenceElement(PsiNewExpression expression) {
protected static PsiJavaCodeReferenceElement getReferenceElement(PsiNewExpression expression) {
return expression.getClassOrAnonymousClassReference();
}
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateEditingListener;
@@ -34,6 +35,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.ui.components.JBList;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
@@ -42,9 +44,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
/**
* @author Mike
@@ -337,4 +337,33 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction {
public boolean startInWriteAction() {
return false;
}
public static void setupGenericParameters(PsiClass targetClass, PsiJavaCodeReferenceElement ref) {
int numParams = ref.getTypeParameters().length;
if (numParams == 0) return;
final PsiElementFactory factory = JavaPsiFacade.getInstance(ref.getProject()).getElementFactory();
final Set<String> typeParamNames = new HashSet<String>();
for (PsiType type : ref.getTypeParameters()) {
final PsiClass psiClass = PsiUtil.resolveClassInType(type);
if (psiClass instanceof PsiTypeParameter) {
typeParamNames.add(psiClass.getName());
}
}
int idx = 0;
for (PsiType type : ref.getTypeParameters()) {
final PsiClass psiClass = PsiUtil.resolveClassInType(type);
if (psiClass instanceof PsiTypeParameter) {
targetClass.getTypeParameterList().add(factory.createTypeParameterFromText(psiClass.getName(), null));
} else {
while (true) {
final String paramName = idx > 0 ? "T" + idx : "T";
if (!typeParamNames.contains(paramName)) {
targetClass.getTypeParameterList().add(factory.createTypeParameterFromText(paramName, null));
break;
}
idx++;
}
}
}
}
}
@@ -283,6 +283,7 @@ public class CreateFromUsageUtils {
PsiClass result = classKind == INTERFACE ? elementFactory.createInterface(name) :
classKind == CLASS ? elementFactory.createClass(name) :
elementFactory.createEnum(name);
CreateFromUsageBaseFix.setupGenericParameters(result, referenceElement);
result = (PsiClass)manager.getCodeStyleManager().reformat(result);
return (PsiClass) psiClass.add(result);
}
@@ -399,7 +400,9 @@ public class CreateFromUsageUtils {
targetClass.getExtendsList() : targetClass.getImplementsList();
list.add(superClassReference);
}
if (contextElement instanceof PsiJavaCodeReferenceElement) {
CreateFromUsageBaseFix.setupGenericParameters(targetClass, (PsiJavaCodeReferenceElement)contextElement);
}
return targetClass;
}
catch (IncorrectOperationException e) {
@@ -58,6 +58,8 @@ public class CreateInnerClassFromNewFix extends CreateClassFromNewFix {
created = (PsiClass)targetClass.add(created);
setupClassFromNewExpression(created, newExpression);
setupGenericParameters(created, ref);
}
private static boolean isInThisOrSuperCall(PsiNewExpression newExpression) {
@@ -18,6 +18,8 @@ package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.CLASS;
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.INTERFACE;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.ide.util.PsiElementListCellRenderer;
import com.intellij.openapi.application.ApplicationManager;
@@ -28,6 +30,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.ui.components.JBList;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
@@ -146,6 +149,7 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
LOG.assertTrue(extendsList != null);
extendsList.add(superClass);
}
CreateClassFromNewFix.setupGenericParameters(created, ref);
created = (PsiClass)aClass.add(created);
ref.bindToElement(created);