delegate anonymous class to final variable (IDEA-66149)

This commit is contained in:
anna
2011-03-22 11:49:40 +01:00
parent 5a5b95eb97
commit 44ec114e7b
2 changed files with 36 additions and 2 deletions
@@ -26,7 +26,10 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.controlFlow.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.scope.processor.VariablesProcessor;
import com.intellij.psi.scope.util.PsiScopesUtil;
import com.intellij.psi.util.*;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashMap;
@@ -293,7 +296,7 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);
if (element == null) return null;
PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
final PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (aClass == null) return null;
List<PsiElementClassMember> result = new ArrayList<PsiElementClassMember>();
@@ -317,6 +320,34 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
}
}
if (aClass instanceof PsiAnonymousClass) {
VariablesProcessor proc = new VariablesProcessor(false) {
@Override
protected boolean check(PsiVariable var, ResolveState state) {
return var.hasModifierProperty(PsiModifier.FINAL) && var instanceof PsiLocalVariable || var instanceof PsiParameter;
}
};
PsiElement scope = aClass;
while (scope != null) {
if (scope instanceof PsiFile || scope instanceof PsiMethod || scope instanceof PsiClassInitializer) break;
scope = scope.getParent();
}
if (scope != null) {
PsiScopesUtil.treeWalkUp(proc, aClass, scope);
for (int i = 0; i < proc.size(); i++) {
final PsiVariable psiVariable = proc.getResult(i);
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(aClass.getProject());
result.add(new PsiFieldMember(elementFactory.createField(psiVariable.getName(), psiVariable.getType())) {
@Override
protected PsiClass getContainingClass() {
return aClass;
}
});
}
}
}
return result.toArray(new PsiElementClassMember[result.size()]);
}
@@ -47,9 +47,12 @@ public abstract class PsiElementClassMember<T extends PsiDocCommentOwner> extend
}
public MemberChooserObject getParentNodeDelegate() {
final PsiClass psiClass = myPsiMember.getContainingClass();
final PsiClass psiClass = getContainingClass();
final String text = PsiFormatUtil.formatClass(psiClass, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_FQ_NAME);
return new PsiDocCommentOwnerMemberChooserObject(psiClass, text, psiClass.getIcon(0));
}
protected PsiClass getContainingClass() {
return myPsiMember.getContainingClass();
}
}