From e98517a060535c8cb31e159a90f190ef3ffd1031 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Thu, 2 Jul 2015 19:51:12 +0300 Subject: [PATCH] StaticPseudoFunctionalStyleMethodInspection: doesn't throw exception when lambda is variable --- .../PseudoLambdaReplaceTemplate.java | 6 +++++ .../lambdaIsVariable/test.java | 24 +++++++++++++++++++ .../lambdaIsVariable/test_after.java | 24 +++++++++++++++++++ ...StaticPseudoFunctionalStyleMethodTest.java | 4 ++++ 4 files changed, 58 insertions(+) create mode 100644 java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test.java create mode 100644 java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test_after.java diff --git a/java/java-impl/src/com/intellij/codeInspection/java18StreamApi/PseudoLambdaReplaceTemplate.java b/java/java-impl/src/com/intellij/codeInspection/java18StreamApi/PseudoLambdaReplaceTemplate.java index 303eb8d845ee..a7bf704520e4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/java18StreamApi/PseudoLambdaReplaceTemplate.java +++ b/java/java-impl/src/com/intellij/codeInspection/java18StreamApi/PseudoLambdaReplaceTemplate.java @@ -449,6 +449,12 @@ class PseudoLambdaReplaceTemplate { final String methodName = functionalInterfaceMethod.getName(); return JavaPsiFacade.getElementFactory(expression.getProject()).createExpressionFromText(expression.getText() + "::" + methodName, null); } + if (expression instanceof PsiReferenceExpression) { + final PsiType expressionType = expression.getType(); + final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(expressionType); + LOG.assertTrue(method != null); + return JavaPsiFacade.getElementFactory(expression.getProject()).createExpressionFromText(expression.getText() + "::" + method.getName(), null); + } return AnonymousCanBeLambdaInspection.replacePsiElementWithLambda(expression, true); } diff --git a/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test.java b/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test.java new file mode 100644 index 000000000000..45623b513bb0 --- /dev/null +++ b/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test.java @@ -0,0 +1,24 @@ +import com.google.common.collect.Iterables; +import com.google.common.base.Function; + +import java.lang.String; +import java.util.ArrayList; +import java.util.Collections; +import java.util.stream.Collectors; + +class c { + void m() { + final Function function = (Function)new Function() { + @Override + public String apply(String input) { + Collectors c; + ArrayList l; + System.out.println(input); + //do something + int i = 1; + return input; + } + }; + Iterables.transform(Collections.emptyList(), function); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test_after.java b/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test_after.java new file mode 100644 index 000000000000..565693317f6a --- /dev/null +++ b/java/java-tests/testData/inspection/lambdaLibsStatic/lambdaIsVariable/test_after.java @@ -0,0 +1,24 @@ +import com.google.common.collect.Iterables; +import com.google.common.base.Function; + +import java.lang.String; +import java.util.ArrayList; +import java.util.Collections; +import java.util.stream.Collectors; + +class c { + void m() { + final Function function = (Function)new Function() { + @Override + public String apply(String input) { + Collectors c; + ArrayList l; + System.out.println(input); + //do something + int i = 1; + return input; + } + }; + Collections.emptyList().stream().map(function::apply).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/StaticPseudoFunctionalStyleMethodTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/StaticPseudoFunctionalStyleMethodTest.java index 05d97edea504..c0d143200447 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/StaticPseudoFunctionalStyleMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/StaticPseudoFunctionalStyleMethodTest.java @@ -108,6 +108,10 @@ public class StaticPseudoFunctionalStyleMethodTest extends JavaCodeInsightFixtur doTest(); } + public void testLambdaIsVariable() { + doTest(); + } + public void _testReplaceWithMethodReference() { doTest(); }