Add KotlinClassConstructorInfoHandler for showing parameter info of parameterized super class constructor.
^KT-41617 Fixed
This commit is contained in:
committed by
Vladimir Dolzhenko
parent
d674f519fd
commit
01143f24a4
@@ -380,6 +380,7 @@
|
|||||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||||
|
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassConstructorInfoHandler"/>
|
||||||
<codeInsight.parameterNameHints language="kotlin" implementationClass="org.jetbrains.kotlin.idea.codeInsight.hints.KotlinInlayParameterHintsProvider"/>
|
<codeInsight.parameterNameHints language="kotlin" implementationClass="org.jetbrains.kotlin.idea.codeInsight.hints.KotlinInlayParameterHintsProvider"/>
|
||||||
|
|
||||||
<codeInsight.inlayProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.codeInsight.hints.KotlinReferencesTypeHintsProvider"/>
|
<codeInsight.inlayProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.codeInsight.hints.KotlinReferencesTypeHintsProvider"/>
|
||||||
|
|||||||
@@ -18,10 +18,7 @@ package org.jetbrains.kotlin.idea.parameterInfo
|
|||||||
|
|
||||||
import com.intellij.codeInsight.lookup.LookupElement
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.lang.parameterInfo.*
|
import com.intellij.lang.parameterInfo.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
import org.jetbrains.kotlin.idea.core.resolveCandidates
|
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.isAnyOrNullableAny
|
||||||
import org.jetbrains.kotlin.types.typeUtil.nullability
|
import org.jetbrains.kotlin.types.typeUtil.nullability
|
||||||
|
|
||||||
|
class KotlinClassConstructorInfoHandler : KotlinTypeArgumentInfoHandlerBase<ClassConstructorDescriptor>() {
|
||||||
|
override fun fetchTypeParameters(descriptor: ClassConstructorDescriptor): List<TypeParameterDescriptor> = descriptor.typeParameters
|
||||||
|
|
||||||
|
override fun findParameterOwners(argumentList: KtTypeArgumentList): Collection<ClassConstructorDescriptor>? {
|
||||||
|
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<ClassDescriptor>() {
|
class KotlinClassTypeArgumentInfoHandler : KotlinTypeArgumentInfoHandlerBase<ClassDescriptor>() {
|
||||||
override fun fetchTypeParameters(descriptor: ClassDescriptor) = descriptor.typeConstructor.parameters
|
override fun fetchTypeParameters(descriptor: ClassDescriptor) = descriptor.typeConstructor.parameters
|
||||||
|
|
||||||
override fun findParameterOwners(argumentList: KtTypeArgumentList): Collection<ClassDescriptor>? {
|
override fun findParameterOwners(argumentList: KtTypeArgumentList): Collection<ClassDescriptor>? {
|
||||||
val userType = argumentList.parent as? KtUserType ?: return null
|
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)
|
override fun getArgumentListAllowedParentClasses() = setOf(KtUserType::class.java)
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
open class Parameterized<A, C: Cloneable, R: Runnable>
|
||||||
|
|
||||||
|
class AC
|
||||||
|
class CC : Cloneable
|
||||||
|
class RC : Runnable {
|
||||||
|
override fun run() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UsageClass : Parameterized<AC, CC<caret>, RC>()
|
||||||
|
|
||||||
|
//Text: (A, <highlight>C : Cloneable</highlight>, R : Runnable), Disabled: false, Strikeout: false, Green: false
|
||||||
+5
@@ -444,6 +444,11 @@ public class ParameterInfoTestGenerated extends AbstractParameterInfoTest {
|
|||||||
runTest("idea/testData/parameterInfo/typeArguments/Overloads.kt");
|
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")
|
@TestMetadata("Reified.kt")
|
||||||
public void testReified() throws Exception {
|
public void testReified() throws Exception {
|
||||||
runTest("idea/testData/parameterInfo/typeArguments/Reified.kt");
|
runTest("idea/testData/parameterInfo/typeArguments/Reified.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user