mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fixed unwanted overwriting when smart-completing cast
This commit is contained in:
+9
-6
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user