mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user