From 665998b55c4928b7e6c2aeedd9a3a36e43304a3c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 30 Jun 2022 06:57:11 +0200 Subject: [PATCH] [java] don't check poly rExpression from assignment to avoid poly expression type calculation during overload resolution EA-434232 - T: PsiMethodCallExpressionImpl$TypeEvaluator.fun GitOrigin-RevId: f8eca5cf007c2d453cafbcc5f72215f7c91daf39 --- .../source/tree/java/PsiAssignmentExpressionImpl.java | 5 +++-- .../expressions/PolyExpressionOnRSideOfAssignment.java | 10 ++++++++++ .../daemon/lambda/Java8ExpressionsCheckTest.java | 7 +++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/expressions/PolyExpressionOnRSideOfAssignment.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAssignmentExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAssignmentExpressionImpl.java index 5bf3d1bf5187..b055ed09ba70 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAssignmentExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAssignmentExpressionImpl.java @@ -1,10 +1,11 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.lang.java.parser.ExpressionParser; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; +import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -54,7 +55,7 @@ public class PsiAssignmentExpressionImpl extends ExpressionPsiElement implements PsiType type = lExpression.getType(); if (type == null || type == PsiType.NULL) { PsiExpression rExpression = getRExpression(); - if (rExpression != null) { + if (rExpression != null && !PsiPolyExpressionUtil.isPolyExpression(rExpression)) { return rExpression.getType(); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/expressions/PolyExpressionOnRSideOfAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/expressions/PolyExpressionOnRSideOfAssignment.java new file mode 100644 index 000000000000..7f79fdda912d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/expressions/PolyExpressionOnRSideOfAssignment.java @@ -0,0 +1,10 @@ +class Demo { + void foo(String s) {} + T bar() { + return null; + } + + { + foo(unresolvedLefySide = bar()); + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java index bfaa666a9794..fa154110ce3e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java @@ -29,6 +29,13 @@ public class Java8ExpressionsCheckTest extends LightDaemonAnalyzerTestCase { doTestAllMethodCallExpressions(); } + public void testPolyExpressionOnRSideOfAssignment() { + configure(); + PsiMethodCallExpression + call = PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getCaretModel().getOffset()), PsiMethodCallExpression.class); + call.resolveMethodGenerics().isValidResult(); + } + public void testNestedLambdaReturnTypeCheck() { configure(); PsiMethodCallExpression