From bf4df4a9794fac085a2a2fba10b7b5bf1d69f354 Mon Sep 17 00:00:00 2001 From: Kyle Thomson Date: Tue, 18 Jul 2017 15:15:06 -0700 Subject: [PATCH] Enhance Java builder completion for superclasses and generics --- .../psi/filters/getters/BuilderCompletion.kt | 9 ++++---- ...icBuilderWithInterfaceAndGenerics-out.java | 23 +++++++++++++++++++ ...StaticBuilderWithInterfaceAndGenerics.java | 23 +++++++++++++++++++ .../completion/SmartTypeCompletionTest.java | 1 + 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics.java diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/BuilderCompletion.kt b/java/java-impl/src/com/intellij/psi/filters/getters/BuilderCompletion.kt index 297dbaced577..48bc1eb73a1d 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/BuilderCompletion.kt +++ b/java/java-impl/src/com/intellij/psi/filters/getters/BuilderCompletion.kt @@ -44,10 +44,11 @@ internal class BuilderCompletion(private val expectedType: PsiClassType, private } private fun methodsReturning(containingClass: PsiClass, returnedClass: PsiClass, isStatic: Boolean): Collection> { - return containingClass.methods - .filter { it.hasModifierProperty(PsiModifier.STATIC) == isStatic && - returnedClass == PsiUtil.resolveClassInClassTypeOnly(it.returnType) && - PsiUtil.isAccessible(it, place, null) } + return containingClass.allMethodsAndTheirSubstitutors + .filter { it.first.hasModifierProperty(PsiModifier.STATIC) == isStatic && + returnedClass == PsiUtil.resolveClassInClassTypeOnly(it.second.substitute(it.first.returnType)) && + PsiUtil.isAccessible(it.first, place, null) } + .map { it.first } .groupBy { it.name } .values } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics-out.java b/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics-out.java new file mode 100644 index 000000000000..a7fa402b315d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics-out.java @@ -0,0 +1,23 @@ +public class S { + + { + Map m = Map.build().get(); + } + +} + +class Map { + static MapBuilder build() {} + + interface BaseBuilder { + T get(); + } + + interface MapBuilder extends BaseBuilder { + + } + + static class Builder implements MapBuilder { + Map get() {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics.java b/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics.java new file mode 100644 index 000000000000..4d08bcf4b1b6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/StaticBuilderWithInterfaceAndGenerics.java @@ -0,0 +1,23 @@ +public class S { + + { + Map m = bui + } + +} + +class Map { + static MapBuilder build() {} + + interface BaseBuilder { + T get(); + } + + interface MapBuilder extends BaseBuilder { + + } + + static class Builder implements MapBuilder { + Map get() {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java index 886fd3441442..907207497a9d 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java @@ -1249,6 +1249,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testStaticBuilder() { doTest(); } public void testStaticBuilderWithArguments() { doTest(); } + public void testStaticBuilderWithInterfaceAndGenerics() { doTest(); } public void testStaticBuilderWithGenerics() { configureByTestName();