diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index ccbb47f146dd..eba15ac274c0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -1238,12 +1238,12 @@ public class JavaKeywordCompletion { boolean declaration = isDeclarationStart(position); boolean expressionPosition = isExpressionPosition(position); boolean inGenerics = PsiTreeUtil.getParentOfType(position, PsiReferenceParameterList.class) != null; - if (isVariableTypePosition(position) || + if ((isVariableTypePosition(position) || inGenerics || inCast || declaration || typeFragment || - expressionPosition) { + expressionPosition) && primitivesAreExpected(position)) { for (String primitiveType : PRIMITIVE_TYPES) { if (!session.isKeywordAlreadyProcessed(primitiveType)) { result.consume(BasicExpressionCompletionContributor.createKeywordLookupItem(position, primitiveType)); @@ -1262,6 +1262,22 @@ public class JavaKeywordCompletion { } } + private static boolean primitivesAreExpected(@Nullable PsiElement position) { + if (position == null) return false; + PsiElement parent = position.getParent(); + //example: stream.map(i-> i ) + if (parent.getParent() instanceof PsiExpressionList) { + PsiElement previous = PsiTreeUtil.prevVisibleLeaf(parent); + if (previous != null) { + PsiExpression expression = PsiTreeUtil.getParentOfType(previous, PsiExpression.class, true); + if (expression != null && !PsiTreeUtil.isAncestor(expression, parent, true)) { + return false; + } + } + } + return true; + } + /** * Checks if the given PsiElement is in a position where it occurs after a case keyword for a specific type. *

diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions.java new file mode 100644 index 000000000000..b6bc08acf842 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> i in) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2.java new file mode 100644 index 000000000000..5bd443b80b34 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> (i in)) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2_after.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2_after.java new file mode 100644 index 000000000000..8fb453303dd8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2_after.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> (i instanceof )) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3.java new file mode 100644 index 000000000000..6533afd241c1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> i instanceof Integer && i in)) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3_after.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3_after.java new file mode 100644 index 000000000000..972fbef090bf --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3_after.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> i instanceof Integer && i instanceof )) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4.java new file mode 100644 index 000000000000..77d068d2544d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> call(null) && i in + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4_after.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4_after.java new file mode 100644 index 000000000000..52949e8c02dc --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4_after.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> call(null) && i instanceof + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions_after.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions_after.java new file mode 100644 index 000000000000..13ecb3657f0b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions_after.java @@ -0,0 +1,8 @@ +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class AA { + IntStream distinct2(Stream a) { + return a.map(i-> i instanceof ) + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index be6d85c1fad5..fbd5b56cbdf5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -312,6 +312,14 @@ public class KeywordCompletionTest extends LightCompletionTestCase { assertNotContainItems("package"); } + public void testNoPrimitivesAfterExpressions() { doTest(); } + + public void testNoPrimitivesAfterExpressions2() { doTest(); } + + public void testNoPrimitivesAfterExpressions3() { doTest(); } + + public void testNoPrimitivesAfterExpressions4() { doTest(); } + private void doTest() { configureByTestName(); checkResultByTestName();