[FIR] Exposed visibility checker: optimize checks for local visibility

This commit is contained in:
Nick
2020-07-31 11:57:25 +03:00
committed by Mikhail Glukhikh
parent 60462bea1c
commit 694d3cad4e
@@ -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)) {