IDEA-53883 Anonymous classes and Ctrl+Shift+Space completion may cause IDE Fatal error

This commit is contained in:
peter.gromov
2010-11-19 19:32:57 +03:00
parent 99681d7117
commit 8bade670b0
4 changed files with 59 additions and 23 deletions

View File

@@ -99,41 +99,35 @@ class ConstructorInsertHandler implements InsertHandler<LookupElementDecorator<L
JavaCompletionUtil.insertParentheses(context, delegate, false, hasParams);
}
private static Runnable generateAnonymousBody(final Editor editor, PsiFile file) {
private static Runnable generateAnonymousBody(final Editor editor, final PsiFile file) {
final Project project = file.getProject();
PsiDocumentManager.getInstance(project).commitAllDocuments();
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);
if (element == null) return null;
if (element.getParent() instanceof PsiAnonymousClass){
try{
CodeStyleManager.getInstance(project).reformat(element.getParent());
}
catch(IncorrectOperationException e){
LOG.error(e);
}
offset = element.getParent().getTextRange().getEndOffset() - 1;
editor.getCaretModel().moveToOffset(offset);
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
editor.getSelectionModel().removeSelection();
PsiElement parent = element.getParent();
if (!(parent instanceof PsiAnonymousClass)) return null;
try{
CodeStyleManager.getInstance(project).reformat(parent);
}
final SmartPsiElementPointer<PsiElement> pointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(element);
catch(IncorrectOperationException e){
LOG.error(e);
}
offset = parent.getTextRange().getEndOffset() - 1;
editor.getCaretModel().moveToOffset(offset);
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
editor.getSelectionModel().removeSelection();
return new Runnable() {
public void run(){
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
public void run() {
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
PsiElement element = pointer.getElement();
if (element == null) return;
while(true){
if (element instanceof PsiFile) return;
PsiElement parent = element.getParent();
if (parent instanceof PsiAnonymousClass) break;
element = parent;
}
final PsiAnonymousClass aClass = (PsiAnonymousClass)element.getParent();
final PsiAnonymousClass aClass = PsiTreeUtil.findElementOfClassAtOffset(file, editor.getCaretModel().getOffset(), PsiAnonymousClass.class, false);
if (aClass == null) return;
final Collection<CandidateInfo> candidatesToImplement = OverrideImplementUtil.getMethodsToOverrideImplement(aClass, true);
boolean invokeOverride = candidatesToImplement.isEmpty();

View File

@@ -0,0 +1,21 @@
import java.io.File;
import java.io.FilenameFilter;
class Intermediate {
{
new File(".").listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
<selection>return false; //To change body of implemented methods use File | Settings | File Templates.</selection>
}
})
SwingUtilities.invokeLater(new Runnable() {
public void run() {
}
});
}
}

View File

@@ -0,0 +1,15 @@
import java.io.File;
class Intermediate {
{
new File(".").listFiles(new FileFilter<caret>
SwingUtilities.invokeLater(new Runnable() {
public void run() {
}
});
}
}

View File

@@ -702,6 +702,12 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
checkResultByTestName();
}
public void testWrongAnonymous() throws Throwable {
configureByTestName();
select();
checkResultByTestName();
}
private void doAntiTest() throws Exception {
configureByTestName();
assertEmpty(myItems);