diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index dc0fc4c6bdc..6b8066d513f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -230,7 +230,7 @@ private fun FirCallableSymbol<*>.toSymbolForCall( val fakeOverrideOwnerLookupTag = when { // Static fake overrides isStatic -> { - ((dispatchReceiver as? FirResolvedQualifier) ?: (explicitReceiver as? FirResolvedQualifier))?.toLookupTag(session) + (dispatchReceiver as? FirResolvedQualifier)?.toLookupTag(session) } // Member fake override or bound callable reference dispatchReceiver !is FirNoReceiverExpression -> { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt index 09807140c85..42a85f1e99a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt @@ -13,12 +13,14 @@ import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.resolve.SupertypeSupplier import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue import org.jetbrains.kotlin.fir.resolve.isSubclassOf import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull @@ -41,7 +43,13 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() { } else { val ownerLookupTag = symbol.getOwnerLookupTag() ?: return false if (canSeeProtectedMemberOf( - symbol, containingDeclarations, dispatchReceiver, ownerLookupTag, session, + symbol, + containingDeclarations, + // Note: dispatch receiver isn't relevant for Java protected static + // See e.g. diagnostics/tests/visibility/packagePrivateStatic.kt + dispatchReceiver.takeUnless { symbol is FirCallableSymbol && symbol.isStatic }, + ownerLookupTag, + session, isVariableOrNamedFunction = symbol.isVariableOrNamedFunction(), isSyntheticProperty = symbol.fir is FirSyntheticPropertyAccessor, supertypeSupplier diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index 183cf69b0e5..47c6f94ae98 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.references.FirSuperReference @@ -330,7 +331,10 @@ abstract class FirVisibilityChecker : FirSessionComponent { ) } - if (dispatchReceiver != null) { + // Note: private static symbols aren't accessible by use-site dispatch receiver + // See e.g. diagnostics/tests/scopes/inheritance/statics/hidePrivateByPublic.kt, + // private A.a becomes visible from outside without filtering static callables here + if (dispatchReceiver != null && (symbol !is FirCallableSymbol || !symbol.isStatic)) { val fir = symbol.fir val dispatchReceiverParameterClassSymbol = (fir as? FirCallableDeclaration) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt index 414613ad59b..ee0b62d5515 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt @@ -33,7 +33,7 @@ fun FirVisibilityChecker.isVisible( dispatchReceiverValue: ReceiverValue? ): Boolean { val staticQualifierForCallable = runIf(declaration is FirCallableDeclaration && declaration.isStatic) { - val explicitReceiver = callInfo.explicitReceiver ?: (dispatchReceiverValue as? ExpressionReceiverValue)?.explicitReceiver + val explicitReceiver = (dispatchReceiverValue as? ExpressionReceiverValue)?.explicitReceiver when (val classLikeSymbol = (explicitReceiver as? FirResolvedQualifier)?.symbol) { is FirRegularClassSymbol -> classLikeSymbol.fir is FirTypeAliasSymbol -> classLikeSymbol.fullyExpandedClass(callInfo.session)?.fir diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index 1cc55886e23..6546478f4cd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isInner +import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier import org.jetbrains.kotlin.fir.resolve.* @@ -382,7 +383,11 @@ class ScopeTowerLevel( } } } - if (candidate.isStatic && callInfo.explicitReceiver == null && candidate.isJavaOrEnhancement) { + if (candidate.isStatic && candidate.isJavaOrEnhancement) { + val explicitReceiver = callInfo.explicitReceiver + if (explicitReceiver is FirResolvedQualifier) { + return ExpressionReceiverValue(explicitReceiver) + } val lookupTag = candidate.fir.containingClassLookupTag() ?: return null val implicitDispatchReceiverValue = bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue -> implicitReceiverValue is ImplicitDispatchReceiverValue && implicitReceiverValue.boundSymbol.fir.isSubclassOf(