diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/codeInsight/completion')
5 files changed, 70 insertions, 23 deletions
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java index 4ff8ca2ec5f8..cbc9653b6adf 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -21,6 +21,7 @@ import com.intellij.diagnostic.AttachmentFactory; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.ClassConditionKey; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -38,6 +39,7 @@ import java.util.Set; * @author peter */ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement> implements TypedLookupItem { + public static final Key<Boolean> CHAIN_QUALIFIER = Key.create("CHAIN_QUALIFIER"); private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.JavaChainLookupElement"); public static final ClassConditionKey<JavaChainLookupElement> CLASS_CONDITION_KEY = ClassConditionKey.create(JavaChainLookupElement.class); private final LookupElement myQualifier; @@ -109,9 +111,12 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement public void handleInsert(InsertionContext context) { final Document document = context.getEditor().getDocument(); document.replaceString(context.getStartOffset(), context.getTailOffset(), ";"); + myQualifier.putUserData(CHAIN_QUALIFIER, true); final InsertionContext qualifierContext = CompletionUtil.emulateInsertion(context, context.getStartOffset(), myQualifier); OffsetKey oldStart = context.trackOffset(context.getStartOffset(), false); + PsiDocumentManager.getInstance(context.getProject()).doPostponedOperationsAndUnblockDocument(document); + int start = CharArrayUtil.shiftForward(context.getDocument().getCharsSequence(), context.getStartOffset(), " \t\n"); if (shouldParenthesizeQualifier(context.getFile(), start, qualifierContext.getTailOffset())) { final String space = CodeStyleSettingsManager.getSettings(qualifierContext.getProject()).SPACE_WITHIN_PARENTHESES ? " " : ""; @@ -165,6 +170,7 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement if (expr instanceof PsiJavaCodeReferenceElement || expr instanceof PsiMethodCallExpression || + expr instanceof PsiNewExpression || expr instanceof PsiArrayAccessExpression) { return false; } 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 be6d8146ce3d..f5a8253ab5ab 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -98,7 +98,8 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE context.setTailOffset(context.getOffset(refEnd)); context.commitDocument(); - if (shouldInsertParentheses(file.findElementAt(context.getTailOffset() - 1))) { + if (item.getUserData(JavaChainLookupElement.CHAIN_QUALIFIER) == null && + shouldInsertParentheses(file.findElementAt(context.getTailOffset() - 1))) { if (ConstructorInsertHandler.insertParentheses(context, item, psiClass, false)) { fillTypeArgs |= psiClass.hasTypeParameters() && PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_5); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 7310227a80f0..fba10a633432 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -426,7 +426,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (JavaCompletionData.isAfterPrimitiveOrArrayType(position)) { return false; } - + return true; } @@ -466,11 +466,11 @@ public class JavaCompletionContributor extends CompletionContributor { methods: for (PsiMethod method : annoClass.getMethods()) { if (!(method instanceof PsiAnnotationMethod)) continue; - + final String attrName = method.getName(); for (PsiNameValuePair existingAttr : existingPairs) { if (PsiTreeUtil.isAncestor(existingAttr, insertedElement, false)) break; - if (Comparing.equal(existingAttr.getName(), attrName) || + if (Comparing.equal(existingAttr.getName(), attrName) || PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals(attrName) && existingAttr.getName() == null) continue methods; } LookupElementBuilder element = LookupElementBuilder.createWithIcon(method).withInsertHandler(new InsertHandler<LookupElement>() { @@ -479,7 +479,7 @@ public class JavaCompletionContributor extends CompletionContributor { final Editor editor = context.getEditor(); TailType.EQ.processTail(editor, editor.getCaretModel().getOffset()); context.setAddCompletionChar(false); - + context.commitDocument(); PsiAnnotationParameterList paramList = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiAnnotationParameterList.class, false); @@ -644,7 +644,20 @@ public class JavaCompletionContributor extends CompletionContributor { if (file instanceof PsiJavaFile) { if (context.getInvocationCount() > 0) { autoImport(file, context.getStartOffset() - 1, context.getEditor()); - PsiDocumentManager.getInstance(context.getProject()).commitDocument(context.getEditor().getDocument()); + + PsiElement leaf = file.findElementAt(context.getStartOffset() - 1); + if (leaf != null) leaf = PsiTreeUtil.prevVisibleLeaf(leaf); + + PsiVariable variable = PsiTreeUtil.getParentOfType(leaf, PsiVariable.class); + if (variable != null) { + PsiTypeElement typeElement = variable.getTypeElement(); + if (typeElement != null) { + PsiType type = typeElement.getType(); + if (type instanceof PsiClassType && ((PsiClassType)type).resolve() == null) { + autoImportReference(file, context.getEditor(), typeElement.getInnermostComponentReferenceElement()); + } + } + } } JavaCompletionUtil.initOffsets(file, context.getOffsetMap()); @@ -702,7 +715,13 @@ public class JavaCompletionContributor extends CompletionContributor { iterator.advance(); } - if (!iterator.atEnd() && (iterator.getTokenType() == JavaTokenType.LPARENTH || iterator.getTokenType() == JavaTokenType.COLON)) { + if (!iterator.atEnd() && (iterator.getTokenType() == JavaTokenType.LPARENTH)) { + return true; + } + + if (!iterator.atEnd() + && (iterator.getTokenType() == JavaTokenType.COLON) + && null == PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiConditionalExpression.class, false)) { return true; } @@ -721,7 +740,7 @@ public class JavaCompletionContributor extends CompletionContributor { return iterator.getTokenType() == JavaTokenType.EQ || iterator.getTokenType() == JavaTokenType.LPARENTH; } - private static void autoImport(final PsiFile file, int offset, final Editor editor) { + private static void autoImport(@NotNull final PsiFile file, int offset, @NotNull final Editor editor) { final CharSequence text = editor.getDocument().getCharsSequence(); while (offset > 0 && Character.isJavaIdentifierPart(text.charAt(offset))) offset--; if (offset <= 0) return; @@ -734,7 +753,10 @@ public class JavaCompletionContributor extends CompletionContributor { while (offset > 0 && Character.isWhitespace(text.charAt(offset))) offset--; if (offset <= 0) return; - PsiJavaCodeReferenceElement element = extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false)); + autoImportReference(file, editor, extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false))); + } + + private static void autoImportReference(@NotNull PsiFile file, @NotNull Editor editor, @Nullable PsiJavaCodeReferenceElement element) { if (element == null) return; while (true) { @@ -745,6 +767,7 @@ public class JavaCompletionContributor extends CompletionContributor { } if (!(element.getParent() instanceof PsiMethodCallExpression) && element.multiResolve(true).length == 0) { new ImportClassFix(element).doFix(editor, false, false); + PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument()); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java index b409014c1fe8..661d0abfcaac 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java @@ -18,11 +18,14 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.psi.PsiMethod; -import com.intellij.psi.ResolveResult; +import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import static com.intellij.util.ObjectUtils.assertNotNull; + /** * @author peter */ @@ -38,13 +41,9 @@ public class JavaMethodMergingContributor extends CompletionContributor { final LookupElement[] items = context.getItems(); if (items.length > 1) { String commonName = null; - LookupElement best = null; final ArrayList<PsiMethod> allMethods = new ArrayList<PsiMethod>(); for (LookupElement item : items) { - Object o = item.getObject(); - if (o instanceof ResolveResult) { - o = ((ResolveResult)o).getElement(); - } + Object o = item.getPsiElement(); if (item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) != null || !(o instanceof PsiMethod)) { return AutoCompletionDecision.SHOW_LOOKUP; } @@ -56,19 +55,37 @@ public class JavaMethodMergingContributor extends CompletionContributor { return AutoCompletionDecision.SHOW_LOOKUP; } - if (best == null && method.getParameterList().getParametersCount() > 0) { - best = item; - } commonName = name; allMethods.add(method); item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods); } - if (best == null) { - best = items[0]; - } - return AutoCompletionDecision.insertItem(best); + + return AutoCompletionDecision.insertItem(findBestOverload(items)); } return super.handleAutoCompletionPossibility(context); } + + public static LookupElement findBestOverload(LookupElement[] items) { + LookupElement best = items[0]; + for (int i = 1; i < items.length; i++) { + LookupElement item = items[i]; + if (getPriority(best) < getPriority(item)) { + best = item; + } + } + return best; + } + + private static int getPriority(LookupElement element) { + PsiMethod method = assertNotNull(getItemMethod(element)); + return (method.getReturnType() == PsiType.VOID ? 0 : 1) + + (method.getParameterList().getParametersCount() > 0 ? 2 : 0); + } + + @Nullable + private static PsiMethod getItemMethod(LookupElement item) { + Object o = item.getPsiElement(); + return o instanceof PsiMethod ? (PsiMethod)o : null; + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index f36f567199a0..ceebdecdf8c3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.impl.BetterPrefixMatcher; import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -41,7 +42,6 @@ import static com.intellij.patterns.PsiJavaPatterns.psiElement; * @author peter */ public class JavaNoVariantsDelegator extends CompletionContributor { - @Override public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull CompletionResultSet result) { LinkedHashSet<CompletionResult> plainResults = result.runRemainingContributors(parameters, true); |