From 31e02dac0798592a6fdcbc16108281a29bef7c06 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 3 Apr 2018 15:45:48 +0200 Subject: [PATCH] introduce constant check (IDEA-189238) method references by second search would be called on lambda parameter so should not influence constant checks --- .../IntroduceConstantHandler.java | 7 +++++++ .../intellij/psi/PsiMethodReferenceUtil.java | 17 +++++++++++++++++ .../WithMethodReferenceBySecondSearch.java | 14 ++++++++++++++ ...WithMethodReferenceBySecondSearch_after.java | 16 ++++++++++++++++ .../java/refactoring/IntroduceConstantTest.java | 6 ++++++ 5 files changed, 60 insertions(+) create mode 100644 java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch.java create mode 100644 java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java index 4b5f5e63fc5d..c08e0920e558 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java @@ -249,6 +249,13 @@ public class IntroduceConstantHandler extends BaseExpressionToFieldHandler { } } + @Override + public void visitMethodReferenceExpression(PsiMethodReferenceExpression expression) { + if (!PsiMethodReferenceUtil.isResolvedBySecondSearch(expression)) { + super.visitMethodReferenceExpression(expression); + } + } + @Override public void visitCallExpression(PsiCallExpression callExpression) { super.visitCallExpression(callExpression); diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java index 70c045e273d9..7a634c3ecb85 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -38,6 +38,23 @@ public class PsiMethodReferenceUtil { return false; } + public static boolean isResolvedBySecondSearch(@NotNull PsiMethodReferenceExpression methodRef) { + PsiElement resolve = methodRef.resolve(); + if (resolve instanceof PsiMethod) { + PsiMethod method = (PsiMethod)resolve; + PsiType functionalInterfaceType = methodRef.getFunctionalInterfaceType(); + PsiClassType.ClassResolveResult functionalResolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType); + final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalResolveResult); + return interfaceMethod != null && + isResolvedBySecondSearch(methodRef, + interfaceMethod.getSignature(LambdaUtil.getSubstitutor(interfaceMethod, functionalResolveResult)), + method.isVarArgs(), + method.hasModifierProperty(PsiModifier.STATIC), + method.getParameterList().getParametersCount()); + } + return false; + } + public static boolean isResolvedBySecondSearch(@NotNull PsiMethodReferenceExpression methodRef, @Nullable MethodSignature signature, boolean varArgs, diff --git a/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch.java b/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch.java new file mode 100644 index 000000000000..32fa3bf74d52 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch.java @@ -0,0 +1,14 @@ + +import java.util.Comparator; + +class Foo implements Comparable { + + public String getName() { + return ""; + } + + @Override + public int compareTo(final Foo o) { + return Comparator.comparing(Foo::getName, String.CASE_INSENSITIVE_ORDER).compare(this, o); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch_after.java b/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch_after.java new file mode 100644 index 000000000000..16e625a7851c --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/WithMethodReferenceBySecondSearch_after.java @@ -0,0 +1,16 @@ + +import java.util.Comparator; + +class Foo implements Comparable { + + public static final Comparator xxx = Comparator.comparing(Foo::getName, String.CASE_INSENSITIVE_ORDER); + + public String getName() { + return ""; + } + + @Override + public int compareTo(final Foo o) { + return xxx.compare(this, o); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantTest.java index 2299d4221d32..9bffd080f267 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantTest.java @@ -160,6 +160,12 @@ public class IntroduceConstantTest extends LightCodeInsightTestCase { checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); } + public void testWithMethodReferenceBySecondSearch() { + configureByFile(BASE_PATH + getTestName(false) + ".java"); + new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null); + checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); + } + public void testComments() { doTestExpr(); }