diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index ce881bb366a..3fba3831f7f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -461,8 +461,7 @@ internal class KtSymbolByFirBuilder constructor( // TODO this is a temporary hack to prevent FIR IDE from crashing on builder inference, see KT-50916 val typeVariable = coneType.constructor.variable as? ConeTypeParameterBasedTypeVariable val typeParameterSymbol = typeVariable?.typeParameterSymbol ?: throwUnexpectedElementError(coneType) - val coneTypeParameterType = (typeParameterSymbol.toConeType() as ConeTypeParameterType) - .withNullability(coneType.nullability, rootSession.typeContext) + val coneTypeParameterType = typeParameterSymbol.toConeType(coneType.nullability.isNullable) KtFirTypeParameterType(coneTypeParameterType, this@KtSymbolByFirBuilder) } 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 58fac26718d..f8fcd913929 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 @@ -2427,6 +2427,21 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.EXPANSIVE_INHERITANCE) { firDiagnostic -> + ExpansiveInheritanceImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.EXPANSIVE_INHERITANCE_IN_JAVA) { firDiagnostic -> + ExpansiveInheritanceInJavaImpl( + firDiagnostic.a.map { firBasedSymbol -> + firSymbolBuilder.buildSymbol(firBasedSymbol) + }, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.DEPRECATED_TYPE_PARAMETER_SYNTAX) { firDiagnostic -> DeprecatedTypeParameterSyntaxImpl( 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 ee62fc9ecd4..00e755a81cf 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 @@ -1723,6 +1723,15 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val containingTypes: List } + interface ExpansiveInheritance : KtFirDiagnostic { + override val diagnosticClass get() = ExpansiveInheritance::class + } + + interface ExpansiveInheritanceInJava : KtFirDiagnostic { + override val diagnosticClass get() = ExpansiveInheritanceInJava::class + val containingTypes: List + } + interface DeprecatedTypeParameterSyntax : KtFirDiagnostic { override val diagnosticClass get() = DeprecatedTypeParameterSyntax::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 b978d01b71b..01023c8613d 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 @@ -2072,6 +2072,17 @@ internal class FiniteBoundsViolationInJavaImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.FiniteBoundsViolationInJava +internal class ExpansiveInheritanceImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ExpansiveInheritance + +internal class ExpansiveInheritanceInJavaImpl( + override val containingTypes: List, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ExpansiveInheritanceInJava + internal class DeprecatedTypeParameterSyntaxImpl( 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 1d840aaccb7..9c37d4aada0 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 @@ -792,7 +792,11 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val CYCLIC_GENERIC_UPPER_BOUND by error() val FINITE_BOUNDS_VIOLATION by error() - val FINITE_BOUNDS_VIOLATION_IN_JAVA by error { + val FINITE_BOUNDS_VIOLATION_IN_JAVA by warning { + parameter>("containingTypes") + } + val EXPANSIVE_INHERITANCE by error() + val EXPANSIVE_INHERITANCE_IN_JAVA by warning { parameter>("containingTypes") } 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 d76ddfb8dd0..43f88bbf72c 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 @@ -467,7 +467,9 @@ object FirErrors { val ABBREVIATED_NOTHING_PROPERTY_TYPE by error0(SourceElementPositioningStrategies.NAME_IDENTIFIER) val CYCLIC_GENERIC_UPPER_BOUND by error0() val FINITE_BOUNDS_VIOLATION by error0() - val FINITE_BOUNDS_VIOLATION_IN_JAVA by error1>>() + val FINITE_BOUNDS_VIOLATION_IN_JAVA by warning1>>() + val EXPANSIVE_INHERITANCE by error0() + val EXPANSIVE_INHERITANCE_IN_JAVA by warning1>>() val DEPRECATED_TYPE_PARAMETER_SYNTAX by error0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val MISPLACED_TYPE_PARAMETER_CONSTRAINTS by warning0() val DYNAMIC_SUPERTYPE by error0() diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index df7be91fa5f..927bbb02e49 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -305,7 +305,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "IMPLICIT_NOTHING_PROPERTY_TYPE", "CYCLIC_GENERIC_UPPER_BOUND", "FINITE_BOUNDS_VIOLATION", - "FINITE_BOUNDS_VIOLATION_IN_JAVA", + "EXPANSIVE_INHERITANCE", "DEPRECATED_TYPE_PARAMETER_SYNTAX", "DYNAMIC_SUPERTYPE", "DYNAMIC_UPPER_BOUND", 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 3d02c7a5565..f6d9ab2985d 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 @@ -140,6 +140,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirDelegateFieldTypeMismatchChecker, FirMultipleDefaultsInheritedFromSupertypesChecker, FirFiniteBoundRestrictionChecker, + FirNonExpansiveInheritanceRestrictionChecker, FirDefaultArgumentsInExpectActualizedByFakeOverrideChecker, ) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNonExpansiveInheritanceRestrictionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNonExpansiveInheritanceRestrictionChecker.kt new file mode 100644 index 00000000000..712eb27cfe6 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNonExpansiveInheritanceRestrictionChecker.kt @@ -0,0 +1,175 @@ +/* + * Copyright 2010-2023 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.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.collectUpperBounds +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.scopes.impl.toConeType +import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.utils.DFS +import org.jetbrains.kotlin.utils.SmartSet + +/** + * @see org.jetbrains.kotlin.resolve.NonExpansiveInheritanceRestrictionChecker + */ +object FirNonExpansiveInheritanceRestrictionChecker : FirRegularClassChecker() { + override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration.typeParameters.isEmpty()) return + + val graph = buildTypeGraph(declaration, context.session) + + val edgesInCycles = graph.expansiveEdges.filterTo(SmartSet.create()) { graph.isEdgeInCycle(it) } + if (edgesInCycles.isEmpty()) return + + val problemNodes = edgesInCycles.flatMapTo(mutableSetOf()) { listOf(it.from, it.to) } + + for (ref in declaration.typeParameters) { + if (problemNodes.remove(TypeParameterNode(declaration.symbol, ref.symbol))) { + reporter.reportOn(ref.source ?: declaration.source, FirErrors.EXPANSIVE_INHERITANCE, context) + return + } + } + + if (problemNodes.any { it.typeParameter.source != null }) return + + val containers = problemNodes.map { it.container } + reporter.reportOn(declaration.source, FirErrors.EXPANSIVE_INHERITANCE_IN_JAVA, containers, context) + } + + private fun buildTypeGraph( + declaration: FirRegularClass, + session: FirSession, + ): Graph { + // K1 treats type parameters inherited within inner classes from outer classes as being + // from different classes. However, in K2, the symbol for these type parameters are the + // same. So we have to store the pair of class symbol and type parameter symbol, so we do + // not report errors on inherited type parameters from outer classes. + val graph = Graph() + + fun addEdges( + typeParameters: List, + constituentTypes: Set, + symbol: FirRegularClassSymbol, + constituentTypeSymbol: FirRegularClassSymbol, + constituentTypeParameterSymbol: FirTypeParameterSymbol, + expansive: Boolean, + ) { + for (typeParameter in typeParameters) { + if (typeParameter.toConeType(isNullable = false) in constituentTypes || + typeParameter.toConeType(isNullable = true) in constituentTypes + ) { + graph.addEdge( + from = TypeParameterNode(symbol, typeParameter), + to = TypeParameterNode(constituentTypeSymbol, constituentTypeParameterSymbol), + expansive = expansive, + ) + } + } + } + + val visitedSymbols = SmartSet.create>() + fun visit(symbol: FirRegularClassSymbol) { + val typeParameters = symbol.typeParameterSymbols + + // For each type parameter T, let ST be the set of all constituent types of all immediate supertypes of the owner of T. + // If T appears as a constituent type of a simple type argument A in a generic type in ST, add an edge from T + // to U, where U is the type parameter corresponding to A. The edge is non-expansive if A has the form T or T?, + // the edge is expansive otherwise. + for (constituentType in symbol.resolvedSuperTypes.flatMap { it.constituentTypes() }) { + val constituentTypeSymbol = constituentType.toRegularClassSymbol(session) ?: continue + if (visitedSymbols.add(constituentTypeSymbol)) visit(constituentTypeSymbol) + if (constituentTypeSymbol.typeParameterSymbols.size != constituentType.typeArguments.size) continue + + for ((i, typeProjection) in constituentType.typeArguments.withIndex()) { + val constituentTypeParameterSymbol = constituentTypeSymbol.typeParameterSymbols[i] + if (typeProjection.kind == ProjectionKind.INVARIANT) { + val constituents = typeProjection.type!!.constituentTypes() + + addEdges( + typeParameters = typeParameters, + constituentTypes = constituents, + symbol = symbol, + constituentTypeSymbol = constituentTypeSymbol, + constituentTypeParameterSymbol = constituentTypeParameterSymbol, + expansive = typeProjection.type!!.unwrapLowerBound() !is ConeTypeParameterType, + ) + } else { + // Furthermore, if T appears as a constituent type of an element of the B-closure of the set of lower and + // upper bounds of a skolem type variable Q in a skolemization of a projected generic type in ST, add an + // expanding edge from T to V, where V is the type parameter corresponding to Q. + val bounds = SmartSet.create() + constituentTypeParameterSymbol.resolvedBounds.mapTo(bounds) { it.type } + typeProjection.type?.let(bounds::add) + val boundClosure = bounds.flatMapTo(SmartSet.create()) { it.collectUpperBounds() } + + addEdges( + typeParameters = typeParameters, + constituentTypes = boundClosure.flatMapTo(SmartSet.create()) { it.constituentTypes() }, + symbol = symbol, + constituentTypeSymbol = constituentTypeSymbol, + constituentTypeParameterSymbol = constituentTypeParameterSymbol, + expansive = true, + ) + } + } + } + } + + visitedSymbols.add(declaration.symbol) + visit(declaration.symbol) + + return graph + } + + private data class TypeParameterNode( + val container: FirRegularClassSymbol, + val typeParameter: FirTypeParameterSymbol, + ) + + private data class ExpansiveEdge(val from: T, val to: T) + + private class Graph { + val expansiveEdges = SmartSet.create>() + private val edgeLists = mutableMapOf>() + + fun addEdge(from: T, to: T, expansive: Boolean = false) { + edgeLists.getOrPut(from) { SmartSet.create() }.add(to) + if (expansive) { + expansiveEdges.add(ExpansiveEdge(from, to)) + } + } + + fun isEdgeInCycle(edge: ExpansiveEdge) = edge.from in collectReachable(edge.to) + + private fun collectReachable(from: T): List { + val handler = object : DFS.NodeHandlerWithListResult() { + override fun afterChildren(current: T?) { + result.add(current) + } + } + + val neighbors = DFS.Neighbors { current -> edgeLists[current] ?: emptySet() } + + DFS.dfs(listOf(from), neighbors, handler) + + return handler.result() + } + } +} + +private fun ConeKotlinType.constituentTypes(): Set { + val constituentTypes = SmartSet.create() + forEachType { constituentTypes.add(it) } + return constituentTypes +} 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 8b202c59d1a..b77b3c12e7d 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 @@ -218,6 +218,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ERROR_FROM_JAVA_R import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ERROR_IN_CONTRACT_DESCRIPTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ERROR_SUPPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPANDED_TYPE_CANNOT_BE_INHERITED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPANSIVE_INHERITANCE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPANSIVE_INHERITANCE_IN_JAVA import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_CONDITION @@ -1445,7 +1447,13 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(CYCLIC_GENERIC_UPPER_BOUND, "Type parameter has cyclic upper bounds.") map.put(FINITE_BOUNDS_VIOLATION, "This type parameter violates the Finite Bound Restriction.") - map.put(FINITE_BOUNDS_VIOLATION_IN_JAVA, "Violation of Finite Bound Restriction for {0}", commaSeparated(DECLARATION_NAME)) + map.put(FINITE_BOUNDS_VIOLATION_IN_JAVA, "Violation of Finite Bound Restriction for {0}.", commaSeparated(DECLARATION_NAME)) + map.put(EXPANSIVE_INHERITANCE, "This type parameter violates the Non-Expansive Inheritance Restriction.") + map.put( + EXPANSIVE_INHERITANCE_IN_JAVA, + "Violation of Non-Expansive Inheritance Restriction for {0}.", + commaSeparated(DECLARATION_NAME), + ) map.put(DEPRECATED_TYPE_PARAMETER_SYNTAX, "Type parameters must be placed before function name.") diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt index 1e6af026066..57443160797 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt @@ -53,6 +53,14 @@ private fun ConeKotlinType.contains(predicate: (ConeKotlinType) -> Boolean, visi // ----------------------------------- Transformations ----------------------------------- +fun ConeKotlinType.unwrapLowerBound(): ConeSimpleKotlinType { + return when(this) { + is ConeDefinitelyNotNullType -> original.unwrapLowerBound() + is ConeFlexibleType -> lowerBound.unwrapLowerBound() + is ConeSimpleKotlinType -> this + } +} + fun ConeKotlinType.upperBoundIfFlexible(): ConeSimpleKotlinType { return when (this) { is ConeSimpleKotlinType -> this diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt index 2e713500aa6..bb7f5fec7a5 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol -import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.ConeTypeParameterType import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled @@ -91,6 +91,9 @@ class FirCompositeNestedClassifierScope( } } -fun FirTypeParameterRef.toConeType(): ConeKotlinType = symbol.toConeType() +fun FirTypeParameterRef.toConeType(): ConeTypeParameterType = symbol.toConeType() -fun FirTypeParameterSymbol.toConeType(): ConeKotlinType = ConeTypeParameterTypeImpl(ConeTypeParameterLookupTag(this), isNullable = false) +fun FirTypeParameterSymbol.toConeType(): ConeTypeParameterType = toConeType(false) + +fun FirTypeParameterSymbol.toConeType(isNullable: Boolean): ConeTypeParameterType = + ConeTypeParameterTypeImpl(ConeTypeParameterLookupTag(this), isNullable) diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.fir.kt deleted file mode 100644 index b0de7ed12c4..00000000000 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// !DIAGNOSTICS: -UPPER_BOUND_VIOLATED - -// FILE: D.java -public interface D {} - -// FILE: Q.java -public interface Q {} - -// FILE: C.java -public interface C extends D> {} - -// FILE: 1.kt -interface P : Q, C>> - diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.kt index ae3d83acd23..4eb59825422 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UPPER_BOUND_VIOLATED // FILE: D.java diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.fir.kt deleted file mode 100644 index df74bc5ac09..00000000000 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -// !DIAGNOSTICS: -UPPER_BOUND_VIOLATED - -// FILE: D.java -public interface D {} - -// FILE: Q.java -public interface Q {} - -// FILE: C.java -public interface C extends D> {} - -// FILE: P.java -public interface P extends Q, C>> {} - -// FILE: 1.kt -interface P1 : P diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.kt index 3fd3aba4f5b..c083402d5a6 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/JavaWithKotlin2.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UPPER_BOUND_VIOLATED // FILE: D.java diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.fir.kt deleted file mode 100644 index 378bbb5bd72..00000000000 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.fir.kt +++ /dev/null @@ -1,28 +0,0 @@ -// !DIAGNOSTICS: -UPPER_BOUND_VIOLATED - -interface A -interface B : A> - -interface N0 -interface C0 : N0>>> - -interface N1 -interface C1 : N1>>> -interface C2 : C1> - -interface C : D> -interface P : Q, C>> -interface Q -interface D - -interface E0 -interface E1 -interface E2 : E0> - -interface F0 -interface F1, U : F2<*>> -interface F2 : F0, T>> - -interface G0 -interface G1> -interface G2 : G0, T>> \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.kt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.kt index 0f06efabcf3..16e6d1ebfdf 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UPPER_BOUND_VIOLATED interface A @@ -25,4 +26,8 @@ interface F2 : F0, T>> interface G0 interface G1> -interface G2 : G0, T>> \ No newline at end of file +interface G2 : G0, T>> + +abstract class H0 { + inner abstract class H1 : H0>() // Outer(X) should not be reported as non-expansive +} diff --git a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.txt b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.txt index 5d416b0e778..4123d478d96 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.txt +++ b/compiler/testData/diagnostics/tests/declarationChecks/nonExpansiveInheritanceRestriction/PureKotlin.txt @@ -96,6 +96,20 @@ public interface G2 : G0, T>> { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } +public abstract class H0 { + public constructor H0() + 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 + + public abstract inner class H1 /*captured type parameters: /*1*/ X*/ : H0.H1> { + public constructor H1() + 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 + } +} + public interface N0 { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int