diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceExpression.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceExpression.java
index 6d62805915b8..5f7cb94c783b 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceExpression.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceExpression.java
@@ -28,4 +28,7 @@ public interface PsiMethodReferenceExpression extends PsiReferenceExpression {
*/
@Nullable
PsiTypeElement getQualifierType();
+
+ @Nullable
+ PsiType getFunctionalInterfaceType();
}
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceType.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceType.java
index d64ff6788138..7109554b4499 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceType.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceType.java
@@ -57,7 +57,7 @@ public class PsiMethodReferenceType extends PsiType {
@Override
public A accept(@NotNull final PsiTypeVisitor visitor) {
- return visitor.visitType(this);
+ return visitor.visitMethodReferenceType(this);
}
@Override
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiTypeVisitor.java b/java/java-psi-api/src/com/intellij/psi/PsiTypeVisitor.java
index a9ac4262a9c1..14cbcfd2bca4 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiTypeVisitor.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiTypeVisitor.java
@@ -75,4 +75,11 @@ public class PsiTypeVisitor {
if (interfaceType != null) return interfaceType.accept(this);
return visitType(interfaceType);
}
+
+ public A visitMethodReferenceType(PsiMethodReferenceType methodReferenceType) {
+ final PsiMethodReferenceExpression expression = methodReferenceType.getExpression();
+ final PsiType interfaceType = expression.getFunctionalInterfaceType();
+ if (interfaceType != null) return interfaceType.accept(this);
+ return visitType(methodReferenceType);
+ }
}
diff --git a/java/java-tests/testData/refactoring/introduceVariable/MethodRef.after.java b/java/java-tests/testData/refactoring/introduceVariable/MethodRef.after.java
new file mode 100644
index 000000000000..f873bde4f619
--- /dev/null
+++ b/java/java-tests/testData/refactoring/introduceVariable/MethodRef.after.java
@@ -0,0 +1,15 @@
+class Test {
+ {
+ Bar c = Test::length;
+ bar(c);
+ }
+
+ public static Integer length(String s) {
+ return s.length();
+ }
+
+ static void bar(Bar bar) {}
+ interface Bar {
+ Integer _(String s);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/introduceVariable/MethodRef.java b/java/java-tests/testData/refactoring/introduceVariable/MethodRef.java
new file mode 100644
index 000000000000..f2e73abbbf32
--- /dev/null
+++ b/java/java-tests/testData/refactoring/introduceVariable/MethodRef.java
@@ -0,0 +1,14 @@
+class Test {
+ {
+ bar(Test::length);
+ }
+
+ public static Integer length(String s) {
+ return s.length();
+ }
+
+ static void bar(Bar bar) {}
+ interface Bar {
+ Integer _(String s);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
index 787533d0638b..4bb84d7ba458 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
@@ -373,6 +373,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase {
doTest(new MockIntroduceVariableHandler("c", false, false, false, "SAM"));
}
+ public void testMethodRef() throws Exception {
+ doTest(new MockIntroduceVariableHandler("c", false, false, false, "Test.Bar"));
+ }
+
public void testLambdaExprNotAccepted() throws Exception {
doTest(new MockIntroduceVariableHandler("c", false, false, false, "SAM"));
}