generate: pass class context to correct resolve of param types (IDEA-53337)

This commit is contained in:
Anna Kozlova
2012-11-01 14:43:06 +01:00
parent 5bedb687c8
commit 6ec151fcdb
5 changed files with 37 additions and 11 deletions
@@ -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);