diff --git a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/typeParameters.kt b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/typeParameters.kt index e267b1ada73..33ba23f33c2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/typeParameters.kt +++ b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/typeParameters.kt @@ -1,7 +1,7 @@ interface List { operator fun get(index: Int): T - infix fun concat(other: List): List + infix fun concat(other: List<T>): List } typealias StringList = List diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 938c9e83588..0535c3fd68b 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.types.Variance import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty @@ -436,6 +437,20 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("typeA") parameter("typeB") } + + val TYPE_VARIANCE_CONFLICT by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("typeParameter") + parameter("typeParameterVariance") + parameter("variance") + parameter("containingType") + } + + val TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("typeParameter") + parameter("typeParameterVariance") + parameter("variance") + parameter("containingType") + } } val REFLECTION by object : DiagnosticGroup("Reflection") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index b1896ed864d..4012cb5d084 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -64,6 +64,7 @@ import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.types.Variance /* * This file was generated automatically @@ -294,6 +295,8 @@ object FirErrors { val DYNAMIC_UPPER_BOUND by error0() val INCOMPATIBLE_TYPES by error2() val INCOMPATIBLE_TYPES_WARNING by warning2() + val TYPE_VARIANCE_CONFLICT by error4(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE by error4(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) // Reflection val EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index d7d032966dc..7010cc4feac 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirDelegationInInterfac import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirFunctionTypeParametersSyntaxChecker import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirTypeParameterSyntaxChecker import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirReservedUnderscoreDeclarationChecker +import org.jetbrains.kotlin.fir.declarations.FirClass object CommonDeclarationCheckers : DeclarationCheckers() { override val basicDeclarationCheckers: Set @@ -65,6 +66,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirNotImplementedOverrideChecker, FirThrowableSubclassChecker, FirOpenMemberChecker, + FirClassVarianceChecker ) override val regularClassCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt new file mode 100644 index 00000000000..de6a6717531 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt @@ -0,0 +1,190 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.declaration + +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure + +object FirClassVarianceChecker : FirClassChecker() { + override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { + checkTypeParameters(declaration.typeParameters, Variance.OUT_VARIANCE, context, reporter) + + for (superTypeRef in declaration.superTypeRefs) { + checkVarianceConflict(superTypeRef, Variance.OUT_VARIANCE, context, reporter) + } + + for (member in declaration.declarations) { + if (member is FirMemberDeclaration) { + if (Visibilities.isPrivate(member.status.visibility)) { + continue + } + } + + if (member is FirTypeParameterRefsOwner) { + checkTypeParameters(member.typeParameters, Variance.IN_VARIANCE, context, reporter) + } + + if (member is FirCallableDeclaration<*>) { + checkCallableDeclaration(member, context, reporter) + } + } + } + + private fun checkCallableDeclaration( + member: FirCallableDeclaration<*>, + context: CheckerContext, + reporter: DiagnosticReporter + ) { + val memberSource = member.source + if (member is FirSimpleFunction) { + if (memberSource != null && memberSource.kind !is FirFakeSourceElementKind) { + for (param in member.valueParameters) { + checkVarianceConflict(param.returnTypeRef, Variance.IN_VARIANCE, context, reporter) + } + } + } + + val returnTypeVariance = + if (member is FirProperty && member.isVar) Variance.INVARIANT else Variance.OUT_VARIANCE + + var returnSource = member.returnTypeRef.source + if (returnSource != null && memberSource != null) { + if (returnSource.kind is FirFakeSourceElementKind && memberSource.kind !is FirFakeSourceElementKind) { + returnSource = memberSource + } + } + + checkVarianceConflict(member.returnTypeRef, returnTypeVariance, context, reporter, returnSource) + + val receiverTypeRef = member.receiverTypeRef + if (receiverTypeRef != null) { + checkVarianceConflict(receiverTypeRef, Variance.IN_VARIANCE, context, reporter) + } + } + + private fun checkTypeParameters( + typeParameters: List, variance: Variance, + context: CheckerContext, reporter: DiagnosticReporter + ) { + for (typeParameter in typeParameters) { + if (typeParameter is FirTypeParameter) { + for (bound in typeParameter.bounds) { + checkVarianceConflict(bound, variance, context, reporter) + } + } + } + } + + private fun checkVarianceConflict( + type: FirTypeRef, variance: Variance, + context: CheckerContext, reporter: DiagnosticReporter, + source: FirSourceElement? = null + ) { + checkVarianceConflict(type.coneType, variance, type, type.coneType, context, reporter, source) + } + + private fun checkVarianceConflict( + type: ConeKotlinType, + variance: Variance, + typeRef: FirTypeRef?, + containingType: ConeKotlinType, + context: CheckerContext, + reporter: DiagnosticReporter, + source: FirSourceElement? = null, + isInAbbreviation: Boolean = false + ) { + if (type is ConeTypeParameterType) { + val fullyExpandedType = type.fullyExpandedType(context.session) + val typeParameter = type.lookupTag.typeParameterSymbol.fir + val resultSource = source ?: typeRef?.source + if (resultSource != null && + !typeParameter.variance.allowsPosition(variance) && + !fullyExpandedType.attributes.contains(CompilerConeAttributes.UnsafeVariance) + ) { + val factory = + if (isInAbbreviation) FirErrors.TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE else FirErrors.TYPE_VARIANCE_CONFLICT + reporter.report( + factory.on( + resultSource, + typeParameter.symbol, + typeParameter.variance, + variance, + containingType + ), + context + ) + } + return + } + + if (type is ConeClassLikeType) { + val fullyExpandedType = type.fullyExpandedType(context.session) + val declFir = fullyExpandedType.lookupTag.toSymbol(context.session)?.fir + if (declFir is FirClass<*>) { + for ((index, typeArgument) in fullyExpandedType.typeArguments.withIndex()) { + val paramVariance = (declFir.typeParameters.getOrNull(index) as? FirTypeParameter)?.variance ?: continue + + val argVariance = when (typeArgument.kind) { + ProjectionKind.IN -> Variance.IN_VARIANCE + ProjectionKind.OUT -> Variance.OUT_VARIANCE + ProjectionKind.INVARIANT -> Variance.INVARIANT + else -> continue + } + + val typeArgumentType = typeArgument.type ?: continue + + val projectionKind = TypeCheckingProcedure.getEffectiveProjectionKind(paramVariance, argVariance)!! + val newVariance = when (projectionKind) { + TypeCheckingProcedure.EnrichedProjectionKind.OUT -> variance + TypeCheckingProcedure.EnrichedProjectionKind.IN -> variance.opposite() + TypeCheckingProcedure.EnrichedProjectionKind.INV -> Variance.INVARIANT + TypeCheckingProcedure.EnrichedProjectionKind.STAR -> null // CONFLICTING_PROJECTION error was reported + } + + if (newVariance != null) { + val subTypeRef = extractChildFirTypeRef(typeRef, index) + + checkVarianceConflict( + typeArgumentType, newVariance, subTypeRef, containingType, + context, reporter,subTypeRef?.source ?: source, + fullyExpandedType != type + ) + } + } + } + } + } + + private fun extractChildFirTypeRef(typeRef: FirTypeRef?, index: Int): FirTypeRef? { + if (typeRef is FirResolvedTypeRef) { + val delegatedTypeRef = typeRef.delegatedTypeRef + if (delegatedTypeRef is FirUserTypeRef) { + val typeArgument = delegatedTypeRef.qualifier[0].typeArgumentList.typeArguments.elementAtOrNull(index) + if (typeArgument is FirTypeProjectionWithVariance) { + return typeArgument.typeRef + } + } else if (delegatedTypeRef is FirFunctionTypeRef) { + if (index < delegatedTypeRef.valueParameters.size) { + return delegatedTypeRef.valueParameters.elementAt(index).returnTypeRef + } + if (index == delegatedTypeRef.valueParameters.size) { + return delegatedTypeRef.returnTypeRef + } + } + } + + return null + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 1ec08513503..ceb67931558 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -5,9 +5,8 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics -import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages -import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap -import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer +import org.jetbrains.kotlin.diagnostics.rendering.* +import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_POSITION_VARIANCE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.AMBIGUOUS_CALLS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.FIR @@ -300,6 +299,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_IN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_IS_NOT_AN_EXPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_ON_LHS_OF_DOT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_VARIANCE_CONFLICT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNEXPECTED_SAFE_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNINITIALIZED_ENUM_COMPANION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNINITIALIZED_ENUM_ENTRY @@ -347,6 +348,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_MODIFIER_TA import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_SETTER_PARAMETER_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_SETTER_RETURN_TYPE +import org.jetbrains.kotlin.resolve.VarianceConflictDiagnosticData @Suppress("unused") class FirDefaultErrorMessages : DefaultErrorMessages.Extension { @@ -625,6 +627,17 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { map.put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE) map.put(INCOMPATIBLE_TYPES_WARNING, "Potentially incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE) + map.put( + TYPE_VARIANCE_CONFLICT, + "Type parameter {0} is declared as ''{1}'' but occurs in ''{2}'' position in type {3}", + SYMBOL, RENDER_POSITION_VARIANCE, RENDER_POSITION_VARIANCE, RENDER_TYPE + ) + map.put( + TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE, + "Type parameter {0} is declared as ''{1}'' but occurs in ''{2}'' position in abbreviated type {3}", + SYMBOL, RENDER_POSITION_VARIANCE, RENDER_POSITION_VARIANCE, RENDER_TYPE + ) + map.put( BOUNDS_NOT_ALLOWED_IF_BOUNDED_BY_TYPE_PARAMETER, "Type parameter cannot have any other bounds if it's bounded by another type parameter" diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt index 59cc552d97f..d0eac13e7a7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.utils.WeakPair import org.jetbrains.kotlin.fir.utils.component1 import org.jetbrains.kotlin.fir.utils.component2 @@ -93,8 +94,18 @@ private fun mapTypeAliasArguments( val type = (projection as? ConeKotlinTypeProjection)?.type ?: return null val symbol = (type as? ConeTypeParameterType)?.lookupTag?.symbol ?: return super.substituteArgument(projection) val mappedProjection = typeAliasMap[symbol] ?: return super.substituteArgument(projection) - val mappedType = (mappedProjection as? ConeKotlinTypeProjection)?.type.updateNullabilityIfNeeded(type) - ?: return mappedProjection + var mappedType = (mappedProjection as? ConeKotlinTypeProjection)?.type.updateNullabilityIfNeeded(type) + mappedType = when (mappedType) { + is ConeClassErrorType, + is ConeClassLikeTypeImpl, + is ConeDefinitelyNotNullType, + is ConeTypeParameterTypeImpl, + is ConeFlexibleType -> { + mappedType.withAttributes(type.attributes, useSiteSession.typeContext) + } + null -> return mappedProjection + else -> mappedType + } return when (mappedProjection.kind + projection.kind) { ProjectionKind.STAR -> ConeStarProjection diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.fir.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.fir.kt deleted file mode 100644 index 976d5e03690..00000000000 --- a/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -class Outer { - inner class Inner { - fun unsafe1(x: E) {} - fun unsafe2(x: Collection) {} - fun unsafe3(): F? = null - fun unsafe4(): Collection? = null - } - - // Should be errors - // Refinement of variance checker is needed - fun foo(x: Inner) {} - fun bar(): Inner? = null -} diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.kt index 11865acd8ee..ed2593a7c15 100644 --- a/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.kt +++ b/compiler/testData/diagnostics/tests/generics/innerClasses/innerVariance.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER class Outer { inner class Inner { diff --git a/compiler/testData/diagnostics/tests/kt13401.fir.kt b/compiler/testData/diagnostics/tests/kt13401.fir.kt index 758d2abddff..ff746e0535d 100644 --- a/compiler/testData/diagnostics/tests/kt13401.fir.kt +++ b/compiler/testData/diagnostics/tests/kt13401.fir.kt @@ -10,9 +10,9 @@ interface Super { } // Related variance errors class Owner { - inner class Inner(val u: U) { + inner class InnerT>(val u: U) { fun getT() = u } - fun foo(arg: Inner<*>) = arg.getT() -} \ No newline at end of file + fun foo(arg: Inner<*>) = arg.getT() +} diff --git a/compiler/testData/diagnostics/tests/typealias/kt14498.fir.kt b/compiler/testData/diagnostics/tests/typealias/kt14498.fir.kt index 37df74eb372..c0f9272a870 100644 --- a/compiler/testData/diagnostics/tests/typealias/kt14498.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/kt14498.fir.kt @@ -10,8 +10,8 @@ typealias AOut = Out typealias AInvOut = InvOut typealias AInvOutTT = AInvOut -class Test1 : A1 -class Test2 : A2 +class Test1 : A1<S> +class Test2 : A2<Any, S> class Test3 : AOut -class Test4 : AInvOut -class Test5 : AInvOutTT \ No newline at end of file +class Test4 : AInvOut<S, S> +class Test5 : AInvOutTT<S> diff --git a/compiler/testData/diagnostics/tests/typealias/kt14498a.fir.kt b/compiler/testData/diagnostics/tests/typealias/kt14498a.fir.kt index 9525f219a2f..394ba1f89b1 100644 --- a/compiler/testData/diagnostics/tests/typealias/kt14498a.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/kt14498a.fir.kt @@ -7,5 +7,5 @@ typealias A4 = Out> interface Q1 : Out> interface Q2 : Out> -interface Q3 : Out> -interface Q4 : Out> \ No newline at end of file +interface Q3 : OutS>> +interface Q4 : OutS>> diff --git a/compiler/testData/diagnostics/tests/variance/Class.fir.kt b/compiler/testData/diagnostics/tests/variance/Class.fir.kt deleted file mode 100644 index 09ebdfe5ea5..00000000000 --- a/compiler/testData/diagnostics/tests/variance/Class.fir.kt +++ /dev/null @@ -1,23 +0,0 @@ -interface In -interface Out -interface Inv - -interface TypeBounds1 -interface TypeBounds2 -interface TypeBounds3 -interface TypeBounds4> -interface TypeBounds5> - -interface WhereTypeBounds1 where X : I -interface WhereTypeBounds2 where X : O -interface WhereTypeBounds3 where X : P -interface WhereTypeBounds4 where X : In -interface WhereTypeBounds5 where X : In - -class SubClass1 : Out -class SubClass2 : Out -class SubClass3 : Out

-class SubClass4 : In -class SubClass5 : In -class SubClass6 : Inv -class SubClass7 : Inv diff --git a/compiler/testData/diagnostics/tests/variance/Class.kt b/compiler/testData/diagnostics/tests/variance/Class.kt index a4148f9ac16..d650ce5586a 100644 --- a/compiler/testData/diagnostics/tests/variance/Class.kt +++ b/compiler/testData/diagnostics/tests/variance/Class.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface In interface Out interface Inv diff --git a/compiler/testData/diagnostics/tests/variance/Function.fir.kt b/compiler/testData/diagnostics/tests/variance/Function.fir.kt deleted file mode 100644 index a85f51153d0..00000000000 --- a/compiler/testData/diagnostics/tests/variance/Function.fir.kt +++ /dev/null @@ -1,34 +0,0 @@ -interface In -interface Out -interface Inv -fun getT(): T = null!! - -interface Test { - fun parameters1(i: I, o: O, p: P) - fun parameters2(i: In) - fun parameters3(i: In) - - fun explicitReturnType1() : I - fun explicitReturnType2() : O - fun explicitReturnType3() : P - fun explicitReturnType4() : In - fun explicitReturnType5() : In - - fun imlicitReturnType1() = getT() - fun imlicitReturnType2() = getT() - fun imlicitReturnType3() = getT

() - fun imlicitReturnType4() = getT>() - fun imlicitReturnType5() = getT>() - - fun I.receiver1() - fun O.receiver2() - fun P.receiver3() - fun In.receiver4() - fun In.receiver5() - - fun typeParameter1() - fun typeParameter2() - fun typeParameter3() - fun > typeParameter4() - fun > typeParameter5() -} diff --git a/compiler/testData/diagnostics/tests/variance/Function.kt b/compiler/testData/diagnostics/tests/variance/Function.kt index 1f2ed9ca1e6..3402dba6ac6 100644 --- a/compiler/testData/diagnostics/tests/variance/Function.kt +++ b/compiler/testData/diagnostics/tests/variance/Function.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface In interface Out interface Inv diff --git a/compiler/testData/diagnostics/tests/variance/FunctionTypes.fir.kt b/compiler/testData/diagnostics/tests/variance/FunctionTypes.fir.kt deleted file mode 100644 index edb90a7f81a..00000000000 --- a/compiler/testData/diagnostics/tests/variance/FunctionTypes.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -interface In -fun getT(): T = null!! - -interface Test { - fun ok1(i: (O) -> I) : (I) -> O - fun ok2(i: (P) -> P) : (P) -> P - fun ok3(i: (In) -> In) = getT<(In) -> In>() - - fun neOk1(i: (I) -> O): (O) -> I - fun neOk2(i: (In) -> In) - fun neOk3() = getT<(In) -> In>() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/variance/FunctionTypes.kt b/compiler/testData/diagnostics/tests/variance/FunctionTypes.kt index 87418e61ed0..4cf931882c4 100644 --- a/compiler/testData/diagnostics/tests/variance/FunctionTypes.kt +++ b/compiler/testData/diagnostics/tests/variance/FunctionTypes.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface In fun getT(): T = null!! diff --git a/compiler/testData/diagnostics/tests/variance/InPosition.fir.kt b/compiler/testData/diagnostics/tests/variance/InPosition.fir.kt index 041174eefa2..a353a4ffc6a 100644 --- a/compiler/testData/diagnostics/tests/variance/InPosition.fir.kt +++ b/compiler/testData/diagnostics/tests/variance/InPosition.fir.kt @@ -27,22 +27,22 @@ interface Test { fun Ok22(i: Inv) fun Ok23(i: Inv) - fun neOk1(i: O) - fun neOk2(i: In) - fun neOk3(i: In>) - fun neOk4(i: Inv) - fun neOk5(i: Inv) - fun neOk6(i: In>) - fun neOk7(i: Pair, O>) - fun neOk8(i: Inv) + fun neOk1(i: O) + fun neOk2(i: In<")!>I>) + fun neOk3(i: In>")!>O>>) + fun neOk4(i: Inv<")!>I>) + fun neOk5(i: Inv<")!>O>) + fun neOk6(i: In>")!>O>>) + fun neOk7(i: Pair, O>")!>I>, , O>")!>O>) + fun neOk8(i: Inv")!>O>) fun neOk9(i: In) - fun neOk10(i: Out) + fun neOk10(i: Out<")!>O>) - fun neOk11(i: Inv) - fun neOk12(i: Inv) + fun neOk11(i: Inv")!>I>) + fun neOk12(i: Inv")!>O>) fun neOk30(i: Pair) - fun neOk31(i: PairInv>) + fun neOk31(i: Pair<")!>O, Inv>) fun neOk32(i: Inv) fun neOk33(i: Inv<>) fun neOk34(i: Inv<C>) diff --git a/compiler/testData/diagnostics/tests/variance/InvariantPosition.fir.kt b/compiler/testData/diagnostics/tests/variance/InvariantPosition.fir.kt index 9fb72696400..4513bda053d 100644 --- a/compiler/testData/diagnostics/tests/variance/InvariantPosition.fir.kt +++ b/compiler/testData/diagnostics/tests/variance/InvariantPosition.fir.kt @@ -14,32 +14,32 @@ interface Test { var ok6: Inv var ok7: Inv - var neOk1: O - var neOk2: In - var neOk3: In> - var neOk4: Inv - var neOk5: Inv - var neOk6: In> - var neOk7: Pair, O> - var neOk8: Inv - var neOk9: Inv + var neOk1: O + var neOk2: In<")!>I> + var neOk3: In>")!>O>> + var neOk4: Inv<")!>I> + var neOk5: Inv<")!>O> + var neOk6: In>")!>O>> + var neOk7: Pair, O>")!>I>, , O>")!>O> + var neOk8: Inv")!>O> + var neOk9: Inv")!>I> var neOk10: In - var neOk11: I - var neOk12: In - var neOk13: In> - var neOk14: Out - var neOk15: Out> - var neOk16: Out> - var neOk17: Pair, I> + var neOk11: I + var neOk12: In<")!>O> + var neOk13: In>")!>I>> + var neOk14: Out<")!>I> + var neOk15: Out>")!>I>> + var neOk16: Out>")!>O>> + var neOk17: Pair, I>")!>O>, , I>")!>I> - var neOk20: Inv - var neOk21: Inv - var neOk22: Inv - var neOk23: Inv + var neOk20: Inv")!>O> + var neOk21: Inv")!>I> + var neOk22: Inv")!>O> + var neOk23: Inv")!>I> var neOk30: Pair - var neOk31: PairInv> + var neOk31: Pair<")!>I, Inv> var neOk32: Inv var neOk33: Inv<> var neOk34: Inv<C> diff --git a/compiler/testData/diagnostics/tests/variance/NullableTypes.fir.kt b/compiler/testData/diagnostics/tests/variance/NullableTypes.fir.kt deleted file mode 100644 index 9f3b7b7913d..00000000000 --- a/compiler/testData/diagnostics/tests/variance/NullableTypes.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -interface In -interface Out -interface Inv

-fun getT(): T = null!! - - -interface Test { - fun ok1(i: I?) : O? - fun ok2(i: In?) : Out? - fun ok3(i: Inv) = getT>() - - fun neOk1(i: O?) : I? - fun neOk(i: Out?) : In? - fun neOk3(i: Inv) - fun neOk4() = getT?>() -} diff --git a/compiler/testData/diagnostics/tests/variance/NullableTypes.kt b/compiler/testData/diagnostics/tests/variance/NullableTypes.kt index 089729b268f..fdec08c5468 100644 --- a/compiler/testData/diagnostics/tests/variance/NullableTypes.kt +++ b/compiler/testData/diagnostics/tests/variance/NullableTypes.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface In interface Out interface Inv

diff --git a/compiler/testData/diagnostics/tests/variance/OutPosition.fir.kt b/compiler/testData/diagnostics/tests/variance/OutPosition.fir.kt index a9d19182389..abef9b833cb 100644 --- a/compiler/testData/diagnostics/tests/variance/OutPosition.fir.kt +++ b/compiler/testData/diagnostics/tests/variance/OutPosition.fir.kt @@ -15,26 +15,26 @@ interface Test { fun ok7(): Out

fun ok8(): Out> fun ok9(): Pair, O> - + fun ok10(): Inv fun ok11(): Inv fun ok12(): Inv fun ok13(): Inv - fun neOk1(): I - fun neOk2(): In - fun neOk3(): In> - fun neOk4(): Inv - fun neOk5(): Inv - fun neOk6(): Pair, I> - fun neOk7(): Inv + fun neOk1(): I + fun neOk2(): In<O> + fun neOk3(): InI>> + fun neOk4(): Inv<I> + fun neOk5(): Inv<O> + fun neOk6(): PairO>, I> + fun neOk7(): InvO> fun neOk8(): Out - - fun neOk10(): Inv - fun neOk11(): Inv + + fun neOk10(): InvO> + fun neOk11(): InvI> fun neOk30(): Pair - fun neOk31(): PairInv> + fun neOk31(): Pair<I, Inv> fun neOk32(): Inv fun neOk33(): Inv<> fun neOk34(): Inv<C> diff --git a/compiler/testData/diagnostics/tests/variance/OutPosition.kt b/compiler/testData/diagnostics/tests/variance/OutPosition.kt index f1d567f2766..f8037e3e3d8 100644 --- a/compiler/testData/diagnostics/tests/variance/OutPosition.kt +++ b/compiler/testData/diagnostics/tests/variance/OutPosition.kt @@ -15,7 +15,7 @@ interface Test { fun ok7(): Out

fun ok8(): Out> fun ok9(): Pair, O> - + fun ok10(): Inv fun ok11(): Inv fun ok12(): Inv @@ -29,7 +29,7 @@ interface Test { fun neOk6(): Pair, I>")!>O>, , I>")!>I> fun neOk7(): Inv")!>O> fun neOk8(): Out<in I> - + fun neOk10(): Inv")!>O> fun neOk11(): Inv")!>I> diff --git a/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.fir.kt b/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.fir.kt deleted file mode 100644 index d0fa36fb22d..00000000000 --- a/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.fir.kt +++ /dev/null @@ -1,25 +0,0 @@ -interface In -interface Out -interface Inv - -fun getT(): T = null!! - -class Test( - val type1: I, - val type2: O, - val type3: P, - val type4: In, - val type5: In, - - var type6: I, - var type7: O, - var type8: P, - var type9: In, - var type0: In, - - type11: I, - type12: O, - type13: P, - type14: In, - type15: In -) diff --git a/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.kt b/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.kt index 0ed1277a0ee..d3373ff65a6 100644 --- a/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.kt +++ b/compiler/testData/diagnostics/tests/variance/PrimaryConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface In interface Out interface Inv diff --git a/compiler/testData/diagnostics/tests/variance/ValProperty.fir.kt b/compiler/testData/diagnostics/tests/variance/ValProperty.fir.kt deleted file mode 100644 index 277e2c628ce..00000000000 --- a/compiler/testData/diagnostics/tests/variance/ValProperty.fir.kt +++ /dev/null @@ -1,50 +0,0 @@ -import kotlin.reflect.KProperty - -interface In -interface Out -interface Inv - -class Delegate { - operator fun getValue(t: Any, p: KProperty<*>): T = null!! - operator fun setValue(t: Any, p: KProperty<*>, value: T) {} -} - -fun getT(): T = null!! - -abstract class Test { - abstract val type1: I - abstract val type2: O - abstract val type3: P - abstract val type4: In - abstract val type5: In - - val implicitType1 = getT() - val implicitType2 = getT() - val implicitType3 = getT

() - val implicitType4 = getT>() - val implicitType5 = getT>() - - val delegateType1 by Delegate() - val delegateType2 by Delegate() - val delegateType3 by Delegate

() - val delegateType4 by Delegate>() - val delegateType5 by Delegate>() - - abstract val I.receiver1: Int - abstract val O.receiver2: Int - abstract val P.receiver3: Int - abstract val In.receiver4: Int - abstract val In.receiver5: Int - - val X.typeParameter1: Int get() = 0 - val X.typeParameter2: Int get() = 0 - val X.typeParameter3: Int get() = 0 - val > X.typeParameter4: Int get() = 0 - val > X.typeParameter5: Int get() = 0 - - val X.typeParameter6: Int where X : I get() = 0 - val X.typeParameter7: Int where X : O get() = 0 - val X.typeParameter8: Int where X : P get() = 0 - val X.typeParameter9: Int where X : In get() = 0 - val X.typeParameter0: Int where X : In get() = 0 -} diff --git a/compiler/testData/diagnostics/tests/variance/ValProperty.kt b/compiler/testData/diagnostics/tests/variance/ValProperty.kt index 94ab374cd21..5540fdaa268 100644 --- a/compiler/testData/diagnostics/tests/variance/ValProperty.kt +++ b/compiler/testData/diagnostics/tests/variance/ValProperty.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.reflect.KProperty interface In diff --git a/compiler/testData/diagnostics/tests/variance/VarProperty.fir.kt b/compiler/testData/diagnostics/tests/variance/VarProperty.fir.kt deleted file mode 100644 index a8cb2614b8b..00000000000 --- a/compiler/testData/diagnostics/tests/variance/VarProperty.fir.kt +++ /dev/null @@ -1,50 +0,0 @@ -import kotlin.reflect.KProperty - -interface In -interface Out -interface Inv - -class Delegate { - operator fun getValue(t: Any, p: KProperty<*>): T = null!! - operator fun setValue(t: Any, p: KProperty<*>, varue: T) {} -} - -fun getT(): T = null!! - -abstract class Test { - abstract var type1: I - abstract var type2: O - abstract var type3: P - abstract var type4: In - abstract var type5: In - - var implicitType1 = getT() - var implicitType2 = getT() - var implicitType3 = getT

() - var implicitType4 = getT>() - var implicitType5 = getT>() - - var delegateType1 by Delegate() - var delegateType2 by Delegate() - var delegateType3 by Delegate

() - var delegateType4 by Delegate>() - var delegateType5 by Delegate>() - - abstract var I.receiver1: Int - abstract var O.receiver2: Int - abstract var P.receiver3: Int - abstract var In.receiver4: Int - abstract var In.receiver5: Int - - var X.typeParameter1: Int get() = 0; set(i) {} - var X.typeParameter2: Int get() = 0; set(i) {} - var X.typeParameter3: Int get() = 0; set(i) {} - var > X.typeParameter4: Int get() = 0; set(i) {} - var > X.typeParameter5: Int get() = 0; set(i) {} - - var X.typeParameter6: Int where X : I get() = 0; set(i) {} - var X.typeParameter7: Int where X : O get() = 0; set(i) {} - var X.typeParameter8: Int where X : P get() = 0; set(i) {} - var X.typeParameter9: Int where X : In get() = 0; set(i) {} - var X.typeParameter0: Int where X : In get() = 0; set(i) {} -} diff --git a/compiler/testData/diagnostics/tests/variance/VarProperty.kt b/compiler/testData/diagnostics/tests/variance/VarProperty.kt index 3c5378b3803..ba0ace2d0df 100644 --- a/compiler/testData/diagnostics/tests/variance/VarProperty.kt +++ b/compiler/testData/diagnostics/tests/variance/VarProperty.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.reflect.KProperty interface In diff --git a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt b/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt index 34ee0dbd565..9079ddad14d 100644 --- a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt +++ b/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt @@ -1,20 +1,20 @@ interface Test { - val internal_val: I - public val public_val: I - protected val protected_val: I + val internal_val: I + public val public_val: I + protected val protected_val: I private val private_val: I - var interlan_private_set: O + var interlan_private_set: O private set - public var public_private_set: O + public var public_private_set: O private set - protected var protected_private_set: O + protected var protected_private_set: O private set private var private_private_set: O private set - fun internal_fun(i: O) : I - public fun public_fun(i: O) : I - protected fun protected_fun(i: O) : I + fun internal_fun(i: O) : I + public fun public_fun(i: O) : I + protected fun protected_fun(i: O) : I private fun private_fun(i: O) : I } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckingProcedure.java b/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckingProcedure.java index 3cfd78b84cc..c7851c09328 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckingProcedure.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckingProcedure.java @@ -143,6 +143,13 @@ public class TypeCheckingProcedure { } } + public static EnrichedProjectionKind getEffectiveProjectionKind( + @NotNull TypeParameterDescriptor typeParameter, + @NotNull TypeProjection typeArgument + ) { + return getEffectiveProjectionKind(typeParameter.getVariance(), typeArgument.getProjectionKind()); + } + // If class C then C and C mean the same // out * out = out // out * in = * @@ -156,11 +163,11 @@ public class TypeCheckingProcedure { // inv * in = out // inv * inv = inv public static EnrichedProjectionKind getEffectiveProjectionKind( - @NotNull TypeParameterDescriptor typeParameter, - @NotNull TypeProjection typeArgument + @NotNull Variance typeParameterVariance, + @NotNull Variance typeArgumentVariance ) { - Variance a = typeParameter.getVariance(); - Variance b = typeArgument.getProjectionKind(); + Variance a = typeParameterVariance; + Variance b = typeArgumentVariance; // If they are not both invariant, let's make b not invariant for sure if (b == INVARIANT) { diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index 20d3df80d83..d31e4670d75 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.types.Variance import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.reflect.full.createType @@ -188,6 +189,11 @@ private object FirToKtConversionCreator { KtTypeParameterSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter") ), + FirTypeParameter::class to HLFunctionCallConversion( + "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)", + KtTypeParameterSymbol::class.createType(), + importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter") + ), ConeKotlinType::class to HLFunctionCallConversion( "firSymbolBuilder.typeBuilder.buildKtType({0})", KtType::class.createType() @@ -215,7 +221,7 @@ private object FirToKtConversionCreator { "firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol({0}.fir)", KtFunctionLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirSimpleFunction") - ), + ) ) private val allowedTypesWithoutTypeParams = setOf( @@ -231,6 +237,7 @@ private object FirToKtConversionCreator { ForbiddenNamedArgumentsTarget::class, LanguageFeature::class, LanguageVersionSettings::class, + Variance::class ) private val KType.kClass: KClass<*> diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 942921e1955..b4067642e3b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -1333,6 +1333,26 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.TYPE_VARIANCE_CONFLICT) { firDiagnostic -> + TypeVarianceConflictImpl( + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firDiagnostic.b, + firDiagnostic.c, + firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.d), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE) { firDiagnostic -> + TypeVarianceConflictInExpandedTypeImpl( + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firDiagnostic.b, + firDiagnostic.c, + firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.d), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED) { firDiagnostic -> ExtensionInClassReferenceNotAllowedImpl( firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index c0acc1b858a..859bb687927 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.types.Variance /* * This file was generated automatically @@ -939,6 +940,22 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val typeB: KtType } + abstract class TypeVarianceConflict : KtFirDiagnostic() { + override val diagnosticClass get() = TypeVarianceConflict::class + abstract val typeParameter: KtTypeParameterSymbol + abstract val typeParameterVariance: Variance + abstract val variance: Variance + abstract val containingType: KtType + } + + abstract class TypeVarianceConflictInExpandedType : KtFirDiagnostic() { + override val diagnosticClass get() = TypeVarianceConflictInExpandedType::class + abstract val typeParameter: KtTypeParameterSymbol + abstract val typeParameterVariance: Variance + abstract val variance: Variance + abstract val containingType: KtType + } + abstract class ExtensionInClassReferenceNotAllowed : KtFirDiagnostic() { override val diagnosticClass get() = ExtensionInClassReferenceNotAllowed::class abstract val referencedDeclaration: KtCallableSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 91d911e6fca..dcf4b37ea1f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.types.Variance /* * This file was generated automatically @@ -1522,6 +1523,28 @@ internal class IncompatibleTypesWarningImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class TypeVarianceConflictImpl( + override val typeParameter: KtTypeParameterSymbol, + override val typeParameterVariance: Variance, + override val variance: Variance, + override val containingType: KtType, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.TypeVarianceConflict(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class TypeVarianceConflictInExpandedTypeImpl( + override val typeParameter: KtTypeParameterSymbol, + override val typeParameterVariance: Variance, + override val variance: Variance, + override val containingType: KtType, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.TypeVarianceConflictInExpandedType(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ExtensionInClassReferenceNotAllowedImpl( override val referencedDeclaration: KtCallableSymbol, firDiagnostic: FirPsiDiagnostic<*>,