mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
generate: pass class context to correct resolve of param types (IDEA-53337)
This commit is contained in:
+4
-4
@@ -218,8 +218,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
|
||||
JVMElementFactory factory = JVMElementFactories.requireFactory(aClass.getLanguage(), aClass.getProject());
|
||||
CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject());
|
||||
|
||||
PsiMethod constructor = factory.createConstructor();
|
||||
constructor.setName(aClass.getName());
|
||||
PsiMethod constructor = factory.createMethodFromText(aClass.getName() + "() {}", aClass);
|
||||
String modifier = getConstructorModifier(aClass);
|
||||
if (modifier != null) {
|
||||
PsiUtil.setModifierProperty(constructor, modifier, true);
|
||||
@@ -251,7 +250,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
|
||||
}
|
||||
PsiParameter[] params = baseConstructor.getParameterList().getParameters();
|
||||
for (PsiParameter param : params) {
|
||||
PsiParameter newParam = factory.createParameter(param.getName(), param.getType());
|
||||
PsiParameter newParam = factory.createParameter(param.getName(), param.getType(), aClass);
|
||||
GenerateMembersUtil.copyOrReplaceModifierList(param, newParam);
|
||||
constructor.getParameterList().add(newParam);
|
||||
}
|
||||
@@ -260,12 +259,13 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
|
||||
|
||||
JavaCodeStyleManager javaStyle = JavaCodeStyleManager.getInstance(aClass.getProject());
|
||||
|
||||
final PsiMethod dummyConstructor = factory.createMethodFromText(constructor.getText(), null);
|
||||
List<PsiParameter> fieldParams = new ArrayList<PsiParameter>();
|
||||
for (PsiField field : fields) {
|
||||
String fieldName = field.getName();
|
||||
String name = javaStyle.variableNameToPropertyName(fieldName, VariableKind.FIELD);
|
||||
String parmName = javaStyle.propertyNameToVariableName(name, VariableKind.PARAMETER);
|
||||
parmName = javaStyle.suggestUniqueVariableName(parmName, constructor, true);
|
||||
parmName = javaStyle.suggestUniqueVariableName(parmName, dummyConstructor, true);
|
||||
PsiParameter parm = factory.createParameter(parmName, field.getType());
|
||||
|
||||
final NullableNotNullManager nullableManager = NullableNotNullManager.getInstance(field.getProject());
|
||||
|
||||
@@ -235,13 +235,13 @@ public class GenerateMembersUtil {
|
||||
final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
|
||||
|
||||
try {
|
||||
final PsiMethod resultMethod = createMethod(factory, sourceMethod);
|
||||
final PsiMethod resultMethod = createMethod(factory, sourceMethod, target);
|
||||
copyDocComment(sourceMethod, resultMethod);
|
||||
copyModifiers(sourceMethod.getModifierList(), resultMethod.getModifierList());
|
||||
final PsiSubstitutor collisionResolvedSubstitutor =
|
||||
substituteTypeParameters(factory, target, sourceMethod.getTypeParameterList(), resultMethod.getTypeParameterList(), substitutor);
|
||||
substituteReturnType(PsiManager.getInstance(project), resultMethod, sourceMethod.getReturnType(), collisionResolvedSubstitutor);
|
||||
substituteParameters(factory, codeStyleManager, sourceMethod.getParameterList(), resultMethod.getParameterList(), collisionResolvedSubstitutor);
|
||||
substituteParameters(factory, codeStyleManager, sourceMethod.getParameterList(), resultMethod.getParameterList(), collisionResolvedSubstitutor, target);
|
||||
substituteThrows(factory, sourceMethod.getThrowsList(), resultMethod.getThrowsList(), collisionResolvedSubstitutor);
|
||||
return resultMethod;
|
||||
}
|
||||
@@ -344,7 +344,7 @@ public class GenerateMembersUtil {
|
||||
@NotNull JavaCodeStyleManager codeStyleManager,
|
||||
@NotNull PsiParameterList sourceParameterList,
|
||||
@NotNull PsiParameterList targetParameterList,
|
||||
@NotNull PsiSubstitutor substitutor) {
|
||||
@NotNull PsiSubstitutor substitutor, PsiElement target) {
|
||||
PsiParameter[] parameters = sourceParameterList.getParameters();
|
||||
UniqueNameGenerator generator = new UniqueNameGenerator();
|
||||
for (int i = 0; i < parameters.length; i++) {
|
||||
@@ -367,7 +367,7 @@ public class GenerateMembersUtil {
|
||||
|
||||
if (paramName == null) paramName = "p" + i;
|
||||
generator.addExistingName(paramName);
|
||||
final PsiParameter newParameter = factory.createParameter(paramName, substituted);
|
||||
final PsiParameter newParameter = factory.createParameter(paramName, substituted, target);
|
||||
copyOrReplaceModifierList(parameter, newParameter);
|
||||
targetParameterList.add(newParameter);
|
||||
}
|
||||
@@ -392,11 +392,11 @@ public class GenerateMembersUtil {
|
||||
|
||||
@NotNull
|
||||
private static PsiMethod createMethod(@NotNull JVMElementFactory factory,
|
||||
@NotNull PsiMethod method) {
|
||||
@NotNull PsiMethod method, PsiElement target) {
|
||||
if (method.isConstructor()) {
|
||||
return factory.createConstructor(method.getName());
|
||||
return factory.createMethodFromText(method.getName() + "(){}", target);
|
||||
}
|
||||
return factory.createMethod(method.getName(), PsiType.VOID);
|
||||
return factory.createMethodFromText("void " + method.getName() + "(){}", target);
|
||||
}
|
||||
|
||||
private static void substituteReturnType(@NotNull PsiManager manager,
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
class Parent<T> {
|
||||
T field;
|
||||
|
||||
public Parent(T field) {
|
||||
this.field = field;
|
||||
}
|
||||
}
|
||||
|
||||
class Child<Integer> extends Parent<Integer> {
|
||||
Child(Integer field) {
|
||||
super(field);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
class Parent<T> {
|
||||
T field;
|
||||
|
||||
public Parent(T field) {
|
||||
this.field = field;
|
||||
}
|
||||
}
|
||||
|
||||
class Child<Integer> extends Parent<Integer> {
|
||||
<caret>
|
||||
|
||||
}
|
||||
@@ -48,6 +48,7 @@ public class GenerateConstructorTest extends LightCodeInsightTestCase {
|
||||
}
|
||||
|
||||
public void testFinalFieldPreselection() throws Exception { doTest(true); }
|
||||
public void testSubstitution() throws Exception { doTest(true); }
|
||||
|
||||
private void doTest() throws Exception {
|
||||
doTest(false);
|
||||
|
||||
Reference in New Issue
Block a user