IDEA-25267 Smart Completion after continue&break should filter labels

This commit is contained in:
peter
2012-03-07 20:24:50 +04:00
parent 3a2ec64c13
commit 91fb524a30
7 changed files with 59 additions and 13 deletions
@@ -44,6 +44,7 @@ import com.intellij.psi.filters.element.ModifierFilter;
import com.intellij.psi.filters.getters.ExpectedTypesGetter;
import com.intellij.psi.filters.types.AssignableFromFilter;
import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl;
import com.intellij.psi.impl.source.PsiLabelReference;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.JavaElementType;
import com.intellij.psi.scope.ElementClassFilter;
@@ -294,6 +295,10 @@ public class JavaCompletionContributor extends CompletionContributor {
}
return;
}
if (reference instanceof PsiLabelReference) {
processLabelReference(result, (PsiLabelReference)reference);
return;
}
final Object[] variants = reference.getVariants();
if (variants == null) {
@@ -678,4 +683,10 @@ public class JavaCompletionContributor extends CompletionContributor {
}
return null;
}
static void processLabelReference(CompletionResultSet result, PsiLabelReference ref) {
for (String s : ref.getVariants()) {
result.addElement(TailTypeDecorator.withTail(LookupElementBuilder.create(s), TailType.SEMICOLON));
}
}
}
@@ -30,6 +30,7 @@ import com.intellij.psi.filters.getters.*;
import com.intellij.psi.filters.types.AssignableFromFilter;
import com.intellij.psi.filters.types.AssignableGroupFilter;
import com.intellij.psi.filters.types.AssignableToFilter;
import com.intellij.psi.impl.source.PsiLabelReference;
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference;
import com.intellij.psi.infos.CandidateInfo;
import com.intellij.psi.javadoc.PsiDocTag;
@@ -345,6 +346,18 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
extend(CompletionType.SMART, AFTER_NEW, new JavaInheritorsGetter(ConstructorInsertHandler.SMART_INSTANCE));
extend(CompletionType.SMART, psiElement().afterLeaf(PsiKeyword.BREAK, PsiKeyword.CONTINUE), new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet result) {
PsiReference ref = parameters.getPosition().getContainingFile().findReferenceAt(parameters.getOffset());
if (ref instanceof PsiLabelReference) {
JavaCompletionContributor.processLabelReference(result, (PsiLabelReference)ref);
}
}
});
}
private static void addExpectedTypeMembers(CompletionParameters params,
@@ -37,4 +37,8 @@ public interface PsiLabeledStatement extends PsiStatement, PsiNamedElement {
*/
@Nullable
PsiStatement getStatement();
@Override
@NotNull
String getName();
}
@@ -18,13 +18,14 @@ package com.intellij.psi.impl.source;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import org.jetbrains.annotations.NotNull;
/**
* Created by IntelliJ IDEA.
* User: ik
@@ -94,19 +95,19 @@ public class PsiLabelReference implements PsiReference{
return resolve() == element;
}
@Override
@NotNull
public Object[] getVariants(){
final List result = new ArrayList();
PsiElement context = myStatement;
while(context != null){
if(context instanceof PsiLabeledStatement){
result.add(context);
}
context = context.getContext();
@Override
@NotNull
public String[] getVariants() {
final List<String> result = new ArrayList<String>();
PsiElement context = myStatement;
while(context != null){
if(context instanceof PsiLabeledStatement){
result.add(((PsiLabeledStatement)context).getName());
}
return result.toArray();
context = context.getContext();
}
return ArrayUtil.toStringArray(result);
}
@Override
public boolean isSoft(){
@@ -0,0 +1,8 @@
public class Util {
void foo(int labInt) {
label:
while (true) {
break label;<caret>
}
}
}
@@ -0,0 +1,8 @@
public class Util {
void foo(int labInt) {
label:
while (true) {
break l<caret>
}
}
}
@@ -1002,6 +1002,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
}
public void testEnumAsDefaultAnnotationParam() throws Throwable { doTest(); }
public void testBreakLabel() throws Throwable { doTest(); }
public void testNewAbstractInsideAnonymous() throws Throwable { doTest(); }