[FIR] Fix reporting PRIVATE_CLASS_MEMBER_FROM_INLINE on members of companion

^KT-56172
^KT-55179
This commit is contained in:
Dmitriy Novozhilov
2023-01-25 11:47:48 +02:00
committed by Space Team
parent d856ae1f35
commit 522eec8c51
2 changed files with 11 additions and 8 deletions
@@ -12,19 +12,16 @@ import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.getModifier
import org.jetbrains.kotlin.fir.analysis.checkers.isInlineOnly
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
import org.jetbrains.kotlin.fir.resolve.toSymbol
@@ -319,15 +316,21 @@ abstract class FirInlineDeclarationChecker : FirFunctionChecker() {
}
}
private fun FirCallableSymbol<*>.isInsidePrivateClass(): Boolean {
val containingClassSymbol = this.containingClassLookupTag()?.toSymbol(session) ?: return false
private fun FirBasedSymbol<*>.isInsidePrivateClass(): Boolean {
val containingClassSymbol = this.getOwnerLookupTag()?.toSymbol(session) ?: return false
val containingClassVisibility = when (containingClassSymbol) {
is FirAnonymousObjectSymbol -> return false
is FirRegularClassSymbol -> containingClassSymbol.visibility
is FirTypeAliasSymbol -> containingClassSymbol.visibility
}
return containingClassVisibility == Visibilities.Private || containingClassVisibility == Visibilities.PrivateToThis
if (containingClassVisibility == Visibilities.Private || containingClassVisibility == Visibilities.PrivateToThis) {
return true
}
if (containingClassSymbol is FirRegularClassSymbol && containingClassSymbol.isCompanion) {
return containingClassSymbol.isInsidePrivateClass()
}
return false
}
}
@@ -10,6 +10,6 @@ private class Foo {
internal <!NOTHING_TO_INLINE!>inline<!> fun foo() {
<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>Foo<!>()
Foo.Companion
Foo.buildFoo()
Foo.<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>buildFoo<!>()
}