[FIR] Support for FIR_EXPOSED_RECEIVER_TYPE

This commit is contained in:
rapturemain
2020-03-21 04:58:12 +03:00
committed by Mikhail Glukhikh
parent 15d4891c92
commit 0f16c88dd2
3 changed files with 22 additions and 0 deletions
@@ -38,11 +38,26 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
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<ConeClassLikeType>()
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<FirMemberDeclaration>
report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it))
}
}
Error.EXPOSED_RECEIVER_TYPE -> {
source?.let {
report(Errors.FIR_EXPOSED_RECEIVER_TYPE.onSource(it))
}
}
}
}
}
@@ -138,6 +138,7 @@ public interface Errors {
// (FIR) Exposed visibility group
DiagnosticFactory0<PsiElement> FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<PsiElement> FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtTypeParameter> FIR_EXPOSED_RECEIVER_TYPE = DiagnosticFactory0.create(ERROR);
DiagnosticFactory2<KtExpression, KotlinType, Collection<ClassDescriptor>> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING);
@@ -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,