substitute types before delegate

This commit is contained in:
anna
2012-02-15 19:38:42 +01:00
parent e5cc9881d3
commit e4b71ad72b
2 changed files with 19 additions and 14 deletions
@@ -61,7 +61,7 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
}
PsiDocumentManager.getInstance(project).commitAllDocuments();
final PsiElement target = chooseTarget(file, editor, project);
final PsiElementClassMember target = chooseTarget(file, editor, project);
if (target == null) return;
final PsiMethodMember[] candidates = chooseMethods(target, file, editor, project);
@@ -75,7 +75,7 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
List<PsiGenerationInfo<PsiMethod>> prototypes = new ArrayList<PsiGenerationInfo<PsiMethod>>(candidates.length);
for (PsiMethodMember candidate : candidates) {
prototypes.add(generateDelegatePrototype(candidate, target));
prototypes.add(generateDelegatePrototype(candidate, target.getElement()));
}
List<PsiGenerationInfo<PsiMethod>> results = GenerateMembersUtil.insertMembersAtOffset(file, offset, prototypes);
@@ -211,14 +211,14 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
}
@Nullable
private PsiMethodMember[] chooseMethods(PsiElement target, PsiFile file, Editor editor, Project project) {
private PsiMethodMember[] chooseMethods(PsiElementClassMember targetMember, PsiFile file, Editor editor, Project project) {
PsiClassType.ClassResolveResult resolveResult = null;
final PsiDocCommentOwner target = targetMember.getElement();
if (target instanceof PsiField) {
resolveResult = PsiUtil.resolveGenericsClassInType(((PsiField)target).getType());
resolveResult = PsiUtil.resolveGenericsClassInType(targetMember.getSubstitutor().substitute(((PsiField)target).getType()));
}
else if (target instanceof PsiMethod) {
resolveResult = PsiUtil.resolveGenericsClassInType(((PsiMethod)target).getReturnType());
resolveResult = PsiUtil.resolveGenericsClassInType(targetMember.getSubstitutor().substitute(((PsiMethod)target).getReturnType()));
}
if (resolveResult == null || resolveResult.getElement() == null) return null;
@@ -295,8 +295,7 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
}
@Nullable
private static PsiElement chooseTarget(PsiFile file, Editor editor, Project project) {
PsiElement target = null;
private static PsiElementClassMember chooseTarget(PsiFile file, Editor editor, Project project) {
final PsiElementClassMember[] targetElements = getTargetElements(file, editor);
if (targetElements == null || targetElements.length == 0) return null;
if (!ApplicationManager.getApplication().isUnitTestMode()) {
@@ -309,12 +308,12 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
final List<PsiElementClassMember> selectedElements = chooser.getSelectedElements();
if (selectedElements != null && selectedElements.size() > 0) target = selectedElements.get(0).getElement();
if (selectedElements != null && selectedElements.size() > 0) return selectedElements.get(0);
}
else {
target = targetElements[0].getElement();
return targetElements[0];
}
return target;
return null;
}
@Nullable
@@ -342,17 +341,19 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
for (PsiField field : fields) {
final PsiType type = field.getType();
if (helper.isAccessible(field, aClass, aClass) && type instanceof PsiClassType && !PsiTreeUtil.isAncestor(field, element, false)) {
result.add(new PsiFieldMember(field));
final PsiClass containingClass = field.getContainingClass();
result.add(new PsiFieldMember(field, TypeConversionUtil.getSuperClassSubstitutor(containingClass, aClass, PsiSubstitutor.EMPTY)));
}
}
final PsiMethod[] methods = aClass.getAllMethods();
for (PsiMethod method : methods) {
if (CommonClassNames.JAVA_LANG_OBJECT.equals(method.getContainingClass().getQualifiedName())) continue;
final PsiClass containingClass = method.getContainingClass();
if (CommonClassNames.JAVA_LANG_OBJECT.equals(containingClass.getQualifiedName())) continue;
final PsiType returnType = method.getReturnType();
if (returnType != null && PropertyUtil.isSimplePropertyGetter(method) && helper.isAccessible(method, aClass, aClass) &&
returnType instanceof PsiClassType && !PsiTreeUtil.isAncestor(method, element, false)) {
result.add(new PsiMethodMember(method));
result.add(new PsiMethodMember(method, TypeConversionUtil.getSuperClassSubstitutor( containingClass, aClass,PsiSubstitutor.EMPTY)));
}
}
@@ -30,6 +30,10 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements E
super(field, PsiFormatUtil.formatVariable(field, FIELD_OPTIONS, PsiSubstitutor.EMPTY));
}
public PsiFieldMember(PsiField psiMember, PsiSubstitutor substitutor) {
super(psiMember, substitutor, PsiFormatUtil.formatVariable(psiMember, FIELD_OPTIONS, PsiSubstitutor.EMPTY));
}
@Nullable
public PsiGenerationInfo generateGetter() {
PsiField field = getElement();