IDEA-55146 Autocomplete case inside switch

indent, remove duplicates, restore completion after 'case' (IDEA-CR-12610)
This commit is contained in:
peter
2016-07-28 12:39:54 +02:00
parent bb95648489
commit b3ca224f07
8 changed files with 52 additions and 6 deletions
@@ -54,7 +54,6 @@ import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.DocumentUtil;
import com.intellij.util.PairConsumer;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -845,7 +844,7 @@ public class JavaCompletionContributor extends CompletionContributor {
return null;
}
private static class IndentingDecorator extends LookupElementDecorator<LookupElement> {
static class IndentingDecorator extends LookupElementDecorator<LookupElement> {
public IndentingDecorator(LookupElement delegate) {
super(delegate);
}
@@ -36,6 +36,7 @@ import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Consumer;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -303,7 +304,11 @@ public class JavaKeywordCompletion {
}
private static PsiSwitchStatement getSwitchFromLabelPosition(PsiElement position) {
return PsiTreeUtil.getParentOfType(position, PsiSwitchStatement.class, false, PsiMember.class, PsiSwitchLabelStatement.class);
PsiStatement statement = PsiTreeUtil.getParentOfType(position, PsiStatement.class, false, PsiMember.class);
if (statement != null && !(statement instanceof PsiSwitchLabelStatement) && statement.getParent() instanceof PsiCodeBlock) {
return ObjectUtils.tryCast(statement.getParent().getParent(), PsiSwitchStatement.class);
}
return null;
}
static void addEnumCases(CompletionResultSet result, PsiElement position) {
@@ -315,12 +320,18 @@ public class JavaKeywordCompletion {
Set<PsiField> used = ReferenceExpressionCompletionContributor.findConstantsUsedInSwitch(switchStatement);
for (PsiField field : switchType.getAllFields()) {
String name = field.getName();
if (!(field instanceof PsiEnumConstant) || used.contains(field) || name == null) {
if (!(field instanceof PsiEnumConstant) || used.contains(CompletionUtil.getOriginalOrSelf(field)) || name == null) {
continue;
}
String prefix = "case ";
String suffix = name + ":";
result.addElement(LookupElementBuilder.create(field, prefix + suffix).bold().withPresentableText(prefix).withTailText(suffix).withLookupString(name));
LookupElementBuilder caseConst = LookupElementBuilder
.create(field, prefix + suffix)
.bold()
.withPresentableText(prefix)
.withTailText(suffix)
.withLookupString(name);
result.addElement(new JavaCompletionContributor.IndentingDecorator(caseConst));
}
}
@@ -0,0 +1,8 @@
public class StructuredConfigKey {
{
switch (x) {
case 2:
while (true) <caret>
}
}
}
@@ -0,0 +1,13 @@
class A extends Base{
void foo(B b){
switch(b) {
case FOO:
GOO<caret>
}
}
}
enum B{
FOO, BAR, GOO
}
@@ -0,0 +1,13 @@
class A extends Base{
void foo(B b){
switch(b) {
case FOO:
case GOO:<caret>
}
}
}
enum B{
FOO, BAR, GOO
}
@@ -2,7 +2,7 @@ class A extends Base{
void foo(){
B x = null;
switch(x){
case GOO:<caret>
case GOO:<caret>
}
}
}
@@ -126,6 +126,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase {
public void testFinalAfterParameterAnno() throws Exception { doTest(2, "final", "float", "class"); }
public void testFinalAfterParameterAnno2() throws Exception { doTest(2, "final", "float", "class"); }
public void testFinalAfterCase() { doTest(3, "final", "float", "class"); }
public void testNoCaseInsideWhileInSwitch() { doTest(0, "case", "default"); }
public void testFinalInCatch() { doTest(1, "final"); }
public void testFinalInIncompleteCatch() { doTest(1, "final"); }
public void testFinalInTryWithResources() throws Exception { doTest(1, "final", "float", "class"); }
@@ -291,6 +291,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
}
public void testSwitchCaseWithEnumConstant() { doTest() }
public void testSecondSwitchCaseWithEnumConstant() { doTest() }
public void testMethodInAnnotation() throws Exception {
configureByFile("Annotation.java");