fixed unwanted overwriting when smart-completing cast

This commit is contained in:
Peter Gromov
2009-09-16 16:17:45 +04:00
parent 7f5dae1e86
commit 5ecd03a36b
@@ -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<Boolean> TYPE_CAST = Key.create("TYPE_CAST");
private static final ElementPattern<PsiElement> INSIDE_TYPECAST = psiElement().withParent(
private static final ElementPattern<PsiElement> INSIDE_TYPECAST_EXPRESSION = psiElement().withParent(
psiElement(PsiReferenceExpression.class).afterLeaf(
psiElement().withText(")").withParent(PsiTypeCastExpression.class)));
private static final PsiElementPattern.Capture<PsiElement> 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<CompletionParameters>() {
extend(CompletionType.SMART, INSIDE_TYPECAST_TYPE, new CompletionProvider<CompletionParameters>() {
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<LookupItem>(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);