From 04ead1716a91b29b1ee01be13c368a3d4d5b4335 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 14 Feb 2024 23:03:59 +0100 Subject: [PATCH] [FIR] Prohibit constructor and supertype on typealias with type projection Introduce `CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION` ^KT-60305 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 12 ++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 8 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 10 +++++ .../diagnostics/FirDiagnosticsList.kt | 3 ++ .../fir/analysis/diagnostics/FirErrors.kt | 2 + .../declaration/FirSupertypesChecker.kt | 37 +++++++++++++++---- .../expression/FirConstructorCallChecker.kt | 11 +++++- .../diagnostics/FirErrorsDefaultMessages.kt | 14 +++++-- ...assTypeAliasConstructorInSupertypes.fir.kt | 2 +- ...ypeAliasConstructorCrazyProjections.fir.kt | 4 +- .../typeAliasConstructorForProjection.fir.kt | 7 ++-- .../typeAliasConstructorForProjection.kt | 1 + ...onstructorForProjectionInSupertypes.fir.kt | 18 +++++++++ ...iasConstructorForProjectionInSupertypes.kt | 3 +- .../kotlin/config/LanguageVersionSettings.kt | 1 + 15 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.fir.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 8a03011cb09..8735fbc91aa 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4553,6 +4553,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION.errorFactory) { firDiagnostic -> + ConstructorOrSupertypeOnTypealiasWithTypeProjectionErrorImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION.warningFactory) { firDiagnostic -> + ConstructorOrSupertypeOnTypealiasWithTypeProjectionWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.REDUNDANT_VISIBILITY_MODIFIER) { firDiagnostic -> RedundantVisibilityModifierImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 6ab2ae96e79..450b3e32f2d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3174,6 +3174,14 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val expandedType: KtType } + interface ConstructorOrSupertypeOnTypealiasWithTypeProjectionError : KtFirDiagnostic { + override val diagnosticClass get() = ConstructorOrSupertypeOnTypealiasWithTypeProjectionError::class + } + + interface ConstructorOrSupertypeOnTypealiasWithTypeProjectionWarning : KtFirDiagnostic { + override val diagnosticClass get() = ConstructorOrSupertypeOnTypealiasWithTypeProjectionWarning::class + } + interface RedundantVisibilityModifier : KtFirDiagnostic { override val diagnosticClass get() = RedundantVisibilityModifier::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index dc6231d8bad..0d8f0883b7d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3822,6 +3822,16 @@ internal class TypealiasShouldExpandToClassImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.TypealiasShouldExpandToClass +internal class ConstructorOrSupertypeOnTypealiasWithTypeProjectionErrorImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ConstructorOrSupertypeOnTypealiasWithTypeProjectionError + +internal class ConstructorOrSupertypeOnTypealiasWithTypeProjectionWarningImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ConstructorOrSupertypeOnTypealiasWithTypeProjectionWarning + internal class RedundantVisibilityModifierImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, 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 0bc795c3ef8..57992456ae0 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 @@ -1596,6 +1596,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val TYPEALIAS_SHOULD_EXPAND_TO_CLASS by error { parameter("expandedType") } + val CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION by deprecationError( + LanguageFeature.ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection + ) } val EXTENDED_CHECKERS by object : DiagnosticGroup("Extended checkers") { 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 653527e9f82..6bf2cb3e1b7 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 @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ModifierNonBuiltinSuspendFunE import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConfusingSyntaxInWhenBranches +import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection import org.jetbrains.kotlin.config.LanguageFeature.ProhibitCyclesInAnnotations import org.jetbrains.kotlin.config.LanguageFeature.ProhibitImplementingVarByInheritedVal import org.jetbrains.kotlin.config.LanguageFeature.ProhibitInlineModifierOnPrimaryConstructorParameters @@ -801,6 +802,7 @@ object FirErrors { val TOPLEVEL_TYPEALIASES_ONLY: KtDiagnosticFactory0 by error0() val RECURSIVE_TYPEALIAS_EXPANSION: KtDiagnosticFactory0 by error0() val TYPEALIAS_SHOULD_EXPAND_TO_CLASS: KtDiagnosticFactory1 by error1() + val CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION: KtDiagnosticFactoryForDeprecation0 by deprecationError0(ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection) // Extended checkers val REDUNDANT_VISIBILITY_MODIFIER: KtDiagnosticFactory0 by warning0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt index 34e98c4ed17..d7f099f8d3b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.StandardClassIds @@ -97,10 +98,14 @@ object FirSupertypesChecker : FirClassChecker(MppCheckerKind.Common) { checkClassCannotBeExtendedDirectly(symbol, reporter, superTypeRef, context) checkNamedFunctionTypeParameter(superTypeRef, context, reporter) - if (coneType.typeArguments.isNotEmpty()) { - checkProjectionInImmediateArgumentToSupertype(coneType, superTypeRef, reporter, context) + val shouldCheckSupertypeOnTypealiasWithTypeProjection = if (coneType.typeArguments.isNotEmpty()) { + !checkProjectionInImmediateArgumentToSupertype(coneType, superTypeRef, reporter, context) } else { - checkExpandedTypeCannotBeInherited(symbol, fullyExpandedType, reporter, superTypeRef, coneType, context) + !checkExpandedTypeCannotBeInherited(symbol, fullyExpandedType, reporter, superTypeRef, coneType, context) + } + + if (shouldCheckSupertypeOnTypealiasWithTypeProjection) { + checkSupertypeOnTypeAliasWithTypeProjection(coneType, fullyExpandedType, superTypeRef, reporter, context) } } @@ -140,8 +145,9 @@ object FirSupertypesChecker : FirClassChecker(MppCheckerKind.Common) { superTypeRef: FirTypeRef, reporter: DiagnosticReporter, context: CheckerContext, - ) { - val typeRefAndSourcesForArguments = extractArgumentsTypeRefAndSource(superTypeRef) ?: return + ): Boolean { + val typeRefAndSourcesForArguments = extractArgumentsTypeRefAndSource(superTypeRef) ?: return false + var result = false for ((index, typeArgument) in coneType.typeArguments.withIndex()) { if (typeArgument.isConflictingOrNotInvariant) { val (_, argSource) = typeRefAndSourcesForArguments.getOrNull(index) ?: continue @@ -150,8 +156,10 @@ object FirSupertypesChecker : FirClassChecker(MppCheckerKind.Common) { FirErrors.PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, context ) + result = true } } + return result } private fun checkExpandedTypeCannotBeInherited( @@ -161,15 +169,30 @@ object FirSupertypesChecker : FirClassChecker(MppCheckerKind.Common) { superTypeRef: FirTypeRef, coneType: ConeKotlinType, context: CheckerContext, - ) { + ): Boolean { if (symbol is FirRegularClassSymbol && symbol.classKind == ClassKind.INTERFACE) { for (typeArgument in fullyExpandedType.typeArguments) { if (typeArgument.isConflictingOrNotInvariant) { reporter.reportOn(superTypeRef.source, FirErrors.EXPANDED_TYPE_CANNOT_BE_INHERITED, coneType, context) - break + return true } } } + return false + } + + private fun checkSupertypeOnTypeAliasWithTypeProjection( + coneType: ConeKotlinType, + fullyExpandedType: ConeKotlinType, + superTypeRef: FirTypeRef, + reporter: DiagnosticReporter, + context: CheckerContext, + ) { + if (coneType.toSymbol(context.session) is FirTypeAliasSymbol && + fullyExpandedType.typeArguments.any { it.isConflictingOrNotInvariant } + ) { + reporter.reportOn(superTypeRef.source, FirErrors.CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION, context) + } } private fun checkDelegationNotToInterface( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt index e340bfe7a7c..5f2ebbb448e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt @@ -12,17 +12,26 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol +import org.jetbrains.kotlin.fir.types.ConeCapturedType import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.contains import org.jetbrains.kotlin.fir.types.toRegularClassSymbol object FirConstructorCallChecker : FirFunctionCallChecker(MppCheckerKind.Common) { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { val constructorSymbol = expression.calleeReference.toResolvedConstructorSymbol() ?: return - val declarationClass = constructorSymbol.resolvedReturnTypeRef.coneType.toRegularClassSymbol(context.session) + val coneType = constructorSymbol.resolvedReturnTypeRef.coneType + + if (constructorSymbol.origin == FirDeclarationOrigin.Synthetic.TypeAliasConstructor && coneType.contains { it is ConeCapturedType }) { + reporter.reportOn(expression.source, FirErrors.CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION, context) + } + + val declarationClass = coneType.toRegularClassSymbol(context.session) ?: return if (declarationClass.classKind == ClassKind.ANNOTATION_CLASS && diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 1bed8d6b84b..48b800d2478 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -138,6 +138,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CLASS_INHERITS_JA import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CLASS_IN_SUPERTYPE_FOR_ENUM import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CLASS_LITERAL_LHS_NOT_A_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPILER_REQUIRED_ANNOTATION_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPONENT_FUNCTION_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPONENT_FUNCTION_MISSING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPONENT_FUNCTION_ON_NULLABLE @@ -152,6 +153,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONFLICTING_UPPER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONFUSING_BRANCH_CONDITION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_OBJECT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONST_VAL_WITHOUT_INITIALIZER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONST_VAL_WITH_DELEGATE @@ -244,6 +246,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_TAILREC_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_ACTUAL_OPT_IN_ANNOTATION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_CLASS_AS_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_EXTENSION @@ -396,6 +399,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_LABELS_ARE_FORBIDDEN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_PARAMETERS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTI_FIELD_VALUE_CLASS_PRIMARY_CONSTRUCTOR_DEFAULT_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED @@ -433,6 +437,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_MODIFIER_FORM import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_ENUM import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_SOURCE_ANNOTATION_ON_INLINED_LAMBDA_EXPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_TAIL_RECURSIVE_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_VARARG_SPREAD @@ -503,10 +508,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_CANNOT_BE_IMPORTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PLATFORM_CLASS_MAPPED_TO_KOTLIN -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPILER_REQUIRED_ANNOTATION_AMBIGUITY -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_LABELS_ARE_FORBIDDEN -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.POTENTIALLY_NON_REPORTED_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRE_RELEASE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED @@ -2419,6 +2420,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Type alias expands to ''{0}'', which is not a class, interface, or object.", RENDER_TYPE ) + map.put( + CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION, + "Type alias with type projection ('in', 'out' or '*') in expanded type in constructor call or supertype position. " + + "See https://youtrack.jetbrains.com/issue/KT-60305." + ) // Returns map.put(RETURN_NOT_ALLOWED, "'return' is prohibited here.") diff --git a/compiler/testData/diagnostics/tests/typealias/innerClassTypeAliasConstructorInSupertypes.fir.kt b/compiler/testData/diagnostics/tests/typealias/innerClassTypeAliasConstructorInSupertypes.fir.kt index 1eb5305dbad..c437687760e 100644 --- a/compiler/testData/diagnostics/tests/typealias/innerClassTypeAliasConstructorInSupertypes.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/innerClassTypeAliasConstructorInSupertypes.fir.kt @@ -22,7 +22,7 @@ class Generic { inner class Test1 : GI() inner class Test2 : GIInt() - inner class Test3 : GIStar() + inner class Test3 : GIStar() inner class Test3a : test.Generic<*>.Inner() inner class Test4 : GG() diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorCrazyProjections.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorCrazyProjections.fir.kt index da2ceb15576..eadebd292e0 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorCrazyProjections.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorCrazyProjections.fir.kt @@ -10,6 +10,6 @@ fun listOf(): List = null!! // Unresolved reference is ok here: // we can't create a substituted signature for type alias constructor // since it has 'out' type projection in 'in' position. -val test1 = BOutIn(listOf(), null!!) +val test1 = BOutIn(listOf(), null!!) -val test2 = BInIn(listOf(), null!!) +val test2 = BInIn(listOf(), null!!) diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.fir.kt index 2a132cb3675..cd8f882cc7b 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.fir.kt @@ -1,3 +1,4 @@ +// ISSUE: KT-60305 // NI_EXPECTED_FILE class C @@ -7,8 +8,8 @@ typealias CIn = C typealias COut = C typealias CT = C -val test1 = CStar() -val test2 = CIn() -val test3 = COut() +val test1 = CStar() +val test2 = CIn() +val test3 = COut() val test4 = CT<*>() val test5 = CT>() diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt index f856dede5a4..d5e0d2115d0 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt @@ -1,3 +1,4 @@ +// ISSUE: KT-60305 // NI_EXPECTED_FILE class C diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.fir.kt new file mode 100644 index 00000000000..24330c2096a --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.fir.kt @@ -0,0 +1,18 @@ +// ISSUE: KT-60305 + +open class C + +typealias CStar = C<*> +typealias CIn = C +typealias COut = C +typealias CT = C + +class Test1 : CStar() +class Test2 : CIn() +class Test3 : COut() + +class Test4 : CStar { + constructor() : super() +} + +class Test5 : CT<*>() diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.kt index fa0b08f148f..bcac14bd799 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjectionInSupertypes.kt @@ -1,4 +1,5 @@ -// FIR_IDENTICAL +// ISSUE: KT-60305 + open class C typealias CStar = C<*> diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index d52705e1e85..7e743a74b2c 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -324,6 +324,7 @@ enum class LanguageFeature( SupportJavaErrorEnhancementOfArgumentsOfWarningLevelEnhanced(KOTLIN_2_1, kind = BUG_FIX), // KT-63209 ProhibitPrivateOperatorCallInInline(KOTLIN_2_1, kind = BUG_FIX), // KT-65494 ProhibitTypealiasAsCallableQualifierInImport(KOTLIN_2_1, kind = BUG_FIX), // KT-64350 + ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection(KOTLIN_2_1, kind = BUG_FIX), // KT-60305 // End of 2.* language features --------------------------------------------------