From 9732e343e7be8f9e954e8d5701e3947aeea982be Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Fri, 15 Jul 2016 14:53:11 +0300 Subject: [PATCH] guava type migration: convert function variable that defined as method reference IDEA-152415 --- .../rules/guava/BaseGuavaTypeConversionRule.java | 16 ++++++++++++---- .../inspections/GuavaInspectionTest.java | 4 ++++ .../guava/functionIsMethodReference.java | 8 ++++++++ .../guava/functionIsMethodReference_after.java | 8 ++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 java/typeMigration/testData/inspections/guava/functionIsMethodReference.java create mode 100644 java/typeMigration/testData/inspections/guava/functionIsMethodReference_after.java diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/BaseGuavaTypeConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/BaseGuavaTypeConversionRule.java index 2bc7fb0f99e7..332659dabb76 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/BaseGuavaTypeConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/BaseGuavaTypeConversionRule.java @@ -101,10 +101,18 @@ public abstract class BaseGuavaTypeConversionRule extends TypeConversionRule { final PsiAnonymousClass anonymousClass = ((PsiNewExpression)context).getAnonymousClass(); return anonymousClass == null ? null : findConversionForAnonymous(anonymousClass, labeler.getSettings(GuavaConversionSettings.class)); } - else if (context instanceof PsiReferenceExpression) { - final PsiElement resolvedElement = ((PsiReferenceExpression)context).resolve(); - if (resolvedElement instanceof PsiVariable) { - return findConversionForVariableReference((PsiReferenceExpression)context, (PsiVariable)resolvedElement, context); + else if (context instanceof PsiMethodReferenceExpression) { + final PsiType methodReferenceType = context.getType(); + if (methodReferenceType != null && to != null && to.isAssignableFrom(methodReferenceType)) { + return new TypeConversionDescriptorBase(); + } + } + else { + if (context instanceof PsiReferenceExpression) { + final PsiElement resolvedElement = ((PsiReferenceExpression)context).resolve(); + if (resolvedElement instanceof PsiVariable) { + return findConversionForVariableReference((PsiReferenceExpression)context, (PsiVariable)resolvedElement, context); + } } } return null; diff --git a/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java b/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java index 14e9569629db..05f46982a683 100644 --- a/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java +++ b/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java @@ -286,6 +286,10 @@ public class GuavaInspectionTest extends JavaCodeInsightFixtureTestCase { doTestAllFile(); } + public void testFunctionIsMethodReference() { + doTest(); + } + private void doTestNoQuickFixes(Class... highlightedElements) { myFixture.configureByFile(getTestName(true) + ".java"); diff --git a/java/typeMigration/testData/inspections/guava/functionIsMethodReference.java b/java/typeMigration/testData/inspections/guava/functionIsMethodReference.java new file mode 100644 index 000000000000..14dcd7c2bb44 --- /dev/null +++ b/java/typeMigration/testData/inspections/guava/functionIsMethodReference.java @@ -0,0 +1,8 @@ +import com.google.common.base.Function; + +public class MethodReference { + public void context() { + Function function2 = String::length; + + } +} \ No newline at end of file diff --git a/java/typeMigration/testData/inspections/guava/functionIsMethodReference_after.java b/java/typeMigration/testData/inspections/guava/functionIsMethodReference_after.java new file mode 100644 index 000000000000..4ac45ba6a82e --- /dev/null +++ b/java/typeMigration/testData/inspections/guava/functionIsMethodReference_after.java @@ -0,0 +1,8 @@ +import java.util.function.Function; + +public class MethodReference { + public void context() { + Function function2 = String::length; + + } +} \ No newline at end of file