From 320aeb7b5e004c023303faf9d8d9d137ae5520d6 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 14 Apr 2016 20:55:42 +0200 Subject: [PATCH] inference: erasure functional type for raw substitutors (IDEA-154759) --- .../src/com/intellij/psi/LambdaUtil.java | 8 +++++++- .../psi/infos/MethodCandidateInfo.java | 2 +- ...utorWithExpectedGenericsParameterType.java | 20 +++++++++++++++++++ .../lambda/NewLambdaHighlightingTest.java | 4 ++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RawSiteSubstitutorWithExpectedGenericsParameterType.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 9ac101f0daad..a61844059e39 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -402,7 +402,13 @@ public class LambdaUtil { return PsiResolveHelper.ourGraphGuard.doPreventingRecursion(expression, !MethodCandidateInfo.isOverloadCheck(), new Computable() { @Override public PsiType compute() { - return resolveResult.getSubstitutor().substitute(getNormalizedType(parameters[finalLambdaIdx])); + final PsiType normalizedType = getNormalizedType(parameters[finalLambdaIdx]); + if (resolveResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)resolveResult).isRawSubstitution()) { + return TypeConversionUtil.erasure(normalizedType); + } + else { + return resolveResult.getSubstitutor().substitute(normalizedType); + } } }); } diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index a8a48667b039..0d66d72a6f04 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -399,7 +399,7 @@ public class MethodCandidateInfo extends CandidateInfo{ }, super.getSubstitutor(), policy.isVarargsIgnored() || isVarargs(), !includeReturnConstraint); } - private boolean isRawSubstitution() { + public boolean isRawSubstitution() { final PsiMethod method = getElement(); if (!method.hasModifierProperty(PsiModifier.STATIC)) { final PsiClass containingClass = method.getContainingClass(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RawSiteSubstitutorWithExpectedGenericsParameterType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RawSiteSubstitutorWithExpectedGenericsParameterType.java new file mode 100644 index 000000000000..cd5d16662d42 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RawSiteSubstitutorWithExpectedGenericsParameterType.java @@ -0,0 +1,20 @@ + +interface Processor { + + void process(T t); +} + +class MySymbol { + + void processSameSymbols(Processor processor) {} + + T locateDefinition() { + return (T) ""; + } + + void findUsages(MySymbol s) { + s.processSameSymbols(symbol -> { + String definition = symbol.locateDefinition(); + }); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index a1680d5d652e..3e601b9d9a7e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -304,6 +304,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testRawSiteSubstitutorWithExpectedGenericsParameterType() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }