diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java
index e44a135b7669..e6df8fc4d06b 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java
@@ -31,6 +31,7 @@ import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.util.FieldConflictsResolver;
+import com.intellij.refactoring.util.LambdaRefactoringUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper;
import com.intellij.usageView.UsageInfo;
@@ -60,8 +61,18 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar
}
public boolean processChangeMethodUsage(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException {
- if (!isMethodUsage(usage)) return true;
- final PsiElement ref = usage.getElement();
+ PsiElement ref = usage.getElement();
+ if (ref instanceof PsiMethodReferenceExpression) {
+ final PsiLambdaExpression lambdaExpression = LambdaRefactoringUtil.convertMethodReferenceToLambda((PsiMethodReferenceExpression)ref, false, true);
+ final PsiExpression callExpression = LambdaUtil.extractSingleExpressionFromBody(lambdaExpression.getBody());
+ if (callExpression == null) {
+ return true;
+ }
+ ref = callExpression;
+ }
+ else if (!isMethodUsage(usage)) {
+ return true;
+ }
PsiCall callExpression = RefactoringUtil.getCallExpressionByMethodReference(ref);
PsiExpressionList argList = RefactoringUtil.getArgumentListByMethodReference(ref);
if (argList == null) return true;
diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java
index 822efd705c80..f9d723d81e97 100644
--- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java
+++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java
@@ -559,7 +559,7 @@ public class RefactoringUtil {
}
public static PsiCall getCallExpressionByMethodReference(PsiElement ref) {
- if (ref instanceof PsiEnumConstant) return (PsiCall)ref;
+ if (ref instanceof PsiCall) return (PsiCall)ref;
PsiElement parent = ref.getParent();
if (parent instanceof PsiMethodCallExpression) {
return (PsiMethodCallExpression)parent;
diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java
new file mode 100644
index 000000000000..bbb2740317b2
--- /dev/null
+++ b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java
@@ -0,0 +1,13 @@
+interface I {
+ boolean m(int a);
+}
+
+class A {
+ {
+ I predicate = (a) -> A.alwaysTrue(a, "");
+ }
+
+ private static boolean alwaysTrue(int a, String anObject) {
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java b/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java
new file mode 100644
index 000000000000..bbde7ca43cbd
--- /dev/null
+++ b/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java
@@ -0,0 +1,14 @@
+interface I {
+ boolean m(int a);
+}
+
+class A {
+ {
+ I predicate = A::alwaysTrue;
+ }
+
+ private static boolean alwaysTrue(int a) {
+ ""
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java
index 0a83def598b7..77cb593f30b9 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java
@@ -142,6 +142,10 @@ public class IntroduceParameterTest extends LightRefactoringTestCase {
doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false);
}
+ public void testExpandMethodReference() throws Exception {
+ doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false);
+ }
+
public void testSuperWithSideEffect() {
doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false,
"Parameter initializer contains super, but not all calls to method are in its class");