From 01143f24a48d62c8d69312f87eca98b8495ebe49 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Mon, 7 Sep 2020 13:23:08 +0200 Subject: [PATCH] Add KotlinClassConstructorInfoHandler for showing parameter info of parameterized super class constructor. ^KT-41617 Fixed --- idea/resources/META-INF/plugin-common.xml | 1 + .../KotlinTypeArgumentInfoHandler.kt | 20 ++++++++++++++----- .../ParameterizedClassConstructor.kt | 11 ++++++++++ .../ParameterInfoTestGenerated.java | 5 +++++ 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 idea/testData/parameterInfo/typeArguments/ParameterizedClassConstructor.kt diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 74ba5f2ca79..5177fed0af4 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -380,6 +380,7 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinTypeArgumentInfoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinTypeArgumentInfoHandler.kt index 59459bcecdb..f498bac01f1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinTypeArgumentInfoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinTypeArgumentInfoHandler.kt @@ -18,10 +18,7 @@ package org.jetbrains.kotlin.idea.parameterInfo import com.intellij.codeInsight.lookup.LookupElement import com.intellij.lang.parameterInfo.* -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.resolveCandidates @@ -40,12 +37,25 @@ import org.jetbrains.kotlin.types.typeUtil.TypeNullability import org.jetbrains.kotlin.types.typeUtil.isAnyOrNullableAny import org.jetbrains.kotlin.types.typeUtil.nullability +class KotlinClassConstructorInfoHandler : KotlinTypeArgumentInfoHandlerBase() { + override fun fetchTypeParameters(descriptor: ClassConstructorDescriptor): List = descriptor.typeParameters + + override fun findParameterOwners(argumentList: KtTypeArgumentList): Collection? { + val userType = argumentList.parent as? KtUserType ?: return null + val descriptors = userType.referenceExpression?.resolveMainReferenceToDescriptors()?.mapNotNull { it as? ClassConstructorDescriptor } + return descriptors?.takeIf { it.isNotEmpty() } + } + + override fun getArgumentListAllowedParentClasses() = setOf(KtUserType::class.java) +} + class KotlinClassTypeArgumentInfoHandler : KotlinTypeArgumentInfoHandlerBase() { override fun fetchTypeParameters(descriptor: ClassDescriptor) = descriptor.typeConstructor.parameters override fun findParameterOwners(argumentList: KtTypeArgumentList): Collection? { val userType = argumentList.parent as? KtUserType ?: return null - return userType.referenceExpression?.resolveMainReferenceToDescriptors()?.mapNotNull { it as? ClassDescriptor } + val descriptors = userType.referenceExpression?.resolveMainReferenceToDescriptors()?.mapNotNull { it as? ClassDescriptor } + return descriptors?.takeIf { it.isNotEmpty() } } override fun getArgumentListAllowedParentClasses() = setOf(KtUserType::class.java) diff --git a/idea/testData/parameterInfo/typeArguments/ParameterizedClassConstructor.kt b/idea/testData/parameterInfo/typeArguments/ParameterizedClassConstructor.kt new file mode 100644 index 00000000000..9a774f435b0 --- /dev/null +++ b/idea/testData/parameterInfo/typeArguments/ParameterizedClassConstructor.kt @@ -0,0 +1,11 @@ +open class Parameterized + +class AC +class CC : Cloneable +class RC : Runnable { + override fun run() {} +} + +class UsageClass : Parameterized, RC>() + +//Text: (A, C : Cloneable, R : Runnable), Disabled: false, Strikeout: false, Green: false \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/ParameterInfoTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/ParameterInfoTestGenerated.java index 52a309379a0..6fb932ee3d2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/ParameterInfoTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/ParameterInfoTestGenerated.java @@ -444,6 +444,11 @@ public class ParameterInfoTestGenerated extends AbstractParameterInfoTest { runTest("idea/testData/parameterInfo/typeArguments/Overloads.kt"); } + @TestMetadata("ParameterizedClassConstructor.kt") + public void testParameterizedClassConstructor() throws Exception { + runTest("idea/testData/parameterInfo/typeArguments/ParameterizedClassConstructor.kt"); + } + @TestMetadata("Reified.kt") public void testReified() throws Exception { runTest("idea/testData/parameterInfo/typeArguments/Reified.kt");