mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
delegate anonymous class to final variable (IDEA-66149)
This commit is contained in:
+32
-1
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user