From 8e6bd961e65dc06ac18c148c70fb1719f6cc10e7 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 1 Feb 2012 20:31:22 +0100 Subject: [PATCH] IDEA-80414 Java: selecting completion result fires WrongOffset assertion --- .../completion/ConstructorInsertHandler.java | 4 +-- .../completion/DefaultInsertHandler.java | 19 +++++++------ .../JavaClassNameInsertHandler.java | 17 +++-------- .../completion/JavaCompletionUtil.java | 28 +++++++++++-------- .../codeInsight/lookup/PsiTypeLookupItem.java | 8 ++---- 5 files changed, 34 insertions(+), 42 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java index fa4ec428ed86..450c16174c22 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java @@ -78,12 +78,12 @@ class ConstructorInsertHandler implements InsertHandler= 0) length = i; - final int newOffset = addImportForClass(file, startOffset, startOffset + length, aClass); - JavaCompletionUtil.shortenReference(file, newOffset); + addImportForClass(aClass, context, length); + JavaCompletionUtil.shortenReference(file, context.getStartOffset()); } else if (o instanceof PsiType){ PsiType type = ((PsiType)o).getDeepComponentType(); @@ -203,7 +202,7 @@ public class DefaultInsertHandler extends TemplateInsertHandler implements Clone PsiClass refClass = ((PsiClassType) type).resolve(); if (refClass != null){ int length = refClass.getName().length(); - addImportForClass(file, startOffset, startOffset + length, refClass); + addImportForClass(refClass, context, length); } } } @@ -213,14 +212,16 @@ public class DefaultInsertHandler extends TemplateInsertHandler implements Clone PsiClass aClass = method.getContainingClass(); if (aClass != null){ int length = method.getName().length(); - addImportForClass(file, startOffset, startOffset + length, aClass); + addImportForClass(aClass, context, length); } } } } - private static int addImportForClass(PsiFile file, int startOffset, int endOffset, PsiClass aClass) throws IncorrectOperationException { - return JavaCompletionUtil.insertClassReference(aClass, file, startOffset, endOffset); + private static void addImportForClass(PsiClass aClass, InsertionContext context, int nameLength) { + context.setTailOffset(JavaCompletionUtil.insertClassReference(aClass, context.getFile(), context.getStartOffset(), + context.getStartOffset() + nameLength)); + PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 12f1ec79ad7b..08ebb822cc10 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -19,8 +19,6 @@ import com.intellij.codeInsight.AutoPopupController; import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.diagnostic.LogMessageEx; -import com.intellij.diagnostic.errordialog.Attachment; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -90,8 +88,10 @@ class JavaClassNameInsertHandler implements InsertHandler= 0); - String docText = context.getDocument().getText(); - DefaultInsertHandler.addImportForItem(context, item); - if (context.getTailOffset() < 0) { - LOG.error(LogMessageEx.createEvent("Tail offset degraded after insertion", "start=" + context.getStartOffset(), - new Attachment(context.getFile().getViewProvider().getVirtualFile().getPath(), docText))); - } - - if (annotation) { // Check if someone inserts annotation class that require @ PsiElement elementAt = file.findElementAt(context.getStartOffset()); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index d876f0ad9ba8..c081d03ff391 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -429,7 +429,7 @@ public class JavaCompletionUtil { PsiMethodCallExpression call = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); boolean checkInitialized = parameters.getInvocationCount() <= 1 && call != null && PsiKeyword.SUPER.equals(call.getMethodExpression().getText()); - + final JavaCompletionProcessor processor = new JavaCompletionProcessor(element, elementFilter, checkAccess, checkInitialized, filterStaticAfterInstance, nameCondition); javaReference.processVariants(processor); final Collection plainResults = processor.getResults(); @@ -690,8 +690,8 @@ public class JavaCompletionUtil { return null; } - public static int insertClassReference(@NotNull PsiClass psiClass, @NotNull PsiFile file, int offset) { - return insertClassReference(psiClass, file, offset, offset); + public static void insertClassReference(@NotNull PsiClass psiClass, @NotNull PsiFile file, int offset) { + insertClassReference(psiClass, file, offset, offset); } public static int insertClassReference(PsiClass psiClass, PsiFile file, int startOffset, int endOffset) { @@ -707,14 +707,14 @@ public class JavaCompletionUtil { final PsiElement resolved = reference.resolve(); if (resolved instanceof PsiClass) { if (((PsiClass)resolved).getQualifiedName() == null || manager.areElementsEquivalent(psiClass, resolved)) { - return startOffset; + return endOffset; } } } String name = psiClass.getName(); if (name == null) { - return startOffset; + return endOffset; } assert document != null; @@ -724,7 +724,7 @@ public class JavaCompletionUtil { PsiDocumentManager.getInstance(project).commitAllDocuments(); - int newStartOffset = startOffset; + int newEndOffset = endOffset; PsiElement element = file.findElementAt(startOffset); if (element instanceof PsiIdentifier) { PsiElement parent = element.getParent(); @@ -739,7 +739,13 @@ public class JavaCompletionUtil { newElement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement); if (newElement != null) { - newStartOffset = newElement.getTextRange().getStartOffset(); + newEndOffset = newElement.getTextRange().getEndOffset(); + if (newElement instanceof PsiJavaCodeReferenceElement) { + PsiReferenceParameterList parameterList = ((PsiJavaCodeReferenceElement)newElement).getParameterList(); + if (parameterList != null) { + newEndOffset = parameterList.getTextRange().getStartOffset(); + } + } } if (!staticImport && @@ -747,7 +753,7 @@ public class JavaCompletionUtil { !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference((PsiReference)newElement))) { final String qName = psiClass.getQualifiedName(); if (qName != null) { - document.replaceString(newStartOffset, newElement.getTextRange().getEndOffset(), qName); + document.replaceString(newElement.getTextRange().getStartOffset(), newEndOffset, qName); } } } @@ -758,7 +764,7 @@ public class JavaCompletionUtil { document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); } - return newStartOffset; + return newEndOffset; } @Nullable @@ -856,9 +862,7 @@ public class JavaCompletionUtil { //need to shorten references in type argument list public static void shortenReference(final PsiFile file, final int offset) throws IncorrectOperationException { final PsiDocumentManager manager = PsiDocumentManager.getInstance(file.getProject()); - final Document document = manager.getDocument(file); - assert document != null; - manager.commitDocument(document); + manager.commitDocument(manager.getDocument(file)); final PsiReference ref = file.findReferenceAt(offset); if (ref instanceof PsiJavaCodeReferenceElement) { JavaCodeStyleManager.getInstance(file.getProject()).shortenClassReferences((PsiJavaCodeReferenceElement)ref); diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index 18050b94b35c..47fca85f1d6a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -21,7 +21,6 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NonNls; @@ -73,14 +72,11 @@ public class PsiTypeLookupItem extends LookupItem { public void handleInsert(InsertionContext context) { PsiElement position = context.getFile().findElementAt(context.getStartOffset()); assert position != null; - context.getDocument().insertString(context.getTailOffset(), calcGenerics(position)); DefaultInsertHandler.addImportForItem(context, this); - PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(); + context.getDocument().insertString(context.getTailOffset(), calcGenerics(position)); + JavaCompletionUtil.shortenReference(context.getFile(), context.getStartOffset()); int tail = context.getTailOffset(); - if (tail <= 0) { - return; - } String braces = StringUtil.repeat("[]", getBracketsCount()); Editor editor = context.getEditor(); if (!braces.isEmpty()) {