From 27ca3fe565f8bca4cb2238a4f98318095ed46c36 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 17 Feb 2017 19:33:38 +0100 Subject: [PATCH] ensure enum constants resolved inside enum class EA-83687 - assert: PsiEnumConstantImpl.resolveMethodGenerics --- .../src/com/intellij/psi/LambdaUtil.java | 7 ++++--- .../com/intellij/psi/util/RedundantCastUtil.java | 6 ++++-- ...LambdaReturnExpressionPassedToEnumConstant.java | 14 ++++++++++++++ .../daemon/lambda/LambdaRedundantCastTest.java | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/CastInsideLambdaReturnExpressionPassedToEnumConstant.java diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index 51248f8c5737..183c5093c2ee 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -16,7 +16,6 @@ package com.intellij.psi; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.registry.Registry; @@ -24,7 +23,9 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.*; -import com.intellij.util.*; +import com.intellij.util.Consumer; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.Producer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.Contract; @@ -861,7 +862,7 @@ public class LambdaUtil { } PsiClass anEnum = JavaPsiFacade.getElementFactory(call.getProject()).createEnum(enumName); anEnum.add(resolveMethod); - return (PsiCall)anEnum.add(copyCall); + return (PsiCall)anEnum.add(call); } return copyCall; } diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java index 667e7fc631a2..c02649b0fa68 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java @@ -468,7 +468,8 @@ public class RedundantCastUtil { PsiTypeCastExpression returnExpression, int returnExprIdx, Function computeCastExpression) { - final PsiCall newCall = (PsiCall)expression.copy(); + final PsiCall newCall = LambdaUtil.copyTopLevelCall(expression); + if (newCall == null) return; final PsiExpressionList newArgsList = newCall.getArgumentList(); LOG.assertTrue(newArgsList != null); final PsiExpression[] newArgs = newArgsList.getExpressions(); @@ -551,7 +552,8 @@ public class RedundantCastUtil { if (grandGrandPa instanceof PsiCall) { PsiMethod resolve = ((PsiCall)grandGrandPa).resolveMethod(); if (resolve != null) { - PsiCall expression = (PsiCall)grandGrandPa.copy(); + PsiCall expression = LambdaUtil.copyTopLevelCall((PsiCall)grandGrandPa); + if (expression == null) return false; PsiExpressionList argumentList = expression.getArgumentList(); LOG.assertTrue(argumentList != null); PsiExpression toReplace = argumentList.getExpressions()[idx]; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/CastInsideLambdaReturnExpressionPassedToEnumConstant.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/CastInsideLambdaReturnExpressionPassedToEnumConstant.java new file mode 100644 index 000000000000..818ce0b170ca --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/CastInsideLambdaReturnExpressionPassedToEnumConstant.java @@ -0,0 +1,14 @@ +import java.util.function.Function; + +interface Demo { + + enum X { + + A( key -> (String) key.toString()); + + X(Function function) { + // ... + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java index c2ed1efcd330..b32a5d751fd7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java @@ -79,7 +79,7 @@ public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase { public void testInvalidResolveWithoutCast() { doTest();} public void testCastInConditionalBranch() { doTest();} - + public void testCastInsideLambdaReturnExpressionPassedToEnumConstant() { doTest(); } public void testRejectReturnTypeChange() throws Exception { doTest(); }