[FIR] Fix EXPOSED_RECEIVER_TYPE
This commit is contained in:
committed by
Mikhail Glukhikh
parent
2e8f73adba
commit
216eea6a20
+40
-15
@@ -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?>()
|
||||||
|
|||||||
Reference in New Issue
Block a user