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> {
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.AA
import a.AAA
interface B1 {
fun produceA(): A<String>.Inner<Int, Unit>
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> {
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.AA
import a.AAA
interface B2 {
fun consumeA(a: A<Int, String, Double>.Inner<B2>)
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
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())
^
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())
^
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())
^
COMPILATION_ERROR
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
@@ -5,8 +5,13 @@ import b.B2
fun testA(b1: B1, b2: B2) {
b2.consumeA(b1.produceA())
b2.consumeA(b1.produceAGeneric("foo"))
}
fun testAA(b1: B1, b2: B2) {
b2.consumeAA(b1.produceAA())
}
fun testAAA(b1: B1, b2: B2) {
b2.consumeAAA(b1.produceAAA())
}
@@ -259,11 +259,13 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
fun testMissingDependencyConflictingLibraries() {
val library1 = copyJarFileWithoutEntry(
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(
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))
}
@@ -51,19 +51,20 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
private val isInner: Boolean,
numberOfDeclaredTypeParameters: Int
) : 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(
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 getModality() = Modality.FINAL
override fun getVisibility() = Visibilities.PUBLIC
override fun getTypeConstructor() = typeConstructor
override fun getDeclaredTypeParameters() = typeParameters
override fun getDeclaredTypeParameters() = declaredTypeParameters
override fun isInner() = isInner
override fun isCompanionObject() = false