From cd81f22bd3f20d961e131e38fbe06e7e3c2e4ac6 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 18 Nov 2022 13:24:40 +0100 Subject: [PATCH] K2 opt-in: extract specific checks for overridable experimentalities --- .../expression/FirOptInUsageBaseChecker.kt | 93 ++++++++++++------- 1 file changed, 57 insertions(+), 36 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index 1c3562a2226..b246d8b7422 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -153,36 +153,12 @@ object FirOptInUsageBaseChecker { val session = context.session if (fir is FirCallableDeclaration) { val parentClassSymbol = fir.containingClassLookupTag()?.toSymbol(session) as? FirRegularClassSymbol - if (fir.isSubstitutionOrIntersectionOverride) { - parentClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS) - val parentClassScope = parentClassSymbol?.unsubstitutedScope(context) - if (this is FirNamedFunctionSymbol) { - parentClassScope?.processDirectlyOverriddenFunctions(this) { - it.loadExperimentalities( - context, result, visited, fromSetter = false, dispatchReceiverType, fromSupertype = false - ) - ProcessorAction.NEXT - } - } else if (this is FirPropertySymbol) { - parentClassScope?.processDirectlyOverriddenProperties(this) { - it.loadExperimentalities(context, result, visited, fromSetter, dispatchReceiverType, fromSupertype = false) - ProcessorAction.NEXT - } - } - } if (fir is FirConstructor) { parentClassSymbol?.loadExperimentalities( context, result, visited, fromSetter = false, dispatchReceiverType = null, fromSupertype = false ) } else { - // Without coneTypeSafe v fails in MT test (FirRenderer.kt) - fir.returnTypeRef.coneTypeSafe().addExperimentalities(context, result, visited) - fir.receiverParameter?.typeRef?.coneType.addExperimentalities(context, result, visited) - if (fir is FirSimpleFunction) { - fir.valueParameters.forEach { - it.returnTypeRef.coneType.addExperimentalities(context, result, visited) - } - } + fir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) } dispatchReceiverType?.addExperimentalities(context, result, visited) if (fromSetter && this is FirPropertySymbol) { @@ -190,17 +166,21 @@ object FirOptInUsageBaseChecker { context, result, visited, fromSetter = false, dispatchReceiverType, fromSupertype = false ) } - } else if (this is FirRegularClassSymbol && fir is FirRegularClass) { - val parentClassSymbol = outerClassSymbol(context) - parentClassSymbol?.loadExperimentalities( - context, result, visited, fromSetter = false, dispatchReceiverType = null, fromSupertype = false - ) - } - - fir.loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype) - - if (fir is FirTypeAlias) { - fir.expandedTypeRef.coneType.addExperimentalities(context, result, visited) + } else if (fir is FirClassLikeDeclaration) { + when (fir) { + is FirRegularClass -> if (this is FirRegularClassSymbol) { + val parentClassSymbol = outerClassSymbol(context) + parentClassSymbol?.loadExperimentalities( + context, result, visited, fromSetter = false, dispatchReceiverType = null, fromSupertype = false + ) + } + is FirTypeAlias -> { + fir.expandedTypeRef.coneType.addExperimentalities(context, result, visited) + } + is FirAnonymousObject -> { + } + } + fir.loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype) } if (fir.getAnnotationByClassId(OptInNames.WAS_EXPERIMENTAL_CLASS_ID) != null) { @@ -217,6 +197,47 @@ object FirOptInUsageBaseChecker { return result } + @OptIn(SymbolInternals::class) + private fun FirCallableDeclaration.loadOverridableSpecificExperimentalities( + session: FirSession, + context: CheckerContext, + parentClassSymbol: FirRegularClassSymbol?, + visited: MutableSet, + result: SmartSet + ) { + if (isSubstitutionOrIntersectionOverride) { + parentClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS) + val parentClassScope = parentClassSymbol?.unsubstitutedScope(context) + if (this is FirSimpleFunction) { + parentClassScope?.processDirectlyOverriddenFunctions(symbol) { overriddenSymbol -> + val overriddenFir = overriddenSymbol.fir + if (visited.add(overriddenFir)) { + overriddenFir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) + } + ProcessorAction.NEXT + } + } else if (this is FirProperty) { + parentClassScope?.processDirectlyOverriddenProperties(symbol) { overriddenSymbol -> + val overriddenFir = overriddenSymbol.fir + if (visited.add(overriddenFir)) { + overriddenFir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) + } + ProcessorAction.NEXT + } + } + } + // Without coneTypeSafe v fails in MT test (FirRenderer.kt) + returnTypeRef.coneTypeSafe().addExperimentalities(context, result, visited) + receiverParameter?.typeRef?.coneType.addExperimentalities(context, result, visited) + if (this is FirSimpleFunction) { + valueParameters.forEach { + it.returnTypeRef.coneType.addExperimentalities(context, result, visited) + } + } + + loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype = false) + } + private fun ConeKotlinType?.addExperimentalities( context: CheckerContext, result: SmartSet,