KT-59836 [SLC] Copy type parameters from the parent interface to DefaultImpls methods

This commit is contained in:
Pavel Mikhailovskii
2023-07-10 13:11:21 +00:00
committed by Space Team
parent ddb27f2b26
commit 6e6a4d6411
22 changed files with 146 additions and 10 deletions
@@ -93,7 +93,8 @@ abstract class SymbolLightClassForClassLike<SType : KtClassOrObjectSymbol> prote
}
}
override fun hasTypeParameters(): Boolean = hasTypeParameters(ktModule, classOrObjectDeclaration, classOrObjectSymbolPointer)
override fun hasTypeParameters(): Boolean =
hasTypeParameters(ktModule, classOrObjectDeclaration, classOrObjectSymbolPointer)
override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList
@@ -122,7 +122,9 @@ internal class SymbolLightAccessorMethod private constructor(
}
}
override fun hasTypeParameters(): Boolean = hasTypeParameters(ktModule, containingPropertyDeclaration, containingPropertySymbolPointer)
override fun hasTypeParameters(): Boolean =
hasTypeParameters(ktModule, containingPropertyDeclaration, containingPropertySymbolPointer)
|| containingClass.isDefaultImplsForInterfaceWithTypeParameters
override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList
override fun getTypeParameters(): Array<PsiTypeParameter> = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY
@@ -142,7 +142,8 @@ internal class SymbolLightAnnotationsMethod private constructor(
}
}
private fun propertyHasTypeParameters(): Boolean = hasTypeParameters(ktModule, containingPropertyDeclaration, containingPropertySymbolPointer)
private fun propertyHasTypeParameters(): Boolean =
hasTypeParameters(ktModule, containingPropertyDeclaration, containingPropertySymbolPointer)
private val _parametersList by lazyPub {
SymbolLightParameterList(
@@ -70,7 +70,9 @@ internal class SymbolLightSimpleMethod(
}
}
override fun hasTypeParameters(): Boolean = hasTypeParameters(ktModule, functionDeclaration, functionSymbolPointer)
override fun hasTypeParameters(): Boolean =
hasTypeParameters(ktModule, functionDeclaration, functionSymbolPointer)
|| containingClass.isDefaultImplsForInterfaceWithTypeParameters
override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList
override fun getTypeParameters(): Array<PsiTypeParameter> = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY
@@ -62,7 +62,9 @@ internal class SymbolLightTypeParameter private constructor(
override val givenAnnotations: List<KtLightAbstractAnnotation> get() = invalidAccess()
override fun copy(): PsiElement = SymbolLightTypeParameter(
override fun copy(): PsiElement = copyTo(parent)
internal fun copyTo(parent: SymbolLightTypeParameterList): SymbolLightTypeParameter = SymbolLightTypeParameter(
parent,
index,
typeParameterSymbolPointer,
@@ -13,8 +13,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo
import org.jetbrains.kotlin.light.classes.symbol.compareSymbolPointers
import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.light.classes.symbol.toArrayIfNotEmptyOrDefault
import org.jetbrains.kotlin.light.classes.symbol.withSymbol
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
@@ -42,11 +44,18 @@ internal class SymbolLightTypeParameterList(
private val _typeParameters: Collection<PsiTypeParameter> by lazyPub {
symbolWithTypeParameterPointer.withSymbol(ktModule) {
it.typeParameters.mapIndexed { index, parameter ->
val parentInterface =
(owner as? SymbolLightMethodBase)?.containingClass?.interfaceIfDefaultImpls
val fromInterface = parentInterface?.typeParameters?.mapNotNull {
(it as? SymbolLightTypeParameter)?.copyTo(this@SymbolLightTypeParameterList)
}.orEmpty()
fromInterface + it.typeParameters.mapIndexed { index, parameter ->
SymbolLightTypeParameter(
ktAnalysisSession = this,
parent = this@SymbolLightTypeParameterList,
index = index,
index = fromInterface.size + index,
typeParameterSymbol = parameter,
)
}
@@ -31,6 +31,9 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.light.classes.symbol.annotations.*
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForInterface
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForInterfaceDefaultImpls
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
@@ -287,6 +290,12 @@ internal fun hasTypeParameters(
it.typeParameters.isNotEmpty()
}
internal val SymbolLightClassBase.interfaceIfDefaultImpls: SymbolLightClassForInterface?
get() = (this as? SymbolLightClassForInterfaceDefaultImpls)?.containingClass
internal val SymbolLightClassBase.isDefaultImplsForInterfaceWithTypeParameters: Boolean
get() = interfaceIfDefaultImpls?.hasTypeParameters() ?: false
internal fun KtSymbolPointer<*>.isValid(ktModule: KtModule): Boolean = analyzeForLightClasses(ktModule) {
restoreSymbol() != null
}
@@ -102,6 +102,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {
@@ -102,6 +102,12 @@ public class SymbolLightClassesEqualityByFqNameForLibraryTestGenerated extends A
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {
@@ -102,6 +102,12 @@ public class SymbolLightClassesParentingByFqNameForLibraryTestGenerated extends
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {
@@ -102,6 +102,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {
@@ -102,6 +102,12 @@ public class SymbolLightClassesEqualityByFqNameForSourceTestGenerated extends Ab
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {
@@ -102,6 +102,12 @@ public class SymbolLightClassesParentingByFqNameForSourceTestGenerated extends A
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DataClassWithCustomImplementedMembers.kt");
}
@Test
@TestMetadata("DefaultImplsWithTypeParameters.kt")
public void testDefaultImplsWithTypeParameters() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/DefaultImplsWithTypeParameters.kt");
}
@Test
@TestMetadata("DelegatedNested.kt")
public void testDelegatedNested() throws Exception {