[FIR] Exposed visibility checker: optimize checks for local visibility
This commit is contained in:
+15
-7
@@ -40,6 +40,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
|
|
||||||
private fun checkSupertypes(declaration: FirRegularClass, reporter: DiagnosticReporter, context: CheckerContext) {
|
private fun checkSupertypes(declaration: FirRegularClass, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||||
val classVisibility = declaration.getEffectiveVisibility(context)
|
val classVisibility = declaration.getEffectiveVisibility(context)
|
||||||
|
|
||||||
|
if (classVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
val supertypes = declaration.superTypeRefs
|
val supertypes = declaration.superTypeRefs
|
||||||
val isInterface = declaration.classKind == ClassKind.INTERFACE
|
val isInterface = declaration.classKind == ClassKind.INTERFACE
|
||||||
for (supertypeRef in supertypes) {
|
for (supertypeRef in supertypes) {
|
||||||
@@ -64,6 +66,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
|
|
||||||
private fun checkParameterBounds(declaration: FirRegularClass, reporter: DiagnosticReporter, context: CheckerContext) {
|
private fun checkParameterBounds(declaration: FirRegularClass, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||||
val classVisibility = declaration.getEffectiveVisibility(context)
|
val classVisibility = declaration.getEffectiveVisibility(context)
|
||||||
|
|
||||||
|
if (classVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
for (parameter in declaration.typeParameters) {
|
for (parameter in declaration.typeParameters) {
|
||||||
for (bound in parameter.symbol.fir.bounds) {
|
for (bound in parameter.symbol.fir.bounds) {
|
||||||
val restricting = bound.coneType.findVisibilityExposure(context, classVisibility)
|
val restricting = bound.coneType.findVisibilityExposure(context, classVisibility)
|
||||||
@@ -83,6 +87,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
private fun checkTypeAlias(declaration: FirTypeAlias, reporter: DiagnosticReporter, context: CheckerContext) {
|
private fun checkTypeAlias(declaration: FirTypeAlias, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||||
val expandedType = declaration.expandedConeType
|
val expandedType = declaration.expandedConeType
|
||||||
val typeAliasVisibility = declaration.getEffectiveVisibility(context)
|
val typeAliasVisibility = declaration.getEffectiveVisibility(context)
|
||||||
|
|
||||||
|
if (typeAliasVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
val restricting = expandedType?.findVisibilityExposure(context, typeAliasVisibility)
|
val restricting = expandedType?.findVisibilityExposure(context, typeAliasVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
reporter.reportExposure(
|
reporter.reportExposure(
|
||||||
@@ -96,8 +102,9 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkFunction(declaration: FirFunction<*>, reporter: DiagnosticReporter, context: CheckerContext) {
|
private fun checkFunction(declaration: FirFunction<*>, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||||
val functionVisibility =
|
val functionVisibility = (declaration as FirMemberDeclaration).getEffectiveVisibility(context)
|
||||||
(declaration as FirMemberDeclaration).getEffectiveVisibility(context)
|
|
||||||
|
if (functionVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
if (declaration !is FirConstructor) {
|
if (declaration !is FirConstructor) {
|
||||||
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
?.findVisibilityExposure(context, functionVisibility)
|
?.findVisibilityExposure(context, functionVisibility)
|
||||||
@@ -132,6 +139,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
|
|
||||||
private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter, context: CheckerContext) {
|
private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||||
val propertyVisibility = declaration.getEffectiveVisibility(context)
|
val propertyVisibility = declaration.getEffectiveVisibility(context)
|
||||||
|
|
||||||
|
if (propertyVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
val restricting =
|
val restricting =
|
||||||
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
?.findVisibilityExposure(context, propertyVisibility)
|
?.findVisibilityExposure(context, propertyVisibility)
|
||||||
@@ -156,6 +165,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
if (typeRef == null || memberDeclaration == null) return
|
if (typeRef == null || memberDeclaration == null) return
|
||||||
val receiverParameterType = typeRef.coneType
|
val receiverParameterType = typeRef.coneType
|
||||||
val memberVisibility = memberDeclaration.getEffectiveVisibility(context)
|
val memberVisibility = memberDeclaration.getEffectiveVisibility(context)
|
||||||
|
|
||||||
|
if (memberVisibility == FirEffectiveVisibilityImpl.Local) return
|
||||||
val restricting = receiverParameterType.findVisibilityExposure(context, memberVisibility)
|
val restricting = receiverParameterType.findVisibilityExposure(context, memberVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
reporter.reportExposure(
|
reporter.reportExposure(
|
||||||
@@ -172,11 +183,8 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
base: FirEffectiveVisibility
|
base: FirEffectiveVisibility
|
||||||
): FirMemberDeclaration? {
|
): FirMemberDeclaration? {
|
||||||
val type = this as? ConeClassLikeType
|
val type = this as? ConeClassLikeType ?: return null
|
||||||
?: return null
|
val fir = type.lookupTag.toSymbol(context.session)?.fir ?: return null
|
||||||
val fir = type.lookupTag.toSymbol(context.session)
|
|
||||||
?.fir
|
|
||||||
?: return null
|
|
||||||
|
|
||||||
if (fir is FirMemberDeclaration) {
|
if (fir is FirMemberDeclaration) {
|
||||||
when (fir.getEffectiveVisibility(context).relation(base)) {
|
when (fir.getEffectiveVisibility(context).relation(base)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user