diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt index 5ad7f9d316b..de1b95bbac5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt @@ -38,11 +38,26 @@ object FirExposedVisibilityChecker : FirDeclarationChecker if (restricting != null) { reporter.reportExposure(Error.EXPOSED_PROPERTY_TYPE, declaration.source) } + checkMemberReceiver(declaration.receiverTypeRef?.coneTypeSafe(), declaration, reporter) + } + + private fun checkMemberReceiver( + typeRef: ConeClassLikeType?, + memberDeclaration: FirCallableMemberDeclaration<*>, reporter: DiagnosticReporter + ) { + if (typeRef == null) return + val receiverParameterType = memberDeclaration.receiverTypeRef?.coneTypeSafe() + val memberVisibility = memberDeclaration.effectiveVisibility + val restricting = receiverParameterType?.leastPermissiveDescriptor(memberDeclaration.session, memberVisibility) + if (restricting != null) { + reporter.reportExposure(Error.EXPOSED_RECEIVER_TYPE, memberDeclaration.source) + } } private enum class Error { EXPOSED_TYPEALIAS_EXPANDED_TYPE, EXPOSED_PROPERTY_TYPE, + EXPOSED_RECEIVER_TYPE, } private fun DiagnosticReporter.reportExposure( @@ -60,6 +75,11 @@ object FirExposedVisibilityChecker : FirDeclarationChecker report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it)) } } + Error.EXPOSED_RECEIVER_TYPE -> { + source?.let { + report(Errors.FIR_EXPOSED_RECEIVER_TYPE.onSource(it)) + } + } } } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 19cd0e351b6..ee822d6cfdc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -138,6 +138,7 @@ public interface Errors { // (FIR) Exposed visibility group DiagnosticFactory0 FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 FIR_EXPOSED_RECEIVER_TYPE = DiagnosticFactory0.create(ERROR); DiagnosticFactory2> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index bf75cf84994..f9d9cd0d338 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -84,6 +84,7 @@ public class DefaultErrorMessages { MAP.put(FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE, "FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE"); MAP.put(FIR_EXPOSED_PROPERTY_TYPE, "FIR_EXPOSED_PROPERTY_TYPE"); + MAP.put(FIR_EXPOSED_RECEIVER_TYPE, "FIR_EXPOSED_RECEIVER_TYPE"); MAP.put(EXTENSION_SHADOWED_BY_MEMBER, "Extension is shadowed by a member: {0}", COMPACT_WITH_MODIFIERS); MAP.put(EXTENSION_FUNCTION_SHADOWED_BY_INNER_CLASS_CONSTRUCTOR,