mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
IDEA-25267 Smart Completion after continue&break should filter labels
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
@@ -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>
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -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(); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user