IDEA-72776 JAVA: duplicate "boolean" autocomplete suggestion

This commit is contained in:
peter
2011-09-08 19:38:07 +02:00
parent a4f4d931e3
commit 2ffcdf1cb9
4 changed files with 43 additions and 42 deletions
@@ -126,7 +126,7 @@ public class JavaCompletionContributor extends CompletionContributor {
return new ElementExtractorFilter(ElementClassFilter.CLASS);
}
if (JavaCompletionData.AFTER_FINAL.accepts(position)) {
if (JavaCompletionData.VARIABLE_AFTER_FINAL.accepts(position)) {
return ElementClassFilter.CLASS;
}
@@ -22,10 +22,7 @@ import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PsiElementPattern;
import com.intellij.patterns.PsiJavaElementPattern;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.patterns.*;
import com.intellij.psi.*;
import com.intellij.psi.filters.*;
import com.intellij.psi.filters.classes.EnumOrAnnotationTypeFilter;
@@ -58,7 +55,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{
new ParentElementFilter(new ClassFilter(PsiExpression.class)),
new ClassFilter(PsiExpression.class))))),
new AndFilter(new TextFilter("]"), new ParentElementFilter(new ClassFilter(PsiArrayAccessExpression.class)))));
public static final PsiJavaElementPattern.Capture<PsiElement> AFTER_FINAL =
public static final PsiJavaElementPattern.Capture<PsiElement> VARIABLE_AFTER_FINAL =
PsiJavaPatterns.psiElement().afterLeaf(PsiKeyword.FINAL).inside(PsiDeclarationStatement.class);
public static final LeftNeighbour AFTER_TRY_BLOCK = new LeftNeighbour(new AndFilter(
new TextFilter("}"),
@@ -311,19 +308,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
{
// declaration start
// position
final CompletionVariant variant = new CompletionVariant(PsiClass.class, DECLARATION_START);
variant.includeScopeClass(JspClassLevelDeclarationStatement.class);
// completion
addPrimitiveTypes(variant);
variant.addCompletion(PsiKeyword.VOID);
registerVariant(variant);
}
{
final CompletionVariant variant = new CompletionVariant(PsiElement.class, psiElement().afterLeaf(
psiElement(PsiIdentifier.class).afterLeaf(
@@ -359,7 +343,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{
// completion for declarations
final CompletionVariant variant = new CompletionVariant(new OrFilter(END_OF_BLOCK, new LeftNeighbour(new TextFilter(PsiKeyword.FINAL))));
variant.includeScopeClass(PsiCodeBlock.class, false);
addPrimitiveTypes(variant);
addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE);
variant.addCompletion(PsiKeyword.CLASS);
registerVariant(variant);
}
@@ -371,7 +355,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{
new ParentElementFilter(new OrFilter(
new ClassFilter(PsiParenthesizedExpression.class),
new ClassFilter(PsiTypeCastExpression.class))))));
addPrimitiveTypes(variant);
addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE);
registerVariant(variant);
}
@@ -386,17 +370,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{
registerVariant(variant);
}
{
// after final keyword
final ElementFilter position = new PatternFilter(AFTER_FINAL);
final CompletionVariant variant = new CompletionVariant(position);
variant.includeScopeClass(PsiDeclarationStatement.class, true);
addPrimitiveTypes(variant);
registerVariant(variant);
}
{
// Keyword completion in start of declaration
final CompletionVariant variant = new CompletionVariant(PsiMethod.class, END_OF_BLOCK);
@@ -465,10 +438,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
}
private static void addPrimitiveTypes(CompletionVariant variant){
addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE);
}
private static void addPrimitiveTypes(CompletionVariant variant, TailType tailType){
variant.addCompletion(PRIMITIVE_TYPES, tailType);
}
@@ -553,11 +522,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{
result.addElement(createKeyword(position, PsiKeyword.FALSE));
}
if (START_FOR.accepts(position) || INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position)) {
for (String primitiveType : PRIMITIVE_TYPES) {
result.addElement(TailTypeDecorator.withTail(createKeyword(position, primitiveType), TailType.SPACE));
}
}
addPrimitiveTypes(result, position);
if (psiElement().afterLeaf(psiElement().withText(".").inside(PsiExpression.class).afterLeaf(or(
psiElement().withParent(psiElement().referencing(psiClass())),
@@ -598,6 +563,22 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
}
private static void addPrimitiveTypes(CompletionResultSet result, PsiElement position) {
boolean declaration = DECLARATION_START.isAcceptable(position, position) ||
psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class).accepts(position);
if (START_FOR.accepts(position) ||
INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position) ||
VARIABLE_AFTER_FINAL.accepts(position) ||
declaration) {
for (String primitiveType : PRIMITIVE_TYPES) {
result.addElement(new OverrideableSpace(createKeyword(position, primitiveType)));
}
}
if (declaration) {
result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.VOID)));
}
}
private static void addBreakContinue(CompletionResultSet result, PsiElement position) {
PsiLoopStatement loop = PsiTreeUtil.getParentOfType(position, PsiLoopStatement.class);
@@ -675,4 +656,15 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
return false;
}
private static class OverrideableSpace extends TailTypeDecorator<LookupElement> {
public OverrideableSpace(LookupElement keyword) {
super(keyword);
}
@Override
protected TailType computeTailType(InsertionContext context) {
return context.shouldAddCompletionChar() ? TailType.NONE : TailType.SPACE;
}
}
}
@@ -0,0 +1,4 @@
interface Foo {
void getGooBarDoo();
void bar(final b<caret>);
}
@@ -321,7 +321,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
public void testIDEADEV6408() throws Exception {
configureByFile("IDEADEV6408.java");
assertEquals(2, myItems.length);
assertStringItems "boolean", "byte"
}
public void testMethodWithLeftParTailType() throws Exception {
@@ -463,6 +463,11 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
doTest();
}
public void testDoubleBooleanInParameter() throws Throwable {
configure()
assertStringItems("boolean", "byte")
}
public void testNotOnlyKeywordsInsideSwitch() throws Throwable {
doTest();
}