[FIR] Fix bounds check for inner classes of generic outer classes
#KT-61068 Fixed #KT-35566
This commit is contained in:
committed by
Space Team
parent
5e49b472f8
commit
b41e5abcfa
+6
@@ -13743,6 +13743,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("innerClassGenericBounds.kt")
|
||||||
|
public void testInnerClassGenericBounds() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("innerSuperCall.kt")
|
@TestMetadata("innerSuperCall.kt")
|
||||||
public void testInnerSuperCall() throws Exception {
|
public void testInnerSuperCall() throws Exception {
|
||||||
|
|||||||
+6
@@ -13743,6 +13743,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
|
|||||||
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("innerClassGenericBounds.kt")
|
||||||
|
public void testInnerClassGenericBounds() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("innerSuperCall.kt")
|
@TestMetadata("innerSuperCall.kt")
|
||||||
public void testInnerSuperCall() throws Exception {
|
public void testInnerSuperCall() throws Exception {
|
||||||
|
|||||||
+6
@@ -13743,6 +13743,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
|||||||
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("innerClassGenericBounds.kt")
|
||||||
|
public void testInnerClassGenericBounds() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("innerSuperCall.kt")
|
@TestMetadata("innerSuperCall.kt")
|
||||||
public void testInnerSuperCall() throws Exception {
|
public void testInnerSuperCall() throws Exception {
|
||||||
|
|||||||
+6
@@ -13749,6 +13749,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("innerClassGenericBounds.kt")
|
||||||
|
public void testInnerClassGenericBounds() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("innerSuperCall.kt")
|
@TestMetadata("innerSuperCall.kt")
|
||||||
public void testInnerSuperCall() throws Exception {
|
public void testInnerSuperCall() throws Exception {
|
||||||
|
|||||||
+7
-5
@@ -219,13 +219,15 @@ fun ConeClassLikeType.fullyExpandedTypeWithSource(
|
|||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
): ConeClassLikeType? {
|
): ConeClassLikeType? {
|
||||||
val typeRefAndSourcesForArguments = extractArgumentsTypeRefAndSource(typeRef) ?: return null
|
val typeRefAndSourcesForArguments = extractArgumentsTypeRefAndSource(typeRef) ?: return null
|
||||||
// Avoid issues with nested type aliases and context receivers on function types as source information isn't returned.
|
|
||||||
if (typeRefAndSourcesForArguments.size != typeArguments.size) return null
|
|
||||||
|
|
||||||
// Add source information to arguments of non-expanded type, which is preserved during expansion.
|
// Add source information to arguments of non-expanded type, which is preserved during expansion.
|
||||||
val typeArguments =
|
val typeArguments = typeArguments.mapIndexed { i, projection ->
|
||||||
typeArguments.zip(typeRefAndSourcesForArguments) { projection, source -> projection.withSource(source) }
|
// typeRefAndSourcesForArguments can have fewer elements than there are type arguments
|
||||||
.toTypedArray()
|
// because in FIR, inner types of generic outer types have the generic arguments of the outer type added to the end of their list
|
||||||
|
// of type arguments but there is no source for them.
|
||||||
|
val source = typeRefAndSourcesForArguments.elementAtOrNull(i) ?: return@mapIndexed projection
|
||||||
|
projection.withSource(source)
|
||||||
|
}.toTypedArray()
|
||||||
|
|
||||||
return withArguments(typeArguments).fullyExpandedType(useSiteSession)
|
return withArguments(typeArguments).fullyExpandedType(useSiteSession)
|
||||||
}
|
}
|
||||||
|
|||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// ISSUE: KT-61068, KT-35566
|
||||||
|
// FILE: generic.kt
|
||||||
|
package generic
|
||||||
|
|
||||||
|
interface Foo
|
||||||
|
|
||||||
|
open class SuperOuter<T> {
|
||||||
|
open inner class SuperInner<D : Foo>(database: D)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubOuter : SuperOuter<Unit>() {
|
||||||
|
inner class SubInner(database: Any?) : SuperInner<<!UPPER_BOUND_VIOLATED!>Any?<!>>(<!ARGUMENT_TYPE_MISMATCH!>database<!>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: nongeneric.kt
|
||||||
|
package nongeneric
|
||||||
|
|
||||||
|
interface Foo
|
||||||
|
|
||||||
|
open class SuperOuter {
|
||||||
|
open inner class SuperInner<D : Foo>(database: D)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubOuter : SuperOuter() {
|
||||||
|
inner class SubInner(database: Any?) : SuperInner<<!UPPER_BOUND_VIOLATED!>Any?<!>>(<!ARGUMENT_TYPE_MISMATCH!>database<!>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: kt35566.kt
|
||||||
|
package kt35566
|
||||||
|
|
||||||
|
open class Case1<K : Number> {
|
||||||
|
open inner class Case1_1<L> : Case1<Int>() where L : CharSequence {
|
||||||
|
var x: L? = null
|
||||||
|
|
||||||
|
inner class Case1_2<M>(m: M) : Case1<K>.Case1_1<<!UPPER_BOUND_VIOLATED!>M<!>>() where M : Map<K, L> {
|
||||||
|
init {
|
||||||
|
x = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// ISSUE: KT-61068, KT-35566
|
||||||
|
// FILE: generic.kt
|
||||||
|
package generic
|
||||||
|
|
||||||
|
interface Foo
|
||||||
|
|
||||||
|
open class SuperOuter<T> {
|
||||||
|
open inner class SuperInner<D : Foo>(database: D)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubOuter : SuperOuter<Unit>() {
|
||||||
|
inner class SubInner(database: Any?) : SuperInner<Any?>(database)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: nongeneric.kt
|
||||||
|
package nongeneric
|
||||||
|
|
||||||
|
interface Foo
|
||||||
|
|
||||||
|
open class SuperOuter {
|
||||||
|
open inner class SuperInner<D : Foo>(database: D)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubOuter : SuperOuter() {
|
||||||
|
inner class SubInner(database: Any?) : SuperInner<<!UPPER_BOUND_VIOLATED!>Any?<!>>(database)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: kt35566.kt
|
||||||
|
package kt35566
|
||||||
|
|
||||||
|
open class Case1<K : Number> {
|
||||||
|
open inner class Case1_1<L> : Case1<Int>() where L : CharSequence {
|
||||||
|
var x: L? = null
|
||||||
|
|
||||||
|
inner class Case1_2<M>(m: M) : Case1<K>.Case1_1<M>() where M : Map<K, L> {
|
||||||
|
init {
|
||||||
|
x = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+6
@@ -13749,6 +13749,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("innerClassGenericBounds.kt")
|
||||||
|
public void testInnerClassGenericBounds() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("innerSuperCall.kt")
|
@TestMetadata("innerSuperCall.kt")
|
||||||
public void testInnerSuperCall() throws Exception {
|
public void testInnerSuperCall() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user