[java-completion] IDEA-369850 'int' is unexpectedly suggested in 'instanceof' position inside lambda

GitOrigin-RevId: f654be030cc13609bbe54ea2d1659a7dfadcfe4b
This commit is contained in:
Mikhail Pyltsin
2025-03-27 11:21:32 +00:00
committed by intellij-monorepo-bot
parent 4399d6449c
commit 082b86a84a
10 changed files with 90 additions and 2 deletions
@@ -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 <caret>)
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.
* <p>
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> i in<caret>)
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> (i in<caret>))
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> (i instanceof ))
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> i instanceof Integer && i in<caret>))
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> i instanceof Integer && i instanceof ))
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> call(null) && i in<caret>
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> call(null) && i instanceof <caret>
}
}
@@ -0,0 +1,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AA {
IntStream distinct2(Stream<Object> a) {
return a.map(i-> i instanceof )
}
}
@@ -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();