diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index 84ca60772759..b67b7a9b0662 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -353,17 +353,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{ registerVariant(variant); } -// Completion in cast expressions - { - final CompletionVariant variant = new CompletionVariant(PsiMethod.class, new LeftNeighbour(new AndFilter( - new TextFilter("("), - new ParentElementFilter(new OrFilter( - new ClassFilter(PsiParenthesizedExpression.class), - new ClassFilter(PsiTypeCastExpression.class)))))); - addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE); - registerVariant(variant); - } - { // instanceof keyword final ElementFilter position = INSTANCEOF_PLACE; @@ -581,15 +570,27 @@ public class JavaCompletionData extends JavaAwareCompletionData{ } private static void addPrimitiveTypes(CompletionResultSet result, PsiElement position) { + new LeftNeighbour(new AndFilter( + new TextFilter("("), + new ParentElementFilter(new OrFilter( + new ClassFilter(PsiParenthesizedExpression.class), + new ClassFilter(PsiTypeCastExpression.class))))); + + boolean inCast = psiElement() + .afterLeaf(psiElement().withText("(").withParent(psiElement(PsiParenthesizedExpression.class, PsiTypeCastExpression.class))) + .accepts(position); + boolean declaration = DECLARATION_START.isAcceptable(position, position) || psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class).accepts(position) || psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiClassLevelDeclarationStatement.class).accepts(position); if (START_FOR.accepts(position) || INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position) || VARIABLE_AFTER_FINAL.accepts(position) || + inCast || declaration) { for (String primitiveType : PRIMITIVE_TYPES) { - result.addElement(new OverrideableSpace(createKeyword(position, primitiveType))); + LookupElement keyword = createKeyword(position, primitiveType); + result.addElement(inCast ? keyword : new OverrideableSpace(keyword)); } } if (declaration) { diff --git a/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite.java b/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite.java new file mode 100644 index 000000000000..5f1efdbf81a1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite.java @@ -0,0 +1,6 @@ +public class Zoo2 { + { + byte v1 = (byte) 0; + } +} + diff --git a/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite_after.java b/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite_after.java new file mode 100644 index 000000000000..a838d085f26d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/PrimitiveCastOverwrite_after.java @@ -0,0 +1,6 @@ +public class Zoo2 { + { + byte v1 = (byte) 0; + } +} + diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index a90eaef34335..9f42a3dd9ef5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -853,6 +853,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { } public void testMethodParameterAnnotationClass() throws Throwable { doTest(); } + public void testPrimitiveCastOverwrite() throws Throwable { doTest '\t' } public void testVoidMethodsInNonVoidContext() throws Throwable { configure() diff --git a/java/openapi/src/com/intellij/patterns/PsiJavaPatterns.java b/java/openapi/src/com/intellij/patterns/PsiJavaPatterns.java index 1b0fa3acdd6c..2da9c756a728 100644 --- a/java/openapi/src/com/intellij/patterns/PsiJavaPatterns.java +++ b/java/openapi/src/com/intellij/patterns/PsiJavaPatterns.java @@ -49,6 +49,20 @@ public class PsiJavaPatterns extends StandardPatterns{ return new PsiJavaElementPattern.Capture(aClass); } + public static PsiJavaElementPattern.Capture psiElement(final Class... classAlternatives) { + return new PsiJavaElementPattern.Capture(new InitialPatternCondition(PsiElement.class) { + @Override + public boolean accepts(@Nullable Object o, ProcessingContext context) { + for (Class classAlternative : classAlternatives) { + if (classAlternative.isInstance(o)) { + return true; + } + } + return false; + } + }); + } + public static PsiJavaElementPattern.Capture literalExpression() { return literalExpression(null); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java index 9b3f069de44d..797dec222db8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java @@ -25,9 +25,7 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.lookup.TailTypeDecorator; import com.intellij.lang.ASTNode; import com.intellij.patterns.PlatformPatterns; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiErrorElement; -import com.intellij.psi.PsiKeyword; +import com.intellij.psi.*; import com.intellij.psi.templateLanguages.OuterLanguageElement; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; @@ -92,7 +90,11 @@ public class GroovyCompletionData { } else if (suggestThrows(position)) { addKeywords(result, true, PsiKeyword.THROWS); } else if (suggestPrimitiveTypes(position)) { - addKeywords(result, true, BUILT_IN_TYPES); + boolean inCast = psiElement() + .afterLeaf(psiElement().withText("(").withParent(psiElement(GrParenthesizedExpression.class, GrTypeCastExpression.class))) + .accepts(position); + + addKeywords(result, !inCast, BUILT_IN_TYPES); } if (psiElement(GrReferenceExpression.class).inside(or(psiElement(GrWhileStatement.class), psiElement(GrForStatement.class))).accepts(parent)) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 987cbb904a75..6cce5f841bb3 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -841,4 +841,8 @@ class X { public void testSortOrder0() { doVariantableTest 'se', 'setMetaClass', 'setProperty', 'setSe' } + + public void testPrimitiveCastOverwrite() { + checkCompletion 'byte v1 = (byte) 0', '\t', 'byte v1 = (byte) 0' + } } \ No newline at end of file