From 5ecd03a36b8557d95a0c7a1ecc2cc8c3ced6bcb6 Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Wed, 16 Sep 2009 16:17:45 +0400 Subject: [PATCH] fixed unwanted overwriting when smart-completing cast --- .../JavaSmartCompletionContributor.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 1dcc63964f90..80f5f8f2f8d4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -13,6 +13,7 @@ import com.intellij.openapi.util.*; import com.intellij.patterns.ElementPattern; import static com.intellij.patterns.PlatformPatterns.psiElement; import com.intellij.patterns.PsiJavaPatterns; +import com.intellij.patterns.PsiElementPattern; import static com.intellij.patterns.PsiJavaPatterns.psiMethod; import static com.intellij.patterns.StandardPatterns.*; import com.intellij.psi.*; @@ -80,9 +81,11 @@ public class JavaSmartCompletionContributor extends CompletionContributor { psiElement().inside(PsiSuperExpression.class) ); public static final Key TYPE_CAST = Key.create("TYPE_CAST"); - private static final ElementPattern INSIDE_TYPECAST = psiElement().withParent( + private static final ElementPattern INSIDE_TYPECAST_EXPRESSION = psiElement().withParent( psiElement(PsiReferenceExpression.class).afterLeaf( psiElement().withText(")").withParent(PsiTypeCastExpression.class))); + private static final PsiElementPattern.Capture INSIDE_TYPECAST_TYPE = psiElement().afterLeaf(psiElement().withText("(").withParent( + PsiTypeCastExpression.class)); @Nullable private static ElementFilter getReferenceFilter(PsiElement element) { @@ -111,13 +114,15 @@ public class JavaSmartCompletionContributor extends CompletionContributor { public JavaSmartCompletionContributor() { - extend(CompletionType.SMART, psiElement().afterLeaf(psiElement().withText("(").withParent(PsiTypeCastExpression.class)), new CompletionProvider() { + extend(CompletionType.SMART, INSIDE_TYPECAST_TYPE, new CompletionProvider() { protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) { for (final ExpectedTypeInfo type : getExpectedTypes(parameters)) { if (type.getType() == PsiType.VOID) { continue; } + final boolean overwrite = INSIDE_TYPECAST_TYPE.accepts(parameters.getOriginalPosition()); + final LookupElement item = new LookupElementDecorator(PsiTypeLookupItem.createLookupItem(type.getDefaultType())) { @Override public AutoCompletionPolicy getAutoCompletionPolicy() { @@ -126,10 +131,8 @@ public class JavaSmartCompletionContributor extends CompletionContributor { @Override public void handleInsert(InsertionContext context) { - final PsiElement position = SmartCompletionDecorator.getPosition(context, this); final Editor editor = context.getEditor(); - if (or(psiElement(PsiParenthesizedExpression.class).withLastChild(psiElement(JavaTokenType.RPARENTH)), - psiElement().afterLeaf(psiElement().withText("(").withParent(PsiTypeCastExpression.class))).accepts(position)) { + if (overwrite) { editor.getDocument().deleteString(context.getSelectionEndOffset(), context.getOffsetMap().getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET)); } @@ -203,7 +206,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { result.addElement(decorate(item, infos)); } } - else if (INSIDE_TYPECAST.accepts(element)) { + else if (INSIDE_TYPECAST_EXPRESSION.accepts(element)) { final ReturnTypeFilter rfilter = new ReturnTypeFilter(new GeneratorFilter(AssignableToFilter.class, new CastTypeGetter())); for (final LookupElement item : completeReference(element, reference, rfilter, false, parameters)) { result.addElement(item);