From 082b86a84abc33c29f1cf2a41830ee4f097fffad Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Thu, 27 Mar 2025 10:19:09 +0100 Subject: [PATCH] [java-completion] IDEA-369850 'int' is unexpectedly suggested in 'instanceof' position inside lambda GitOrigin-RevId: f654be030cc13609bbe54ea2d1659a7dfadcfe4b --- .../completion/JavaKeywordCompletion.java | 20 +++++++++++++++++-- .../noPrimitivesAfterExpressions.java | 8 ++++++++ .../noPrimitivesAfterExpressions2.java | 8 ++++++++ .../noPrimitivesAfterExpressions2_after.java | 8 ++++++++ .../noPrimitivesAfterExpressions3.java | 8 ++++++++ .../noPrimitivesAfterExpressions3_after.java | 8 ++++++++ .../noPrimitivesAfterExpressions4.java | 8 ++++++++ .../noPrimitivesAfterExpressions4_after.java | 8 ++++++++ .../noPrimitivesAfterExpressions_after.java | 8 ++++++++ .../completion/KeywordCompletionTest.java | 8 ++++++++ 10 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions2_after.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions3_after.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions4_after.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesAfterExpressions_after.java 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();