ExpectActualUtils: repairSuperTypeList should consider type parameters

This commit is contained in:
Dmitry Gridin
2019-08-26 16:22:24 +07:00
parent 03141be11e
commit ea02d0c632
10 changed files with 63 additions and 25 deletions
@@ -217,6 +217,11 @@ private fun KtPsiFactory.repairSuperTypeList(
context: BindingContext context: BindingContext
): Collection<String> { ): Collection<String> {
val superNames = linkedSetOf<String>() val superNames = linkedSetOf<String>()
val typeParametersFqName = context[BindingContext.DECLARATION_TO_DESCRIPTOR, original]
?.safeAs<ClassDescriptor>()
?.declaredTypeParameters?.mapNotNull { it.fqNameOrNull()?.asString() }.orEmpty()
checker.runInContext(checker.existingTypeNames + typeParametersFqName) {
generated.superTypeListEntries.zip(original.superTypeListEntries).forEach { (generatedEntry, originalEntry) -> generated.superTypeListEntries.zip(original.superTypeListEntries).forEach { (generatedEntry, originalEntry) ->
val superType = context[BindingContext.TYPE, originalEntry.typeReference] val superType = context[BindingContext.TYPE, originalEntry.typeReference]
val superClassDescriptor = superType?.constructor?.declarationDescriptor as? ClassDescriptor ?: return@forEach val superClassDescriptor = superType?.constructor?.declarationDescriptor as? ClassDescriptor ?: return@forEach
@@ -242,7 +247,7 @@ private fun KtPsiFactory.repairSuperTypeList(
generatedEntry.replace(newGeneratedEntry).safeAs<KtElement>()?.addToBeShortenedDescendantsToWaitingSet() generatedEntry.replace(newGeneratedEntry).safeAs<KtElement>()?.addToBeShortenedDescendantsToWaitingSet()
} }
} }
}
if (generated.superTypeListEntries.isEmpty()) generated.getSuperTypeList()?.delete() if (generated.superTypeListEntries.isEmpty()) generated.getSuperTypeList()?.delete()
return superNames return superNames
} }
@@ -0,0 +1,7 @@
// My: to be implemented
// DISABLE-ERRORS
@Target(AnnotationTarget.TYPE, AnnotationTarget.VALUE_PARAMETER)
annotation class SimpleA
class Common<T>
@@ -0,0 +1,8 @@
// My: to be implemented
// DISABLE-ERRORS
@Target(AnnotationTarget.TYPE, AnnotationTarget.VALUE_PARAMETER)
annotation class SimpleA
class Common<T>
expect class My<T> : Common<@SimpleA T>
@@ -0,0 +1,4 @@
// "Create expected class in common module testModule_Common" "true"
// DISABLE-ERRORS
actual class <caret>My<T> : Common<@SimpleA T>()
@@ -0,0 +1,4 @@
// "Create expected class in common module testModule_Common" "true"
// DISABLE-ERRORS
actual class My<T> : Common<@SimpleA T>()
@@ -1 +1,2 @@
@Target(AnnotationTarget.TYPE, AnnotationTarget.VALUE_PARAMETER)
annotation class SimpleA annotation class SimpleA
@@ -1 +1 @@
expect fun @receiver:SimpleA String.myExtension() expect fun <T : @SimpleA List<@SimpleA List<@SimpleA String>>> @receiver:SimpleA String.myExtension(@SimpleA a: @SimpleA List<@SimpleA List<@SimpleA String>>)
@@ -1,4 +1,6 @@
// "Create expected function in common module testModule_Common" "true" // "Create expected function in common module testModule_Common" "true"
// DISABLE-ERRORS // DISABLE-ERRORS
actual fun @receiver:SimpleA String.<caret>myExtension() { println(this) } actual fun <T : @SimpleA List<@SimpleA List<@SimpleA String>>>@receiver:SimpleA String.<caret>myExtension(@SimpleA a: @SimpleA List<@SimpleA List<@SimpleA String>>) {
println(this)
}
@@ -1,4 +1,6 @@
// "Create expected function in common module testModule_Common" "true" // "Create expected function in common module testModule_Common" "true"
// DISABLE-ERRORS // DISABLE-ERRORS
actual fun @receiver:SimpleA String.<caret>myExtension() { println(this) } actual fun <T : @SimpleA List<@SimpleA List<@SimpleA String>>>@receiver:SimpleA String.myExtension(@SimpleA a: @SimpleA List<@SimpleA List<@SimpleA String>>) {
println(this)
}
@@ -332,6 +332,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
runTest("idea/testData/multiModuleQuickFix/createExpect/class/"); runTest("idea/testData/multiModuleQuickFix/createExpect/class/");
} }
@TestMetadata("classWithSuperClassAndTypeParameter")
public void testClassWithSuperClassAndTypeParameter() throws Exception {
runTest("idea/testData/multiModuleQuickFix/createExpect/classWithSuperClassAndTypeParameter/");
}
@TestMetadata("classWithSuperTypeFromOtherPackage") @TestMetadata("classWithSuperTypeFromOtherPackage")
public void testClassWithSuperTypeFromOtherPackage() throws Exception { public void testClassWithSuperTypeFromOtherPackage() throws Exception {
runTest("idea/testData/multiModuleQuickFix/createExpect/classWithSuperTypeFromOtherPackage/"); runTest("idea/testData/multiModuleQuickFix/createExpect/classWithSuperTypeFromOtherPackage/");