ensure enum constants resolved inside enum class

EA-83687 - assert: PsiEnumConstantImpl.resolveMethodGenerics
This commit is contained in:
Anna.Kozlova
2017-02-17 19:37:21 +01:00
parent 65ca530d2d
commit 27ca3fe565
4 changed files with 23 additions and 6 deletions
@@ -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;
}
@@ -468,7 +468,8 @@ public class RedundantCastUtil {
PsiTypeCastExpression returnExpression,
int returnExprIdx,
Function<PsiExpression, PsiTypeCastExpression> 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];
@@ -0,0 +1,14 @@
import java.util.function.Function;
interface Demo {
enum X {
A( key -> (<warning descr="Casting 'key.toString()' to 'String' is redundant">String</warning>) key.toString());
X(Function<String, Object> function) {
// ...
}
}
}
@@ -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();
}