Fix construction of Mock classes in case of generic inner types

This fixes testMissingDependencyConflictingLibraries for NI and also
 fixes changed test for OI as well
This commit is contained in:
Mikhail Zarechenskiy
2020-02-18 17:13:58 +03:00
parent 83824d0ba6
commit d169435300
8 changed files with 49 additions and 9 deletions
@@ -7,3 +7,9 @@ class A<T> {
class AA<T> { class AA<T> {
inner class Inner<U, V> inner class Inner<U, V>
} }
class AAA<T> {
inner class Inner<K> {
inner class InnerInner<S>
}
}
@@ -2,8 +2,11 @@ package b
import a.A import a.A
import a.AA import a.AA
import a.AAA
interface B1 { interface B1 {
fun produceA(): A<String>.Inner<Int, Unit> fun produceA(): A<String>.Inner<Int, Unit>
fun produceAA(): AA<Int>.Inner<Unit, String> fun produceAA(): AA<Int>.Inner<Unit, String>
fun <T> produceAGeneric(t: T): A<String>.Inner<Int, Unit>
fun produceAAA(): AAA<String>.Inner<Int>.InnerInner<Unit>
} }
@@ -7,3 +7,9 @@ class A<T, U: CharSequence, V> {
class AA<T, U> { class AA<T, U> {
inner class Inner<V> inner class Inner<V>
} }
class AAA<T> {
inner class Inner<K> {
inner class InnerInner<S>
}
}
@@ -2,8 +2,10 @@ package b
import a.A import a.A
import a.AA import a.AA
import a.AAA
interface B2 { interface B2 {
fun consumeA(a: A<Int, String, Double>.Inner<B2>) fun consumeA(a: A<Int, String, Double>.Inner<B2>)
fun consumeAA(a: AA<Int, Unit>.Inner<String>) fun consumeAA(a: AA<Int, Unit>.Inner<String>)
fun consumeAAA(a: AAA<String>.Inner<Int>.InnerInner<Unit>)
} }
@@ -7,13 +7,28 @@ compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictin
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:7:20: error: cannot access class 'a.A.Inner'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:7:20: error: cannot access class 'a.A.Inner'. Check your module classpath for missing or conflicting dependencies
b2.consumeA(b1.produceA()) b2.consumeA(b1.produceA())
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:11:8: error: cannot access class 'a.AA.Inner'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:8:8: error: cannot access class 'a.A.Inner'. Check your module classpath for missing or conflicting dependencies
b2.consumeA(b1.produceAGeneric("foo"))
^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:8:17: error: type mismatch: inferred type is A<String>.Inner<Int, Unit> but A<Int, String, Double>.Inner<B2> was expected
b2.consumeA(b1.produceAGeneric("foo"))
^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:8:20: error: cannot access class 'a.A.Inner'. Check your module classpath for missing or conflicting dependencies
b2.consumeA(b1.produceAGeneric("foo"))
^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:12:8: error: cannot access class 'a.AA.Inner'. Check your module classpath for missing or conflicting dependencies
b2.consumeAA(b1.produceAA()) b2.consumeAA(b1.produceAA())
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:11:18: error: type mismatch: inferred type is AA<Int>.Inner<Unit, String> but AA<Int, Unit>.Inner<String> was expected compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:12:18: error: type mismatch: inferred type is AA<Int>.Inner<Unit, String> but AA<Int, Unit>.Inner<String> was expected
b2.consumeAA(b1.produceAA()) b2.consumeAA(b1.produceAA())
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:11:21: error: cannot access class 'a.AA.Inner'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:12:21: error: cannot access class 'a.AA.Inner'. Check your module classpath for missing or conflicting dependencies
b2.consumeAA(b1.produceAA()) b2.consumeAA(b1.produceAA())
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:16:8: error: cannot access class 'a.AAA.Inner.InnerInner'. Check your module classpath for missing or conflicting dependencies
b2.consumeAAA(b1.produceAAA())
^
compiler/testData/compileKotlinAgainstCustomBinaries/missingDependencyConflictingLibraries/source.kt:16:22: error: cannot access class 'a.AAA.Inner.InnerInner'. Check your module classpath for missing or conflicting dependencies
b2.consumeAAA(b1.produceAAA())
^
COMPILATION_ERROR COMPILATION_ERROR
@@ -5,8 +5,13 @@ import b.B2
fun testA(b1: B1, b2: B2) { fun testA(b1: B1, b2: B2) {
b2.consumeA(b1.produceA()) b2.consumeA(b1.produceA())
b2.consumeA(b1.produceAGeneric("foo"))
} }
fun testAA(b1: B1, b2: B2) { fun testAA(b1: B1, b2: B2) {
b2.consumeAA(b1.produceAA()) b2.consumeAA(b1.produceAA())
} }
fun testAAA(b1: B1, b2: B2) {
b2.consumeAAA(b1.produceAAA())
}
@@ -259,11 +259,13 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
fun testMissingDependencyConflictingLibraries() { fun testMissingDependencyConflictingLibraries() {
val library1 = copyJarFileWithoutEntry( val library1 = copyJarFileWithoutEntry(
compileLibrary("library1"), compileLibrary("library1"),
"a/A.class", "a/A\$Inner.class", "a/AA.class", "a/AA\$Inner.class" "a/A.class", "a/A\$Inner.class", "a/AA.class", "a/AA\$Inner.class",
"a/AAA.class", "a/AAA\$Inner.class", "a/AAA\$Inner\$Inner.class"
) )
val library2 = copyJarFileWithoutEntry( val library2 = copyJarFileWithoutEntry(
compileLibrary("library2"), compileLibrary("library2"),
"a/A.class", "a/A\$Inner.class", "a/AA.class", "a/AA\$Inner.class" "a/A.class", "a/A\$Inner.class", "a/AA.class", "a/AA\$Inner.class",
"a/AAA.class", "a/AAA\$Inner.class", "a/AAA\$Inner\$Inner.class"
) )
compileKotlin("source.kt", tmpdir, listOf(library1, library2)) compileKotlin("source.kt", tmpdir, listOf(library1, library2))
} }
@@ -51,19 +51,20 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
private val isInner: Boolean, private val isInner: Boolean,
numberOfDeclaredTypeParameters: Int numberOfDeclaredTypeParameters: Int
) : ClassDescriptorBase(storageManager, container, name, SourceElement.NO_SOURCE, /* isExternal = */ false) { ) : ClassDescriptorBase(storageManager, container, name, SourceElement.NO_SOURCE, /* isExternal = */ false) {
private val typeParameters = (0 until numberOfDeclaredTypeParameters).map { index -> private val declaredTypeParameters = (0 until numberOfDeclaredTypeParameters).map { index ->
TypeParameterDescriptorImpl.createWithDefaultBound( TypeParameterDescriptorImpl.createWithDefaultBound(
this, Annotations.EMPTY, false, Variance.INVARIANT, Name.identifier("T$index"), index, storageManager this, Annotations.EMPTY, false, Variance.INVARIANT, Name.identifier("T$index"), index, storageManager
) )
} }
private val typeConstructor = ClassTypeConstructorImpl(this, typeParameters, setOf(module.builtIns.anyType), storageManager) private val typeConstructor =
ClassTypeConstructorImpl(this, computeConstructorTypeParameters(), setOf(module.builtIns.anyType), storageManager)
override fun getKind() = ClassKind.CLASS override fun getKind() = ClassKind.CLASS
override fun getModality() = Modality.FINAL override fun getModality() = Modality.FINAL
override fun getVisibility() = Visibilities.PUBLIC override fun getVisibility() = Visibilities.PUBLIC
override fun getTypeConstructor() = typeConstructor override fun getTypeConstructor() = typeConstructor
override fun getDeclaredTypeParameters() = typeParameters override fun getDeclaredTypeParameters() = declaredTypeParameters
override fun isInner() = isInner override fun isInner() = isInner
override fun isCompanionObject() = false override fun isCompanionObject() = false