From 443ce8f3da3762c8e308ca64ccc7fab2992c9b4c Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 16 Sep 2015 10:25:02 +0200 Subject: [PATCH] java smart completion: use less code to replace method calls --- .../completion/JavaCompletionContributor.java | 2 - .../completion/JavaCompletionUtil.java | 50 ++++--------------- .../completion/SmartCompletionDecorator.java | 31 ++++++++---- 3 files changed, 29 insertions(+), 54 deletions(-) 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 07c0361349eb..61e018b43152 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -716,8 +716,6 @@ public class JavaCompletionContributor extends CompletionContributor { } } - JavaCompletionUtil.initOffsets(file, context.getOffsetMap()); - if (context.getCompletionType() == CompletionType.BASIC) { if (semicolonNeeded(context.getEditor(), file, context.getStartOffset())) { context.setDummyIdentifier(CompletionInitializationContext.DUMMY_IDENTIFIER.trim() + ";"); 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 7f39de64c579..647dd2306759 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -34,10 +34,12 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.*; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.SuggestedNameInfo; +import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.impl.FakePsiElement; import com.intellij.psi.impl.light.LightVariableBuilder; @@ -48,7 +50,10 @@ import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.NameHint; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; -import com.intellij.psi.util.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.ui.JBColor; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; @@ -59,7 +64,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import static com.intellij.codeInsight.completion.ReferenceExpressionCompletionContributor.*; +import static com.intellij.codeInsight.completion.ReferenceExpressionCompletionContributor.findConstantsUsedInSwitch; import static com.intellij.patterns.PlatformPatterns.psiElement; public class JavaCompletionUtil { @@ -68,9 +73,6 @@ public class JavaCompletionUtil { public static final Key> DYNAMIC_TYPE_EVALUATOR = Key.create("DYNAMIC_TYPE_EVALUATOR"); private static final Key QUALIFIER_TYPE_ATTR = Key.create("qualifierType"); // SmartPsiElementPointer to PsiType of "qualifier" - public static final OffsetKey LPAREN_OFFSET = OffsetKey.create("lparen"); - public static final OffsetKey RPAREN_OFFSET = OffsetKey.create("rparen"); - public static final OffsetKey ARG_LIST_END_OFFSET = OffsetKey.create("argListEnd"); static final NullableLazyKey EXPECTED_TYPES = NullableLazyKey.create("expectedTypes", new NullableFunction() { @Override @Nullable @@ -83,8 +85,6 @@ public class JavaCompletionUtil { return JavaSmartCompletionContributor.getExpectedTypes(location.getCompletionParameters()); } }); - private static final ElementPattern LEFT_PAREN = psiElement(JavaTokenType.LPARENTH).andOr(psiElement().withParent( - PsiExpressionList.class), psiElement().afterLeaf(".", PsiKeyword.NEW)); public static final Key SUPER_METHOD_PARAMETERS = Key.create("SUPER_METHOD_PARAMETERS"); @@ -200,38 +200,6 @@ public class JavaCompletionUtil { return result; } - public static void initOffsets(final PsiFile file, final OffsetMap offsetMap) { - int offset = Math.max(offsetMap.getOffset(CompletionInitializationContext.SELECTION_END_OFFSET), - offsetMap.getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET)); - - PsiElement element = file.findElementAt(offset); - if (element instanceof PsiWhiteSpace && - (!element.textContains('\n') || - CodeStyleSettingsManager.getSettings(file.getProject()).getCommonSettings(JavaLanguage.INSTANCE).METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE - )) { - element = file.findElementAt(element.getTextRange().getEndOffset()); - } - if (element == null) return; - - if (LEFT_PAREN.accepts(element)) { - offsetMap.addOffset(LPAREN_OFFSET, element.getTextRange().getStartOffset()); - PsiElement list = element.getParent(); - PsiElement last = list.getLastChild(); - if (last instanceof PsiJavaToken && ((PsiJavaToken)last).getTokenType() == JavaTokenType.RPARENTH) { - offsetMap.addOffset(RPAREN_OFFSET, last.getTextRange().getStartOffset()); - } - - offsetMap.addOffset(ARG_LIST_END_OFFSET, list.getTextRange().getEndOffset()); - } - } - - public static void resetParensInfo(final OffsetMap offsetMap) { - offsetMap.removeOffset(LPAREN_OFFSET); - offsetMap.removeOffset(RPAREN_OFFSET); - offsetMap.removeOffset(ARG_LIST_END_OFFSET); - offsetMap.removeOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET); - } - @Nullable public static List getAllPsiElements(final LookupElement item) { List allMethods = getAllMethods(item); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java index 0ec070f3803d..e0a0c51a2986 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java @@ -23,10 +23,12 @@ import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.codeInsight.lookup.TailTypeDecorator; -import com.intellij.openapi.editor.Document; +import com.intellij.lang.java.JavaLanguage; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.psi.util.TypeConversionUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -44,7 +46,7 @@ public class SmartCompletionDecorator extends TailTypeDecorator { @NotNull private final Collection myExpectedTypeInfos; private PsiElement myPosition; - public SmartCompletionDecorator(LookupElement item, Collection expectedTypeInfos) { + public SmartCompletionDecorator(LookupElement item, @NotNull Collection expectedTypeInfos) { super(item); myExpectedTypeInfos = expectedTypeInfos; } @@ -115,16 +117,9 @@ public class SmartCompletionDecorator extends TailTypeDecorator { public void handleInsert(InsertionContext context) { if (getObject() instanceof PsiVariable && context.getCompletionChar() == Lookup.REPLACE_SELECT_CHAR) { context.commitDocument(); - final Document document = context.getDocument(); - JavaCompletionUtil.initOffsets(context.getFile(), context.getOffsetMap()); - document.deleteString(context.getSelectionEndOffset(), context.getOffsetMap().getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET)); - if(context.getOffsetMap().getOffset(JavaCompletionUtil.LPAREN_OFFSET) > 0){ - document.deleteString(context.getOffsetMap().getOffset(JavaCompletionUtil.LPAREN_OFFSET), - context.getOffsetMap().getOffset(JavaCompletionUtil.ARG_LIST_END_OFFSET)); - JavaCompletionUtil.resetParensInfo(context.getOffsetMap()); - } - context.commitDocument(); + replaceMethodCallIfNeeded(context); } + context.commitDocument(); myPosition = getPosition(context, this); TailType tailType = computeTailType(context); @@ -136,6 +131,20 @@ public class SmartCompletionDecorator extends TailTypeDecorator { } } + private static void replaceMethodCallIfNeeded(InsertionContext context) { + PsiFile file = context.getFile(); + PsiElement element = file.findElementAt(context.getTailOffset()); + if (element instanceof PsiWhiteSpace && + (!element.textContains('\n') || + CodeStyleSettingsManager.getSettings(file.getProject()).getCommonSettings(JavaLanguage.INSTANCE).METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE + )) { + element = file.findElementAt(element.getTextRange().getEndOffset()); + } + if (element != null && PsiUtilCore.getElementType(element) == JavaTokenType.LPARENTH && element.getParent() instanceof PsiExpressionList) { + context.getDocument().deleteString(context.getTailOffset(), element.getParent().getTextRange().getEndOffset()); + } + } + public static boolean hasUnboundTypeParams(final PsiMethod method, PsiType expectedType) { final PsiTypeParameter[] typeParameters = method.getTypeParameters(); if (typeParameters.length == 0) return false;