From 0f16c88dd2ef4f9acc1c08ff19d0075013451c7c Mon Sep 17 00:00:00 2001 From: rapturemain Date: Sat, 21 Mar 2020 04:58:12 +0300 Subject: [PATCH] [FIR] Support for FIR_EXPOSED_RECEIVER_TYPE --- .../FirExposedVisibilityChecker.kt | 20 +++++++++++++++++++ .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + 3 files changed, 22 insertions(+) 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,