From 71eb8ec93ed4d472d8d019628e542a837fd96afd Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 25 Sep 2012 17:13:34 +0200 Subject: [PATCH] method ref: introduce method ref variable; accept method ref type separately --- .../psi/PsiMethodReferenceExpression.java | 3 +++ .../com/intellij/psi/PsiMethodReferenceType.java | 2 +- .../src/com/intellij/psi/PsiTypeVisitor.java | 7 +++++++ .../introduceVariable/MethodRef.after.java | 15 +++++++++++++++ .../refactoring/introduceVariable/MethodRef.java | 14 ++++++++++++++ .../refactoring/IntroduceVariableTest.java | 4 ++++ 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/MethodRef.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/MethodRef.java 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")); }