mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
create class from usage: setup generics params as it is done for create from new ( IDEA-43214)
This commit is contained in:
+1
-13
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+32
-3
@@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -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) {
|
||||
|
||||
+2
@@ -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) {
|
||||
|
||||
+4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user