diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/compilerPhase.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/compilerPhase.fir.txt index 517a3bb45cb..88cd5dcf4a0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/compilerPhase.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/compilerPhase.fir.txt @@ -27,8 +27,8 @@ FILE: compilerPhase.kt super() } - private/*private to this*/ final val lower: R|CompilerPhase| = R|/lower| - private/*private to this*/ get(): R|CompilerPhase| + private final val lower: R|CompilerPhase| = R|/lower| + private get(): R|CompilerPhase| public open override fun invoke(phaseConfig: R|PhaseConfig|, phaserState: R|PhaserState|, context: R|Context|, input: R|Data|): R|Data| { lval output: R|Data| = when () { 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 93cc5ab4744..b97a7f46297 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,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.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 @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.fir.toEffectiveVisibility import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visibilityChecker +import org.jetbrains.kotlin.types.EnrichedProjectionKind import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment @@ -358,16 +358,21 @@ class FirStatusResolver( if (type is ConeTypeParameterType) { return !type.lookupTag.typeParameterSymbol.fir.variance.allowsPosition(requiredVariance) } + // TODO: handle other types (like flexible, DNN, captured, ...) KT-62134 if (type is ConeClassLikeType) { 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() - is ConeKotlinTypeProjection -> argument.type to Variance.INVARIANT - is ConeStarProjection -> continue + val typeParameterRef = classLike?.typeParameters?.getOrNull(index) + if (typeParameterRef !is FirTypeParameter) continue + val requiredVarianceForArgument = when ( + EnrichedProjectionKind.getEffectiveProjectionKind(typeParameterRef.variance, argument.variance) + ) { + EnrichedProjectionKind.OUT -> requiredVariance + EnrichedProjectionKind.IN -> requiredVariance.opposite() + EnrichedProjectionKind.INV -> Variance.INVARIANT + EnrichedProjectionKind.STAR -> continue // CONFLICTING_PROJECTION error was reported } + val argType = argument.type ?: continue if (contradictsWith(argType, requiredVarianceForArgument)) { return true } @@ -376,6 +381,14 @@ class FirStatusResolver( return false } + private val ConeTypeProjection.variance: Variance + get() = when (this.kind) { + ProjectionKind.STAR -> Variance.OUT_VARIANCE + ProjectionKind.IN -> Variance.IN_VARIANCE + ProjectionKind.OUT -> Variance.OUT_VARIANCE + ProjectionKind.INVARIANT -> Variance.INVARIANT + } + private fun resolveVisibility( declaration: FirDeclaration, containingClass: FirClass?, diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.kt b/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.kt deleted file mode 100644 index 556d17a8429..00000000000 --- a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -// ISSUE: KT-61844 -// FIR_DUMP - -class Foo( - private val transformer: (I) -> O, -) { - fun transform(foo: Foo, bar: I) { - foo.transformer(bar) - foo.transformer.invoke(bar) - } -} diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.txt b/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.txt index d45abdf737f..b1b8f0fda77 100644 --- a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.txt +++ b/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.fir.txt @@ -1,15 +1,15 @@ -FILE: privateInvokeOwner.fir.kt +FILE: privateInvokeOwner.kt public final class Foo : R|kotlin/Any| { public constructor(transformer: R|(I) -> O|): R|Foo| { super() } - private/*private to this*/ final val transformer: R|(I) -> O| = R|/transformer| - private/*private to this*/ get(): R|(I) -> O| + private final val transformer: R|(I) -> O| = R|/transformer| + private get(): R|(I) -> O| public final fun transform(foo: R|Foo|, bar: R|I|): R|kotlin/Unit| { - R|/foo|.' cannot be invoked as a function>#(R|/bar|) - R|/foo|.R|SubstitutionOverride O|>#|.R|SubstitutionOverride|(R|/bar|) + R|/foo|.R|SubstitutionOverride O|>|.R|SubstitutionOverride|(R|/bar|) + R|/foo|.R|SubstitutionOverride O|>|.R|SubstitutionOverride|(R|/bar|) } } diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.kt b/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.kt index 7237226db9d..94024e35472 100644 --- a/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.kt +++ b/compiler/testData/diagnostics/tests/resolve/invoke/privateInvokeOwner.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-61844 // FIR_DUMP