[FIR] Fix EXPOSED_RECEIVER_TYPE

This commit is contained in:
rapturemain
2020-03-21 16:38:49 +03:00
committed by Mikhail Glukhikh
parent 2e8f73adba
commit 216eea6a20
2 changed files with 43 additions and 15 deletions
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.coneTypeSafe
object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() { object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() {
@@ -30,7 +31,13 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
val typeAliasVisibility = declaration.firEffectiveVisibility(declaration.session) val typeAliasVisibility = declaration.firEffectiveVisibility(declaration.session)
val restricting = expandedType?.leastPermissiveDescriptor(declaration.session, typeAliasVisibility) val restricting = expandedType?.leastPermissiveDescriptor(declaration.session, typeAliasVisibility)
if (restricting != null) { if (restricting != null) {
reporter.reportExposure(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE, declaration, restricting) reporter.reportExposure(
FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE,
restricting,
typeAliasVisibility,
restricting.firEffectiveVisibility(declaration.session),
declaration.source
)
} }
} }
@@ -40,7 +47,13 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>() val restricting = declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()
?.leastPermissiveDescriptor(declaration.session, functionVisibility) ?.leastPermissiveDescriptor(declaration.session, functionVisibility)
if (restricting != null) { if (restricting != null) {
reporter.reportExposure(FirErrors.EXPOSED_FUNCTION_RETURN_TYPE, declaration, restricting) reporter.reportExposure(
FirErrors.EXPOSED_FUNCTION_RETURN_TYPE,
restricting,
functionVisibility,
restricting.firEffectiveVisibility(declaration.session),
declaration.source
)
} }
} }
} }
@@ -50,38 +63,50 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
val restricting = val restricting =
declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility) declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility)
if (restricting != null) { if (restricting != null) {
reporter.reportExposure(FirErrors.EXPOSED_PROPERTY_TYPE, declaration, restricting) reporter.reportExposure(
FirErrors.EXPOSED_PROPERTY_TYPE,
restricting,
propertyVisibility,
restricting.firEffectiveVisibility(declaration.session),
declaration.source
)
} }
checkMemberReceiver(declaration.receiverTypeRef?.coneTypeSafe(), declaration, reporter) checkMemberReceiver(declaration.receiverTypeRef, declaration, reporter)
} }
private fun checkMemberReceiver( private fun checkMemberReceiver(
typeRef: ConeClassLikeType?, typeRef: FirTypeRef?,
memberDeclaration: FirCallableMemberDeclaration<*>, reporter: DiagnosticReporter memberDeclaration: FirCallableMemberDeclaration<*>, reporter: DiagnosticReporter
) { ) {
if (typeRef == null) return if (typeRef == null) return
val receiverParameterType = memberDeclaration.receiverTypeRef?.coneTypeSafe<ConeClassLikeType>() val receiverParameterType = typeRef.coneTypeSafe<ConeClassLikeType>()
val memberVisibility = memberDeclaration.effectiveVisibility val memberVisibility = memberDeclaration.firEffectiveVisibility(memberDeclaration.session)
val restricting = receiverParameterType?.leastPermissiveDescriptor(memberDeclaration.session, memberVisibility) val restricting = receiverParameterType?.leastPermissiveDescriptor(memberDeclaration.session, memberVisibility)
if (restricting != null) { if (restricting != null) {
reporter.reportExposure(FirErrors.EXPOSED_RECEIVER_TYPE, memberDeclaration, restricting) reporter.reportExposure(
FirErrors.EXPOSED_RECEIVER_TYPE,
restricting,
memberVisibility,
restricting.firEffectiveVisibility(memberDeclaration.session),
typeRef.source
)
} }
} }
private inline fun <E : FirMemberDeclaration, reified P : PsiElement> DiagnosticReporter.reportExposure( private inline fun <reified E : PsiElement> DiagnosticReporter.reportExposure(
er: DiagnosticFactory3<P, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>, error: DiagnosticFactory3<E, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>,
element: E,
restrictingDeclaration: DeclarationWithRelation, restrictingDeclaration: DeclarationWithRelation,
elementVisibility: FirEffectiveVisibility = element.effectiveVisibility, elementVisibility: FirEffectiveVisibility,
source: FirSourceElement? = element.source restrictingVisibility: FirEffectiveVisibility,
source: FirSourceElement?
) { ) {
source?.let { source?.let {
report( report(
er.onSource( error.onSource(
it, it,
elementVisibility, elementVisibility,
restrictingDeclaration, restrictingDeclaration,
restrictingDeclaration.firEffectiveVisibility(element.session) restrictingVisibility
) )
) )
} }
@@ -12,8 +12,11 @@ import org.jetbrains.kotlin.fir.FirEffectiveVisibility
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
<<<<<<< HEAD
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
=======
>>>>>>> d43c780e5de... [FIR] Fixed EXPOSED_RECEIVER_TYPE
object FirErrors { object FirErrors {
val UNRESOLVED_REFERENCE by error1<FirSourceElement, PsiElement, String?>() val UNRESOLVED_REFERENCE by error1<FirSourceElement, PsiElement, String?>()