diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt index f7afd8aa98d..876b42370c4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility import org.jetbrains.kotlin.fir.declarations.utils.isExpect @@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.extensions.* import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.ensureResolved @@ -321,7 +323,9 @@ class FirStatusResolver( return !type.lookupTag.typeParameterSymbol.fir.variance.allowsPosition(requiredVariance) } if (type is ConeClassLikeType) { - for (argument in type.typeArguments) { + val classLike = type.lookupTag.toSymbol(session)?.fir + for ((index, argument) in type.typeArguments.withIndex()) { + if (classLike?.typeParameters?.getOrNull(index) is FirOuterClassTypeParameterRef) continue val (argType, requiredVarianceForArgument) = when (argument) { is ConeKotlinTypeProjectionOut -> argument.type to requiredVariance is ConeKotlinTypeProjectionIn -> argument.type to requiredVariance.opposite() diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.kt b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.kt index ba1de56c81e..d16ce063fc1 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.kt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.kt @@ -3,6 +3,8 @@ class A(t: T) { private val t: T = t // PRIVATE_TO_THIS + private val i: B = B() + fun test() { val x: T = t // Ok val y: T = this.t // Ok @@ -11,4 +13,14 @@ class A(t: T) { fun foo(a: A) { val x: String = a.t // Invisible! } -} \ No newline at end of file + + fun bar(a: A<*>) { + a.t // Invisible! + } + + inner class B { + fun baz(a: A<*>) { + a.i + } + } +} diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt index 58de82c9300..d28337cd2dd 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt @@ -7,6 +7,9 @@ FILE: privateToThis.fir.kt private/*private to this*/ final val t: R|T| = R|/t| private/*private to this*/ get(): R|T| + private final val i: R|A.B| = this@R|/A|.R|SubstitutionOverride|() + private get(): R|A.B| + public final fun test(): R|kotlin/Unit| { lval x: R|T| = this@R|/A|.R|/A.t| lval y: R|T| = this@R|/A|.R|/A.t| @@ -16,4 +19,19 @@ FILE: privateToThis.fir.kt lval x: R|kotlin/String| = R|/a|.# } + public final fun bar(a: R|A<*>|): R|kotlin/Unit| { + R|/a|.# + } + + public final inner class B : R|kotlin/Any| { + public A.constructor(): R|A.B| { + super() + } + + public final fun baz(a: R|A<*>|): R|kotlin/Unit| { + R|/a|.R|SubstitutionOverride|>| + } + + } + } diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThis.kt b/compiler/testData/diagnostics/tests/visibility/privateToThis.kt index 46e7452bd48..4228d8cf616 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThis.kt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThis.kt @@ -3,6 +3,8 @@ class A(t: T) { private val t: T = t // PRIVATE_TO_THIS + private val i: B = B() + fun test() { val x: T = t // Ok val y: T = this.t // Ok @@ -11,4 +13,14 @@ class A(t: T) { fun foo(a: A) { val x: String = a.t // Invisible! } + + fun bar(a: A<*>) { + a.t // Invisible! + } + + inner class B { + fun baz(a: A<*>) { + a.i + } + } } diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThis.txt b/compiler/testData/diagnostics/tests/visibility/privateToThis.txt index 13be1569a4c..b9933e64f68 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThis.txt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThis.txt @@ -2,10 +2,20 @@ package public final class A { public constructor A(/*0*/ t: T) + private final val i: A.B private/*private to this*/ final val t: T + public final fun bar(/*0*/ a: A<*>): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun foo(/*0*/ a: A): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final fun test(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final inner class B /*captured type parameters: /*0*/ in T*/ { + public constructor B() + public final fun baz(/*0*/ a: A<*>): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } }