Fir2Ir: ignore private imported declarations

Code that checks for inclusion is translated from IrLazyClass.
This commit is contained in:
Georgy Bronnikov
2022-03-27 21:59:47 +03:00
committed by Alexander Udalov
parent 536bd99fe7
commit d2781f37ad
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
@@ -30,6 +28,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.util.DeserializableClass import org.jetbrains.kotlin.ir.util.DeserializableClass
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.isObject
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
@@ -156,11 +155,13 @@ class Fir2IrLazyClass(
// e.g. to avoid accessing un-enhanced Java declarations with FirJavaTypeRef etc. inside // e.g. to avoid accessing un-enhanced Java declarations with FirJavaTypeRef etc. inside
val scope = fir.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val scope = fir.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
scope.processDeclaredConstructors { scope.processDeclaredConstructors {
result += declarationStorage.getIrConstructorSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner if (shouldBuildStub(it.fir)) {
result += declarationStorage.getIrConstructorSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner
}
} }
for (declaration in fir.declarations) { for (declaration in fir.declarations) {
if (declaration is FirRegularClass) { if (declaration is FirRegularClass && shouldBuildStub(declaration)) {
val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate) val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate)
result += nestedSymbol.owner result += nestedSymbol.owner
} }
@@ -169,7 +170,7 @@ class Fir2IrLazyClass(
// Handle generated methods for enum classes (values(), valueOf(String)). // Handle generated methods for enum classes (values(), valueOf(String)).
if (fir.classKind == ClassKind.ENUM_CLASS) { if (fir.classKind == ClassKind.ENUM_CLASS) {
for (declaration in fir.declarations) { for (declaration in fir.declarations) {
if (declaration !is FirSimpleFunction || !declaration.isStatic) continue if (declaration !is FirSimpleFunction || !declaration.isStatic || !shouldBuildStub(declaration)) continue
// TODO we also come here for all deserialized / enhanced static enum members (with declaration.source == null). // TODO we also come here for all deserialized / enhanced static enum members (with declaration.source == null).
// For such members we currently can't tell whether they are compiler-generated methods or not. // For such members we currently can't tell whether they are compiler-generated methods or not.
// Note: we must drop declarations from Java here to avoid FirJavaTypeRefs inside // Note: we must drop declarations from Java here to avoid FirJavaTypeRefs inside
@@ -185,6 +186,7 @@ class Fir2IrLazyClass(
for (name in scope.getCallableNames()) { for (name in scope.getCallableNames()) {
scope.processFunctionsByName(name) { scope.processFunctionsByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName
if (!shouldBuildStub(it.fir)) return@processFunctionsByName
if (it.dispatchReceiverClassOrNull() == ownerLookupTag) { if (it.dispatchReceiverClassOrNull() == ownerLookupTag) {
if (it.isAbstractMethodOfAny()) { if (it.isAbstractMethodOfAny()) {
return@processFunctionsByName return@processFunctionsByName
@@ -194,6 +196,7 @@ class Fir2IrLazyClass(
} }
scope.processPropertiesByName(name) { scope.processPropertiesByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName
if (!shouldBuildStub(it.fir)) return@processPropertiesByName
if (it is FirPropertySymbol && it.dispatchReceiverClassOrNull() == ownerLookupTag) { if (it is FirPropertySymbol && it.dispatchReceiverClassOrNull() == ownerLookupTag) {
result.addIfNotNull( result.addIfNotNull(
declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration
@@ -213,6 +216,12 @@ class Fir2IrLazyClass(
result result
} }
private fun shouldBuildStub(fir: FirDeclaration): Boolean =
fir !is FirMemberDeclaration ||
!Visibilities.isPrivate(fir.visibility) ||
// This exception is needed for K/N caches usage
(isObject && fir is FirConstructor)
override var metadata: MetadataSource? override var metadata: MetadataSource?
get() = null get() = null
set(_) = error("We should never need to store metadata of external declarations.") set(_) = error("We should never need to store metadata of external declarations.")
@@ -237,6 +246,6 @@ class Fir2IrLazyClass(
override fun loadIr(): Boolean { override fun loadIr(): Boolean {
assert(parent is IrPackageFragment) assert(parent is IrPackageFragment)
return irLoaded ?: extensions.deserializeToplevelClass(this, this) return irLoaded ?: extensions.deserializeToplevelClass(this, this).also { irLoaded = it }
} }
} }