in attempt to fix just one test rewrite half the java method call completion; but the code now is much more self-contained, and the test is fixed

This commit is contained in:
peter
2010-08-31 12:38:38 +01:00
parent 3b58b70076
commit e1928c42af
13 changed files with 243 additions and 292 deletions
@@ -15,13 +15,11 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.ExpectedTypeInfoImpl;
import com.intellij.codeInsight.*;
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
import com.intellij.codeInsight.completion.scope.CompletionElement;
import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor;
import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.codeInsight.guess.GuessManager;
import com.intellij.codeInsight.lookup.*;
@@ -30,6 +28,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
@@ -58,10 +57,7 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.*;
import com.intellij.psi.xml.XmlToken;
import com.intellij.psi.xml.XmlTokenType;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import com.intellij.util.NullableFunction;
import com.intellij.util.PairFunction;
import com.intellij.util.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import gnu.trove.THashSet;
@@ -1043,11 +1039,13 @@ public class JavaCompletionUtil {
}
public static LookupItem qualify(final LookupItem ret) {
final PsiMember completionElement = (PsiMember)ret.getObject();
final PsiClass containingClass = completionElement.getContainingClass();
if (containingClass != null) {
final String className = containingClass.getName();
ret.setLookupString(className + "." + ret.getLookupString());
if (!(ret instanceof JavaMethodCallElement)) {
final PsiMember completionElement = (PsiMember)ret.getObject();
final PsiClass containingClass = completionElement.getContainingClass();
if (containingClass != null) {
final String className = containingClass.getName();
ret.setLookupString(className + "." + ret.getLookupString());
}
}
return ret.forceQualify();
}
@@ -1184,4 +1182,86 @@ public class JavaCompletionUtil {
toDelete.setGreedyToRight(true);
return toDelete;
}
public static void insertParentheses(final InsertionContext context, final LookupElement item, boolean overloadsMatter, boolean hasParams) {
final Editor editor = context.getEditor();
final TailType tailType = getTailType(item, context);
final PsiFile file = context.getFile();
context.setAddCompletionChar(false);
final boolean needLeftParenth = isToInsertParenth(file.findElementAt(context.getStartOffset()));
final boolean needRightParenth = shouldInsertRParenth(context.getCompletionChar(), tailType, hasParams);
if (needLeftParenth) {
final CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(context.getProject());
ParenthesesInsertHandler.getInstance(hasParams,
styleSettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES,
styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES && hasParams,
needRightParenth,
styleSettings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
).handleInsert(context, item);
}
if (needLeftParenth && hasParams) {
// Invoke parameters popup
AutoPopupController.getInstance(file.getProject()).autoPopupParameterInfo(editor, overloadsMatter ? null : (PsiElement)item.getObject());
}
if (tailType == TailType.SMART_COMPLETION || needLeftParenth && needRightParenth) {
tailType.processTail(editor, context.getTailOffset());
}
}
public static boolean shouldInsertRParenth(char completionChar, TailType tailType, boolean hasParams) {
if (tailType == TailType.SMART_COMPLETION) {
return false;
}
if (completionChar == '(' && !hasParams) {
//it's highly probable that the user will type ')' next and it may not be overwritten if the flag is off
return CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
}
return true;
}
@NotNull
public static TailType getTailType(final LookupElement item, InsertionContext context) {
final char completionChar = context.getCompletionChar();
if (completionChar == '!') return item instanceof LookupItem ? ((LookupItem)item).getTailType() : TailType.NONE;
if (completionChar == '(') {
final Object o = item.getObject();
if (o instanceof PsiMethod) {
final PsiMethod psiMethod = (PsiMethod)o;
return psiMethod.getParameterList().getParameters().length > 0 || psiMethod.getReturnType() != PsiType.VOID
? TailType.NONE : TailType.SEMICOLON;
} else if (o instanceof PsiClass) { // it may be a constructor
return TailType.NONE;
}
}
if (completionChar == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) return TailType.SMART_COMPLETION;
if (!context.shouldAddCompletionChar()) {
return TailType.NONE;
}
return LookupItem.handleCompletionChar(context.getEditor(), item, completionChar);
}
public static boolean isToInsertParenth(PsiElement place){
if (place == null) return true;
return !(place.getParent() instanceof PsiImportStaticReferenceElement);
}
//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);
final PsiReference ref = file.findReferenceAt(offset);
if (ref instanceof PsiJavaCodeReferenceElement) {
JavaCodeStyleManager.getInstance(file.getProject()).shortenClassReferences((PsiJavaCodeReferenceElement)ref);
}
}
}