FIR: introduce declaration origin for binary classes from source module

in particular for incremental compilation when module is only partially
recompiled.
#KT-49750 fixed
This commit is contained in:
Ilya Chernikov
2021-11-17 15:02:07 +01:00
parent f324a81de7
commit cad57e693f
8 changed files with 14 additions and 4 deletions
@@ -42,6 +42,7 @@ internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (ori
else -> KtSymbolOrigin.SOURCE
}
}
FirDeclarationOrigin.Precompiled -> KtSymbolOrigin.SOURCE
FirDeclarationOrigin.Library, FirDeclarationOrigin.BuiltIns -> KtSymbolOrigin.LIBRARY
FirDeclarationOrigin.Java -> KtSymbolOrigin.JAVA
FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR
@@ -476,7 +476,8 @@ fun FirCallableSymbol<*>.getImplementationStatus(
}
return when {
isFinal -> ImplementationStatus.CANNOT_BE_IMPLEMENTED
containingClassSymbol === parentClassSymbol && origin == FirDeclarationOrigin.Source -> ImplementationStatus.ALREADY_IMPLEMENTED
containingClassSymbol === parentClassSymbol && (origin == FirDeclarationOrigin.Source || origin == FirDeclarationOrigin.Precompiled) ->
ImplementationStatus.ALREADY_IMPLEMENTED
containingClassSymbol is FirRegularClassSymbol && containingClassSymbol.isExpect -> ImplementationStatus.CANNOT_BE_IMPLEMENTED
isAbstract -> ImplementationStatus.NOT_IMPLEMENTED
else -> ImplementationStatus.INHERITED_OR_SYNTHESIZED
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
@@ -155,6 +156,7 @@ object FirSessionFactory {
it.packagePartProvider,
projectEnvironment.getKotlinClassFinder(it.scope),
projectEnvironment.getFirJavaFacade(this, moduleData, it.scope),
defaultDeseializationOrigin = FirDeclarationOrigin.Precompiled
)
}
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.createCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
@@ -65,6 +66,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
session: FirSession,
val moduleDataProvider: ModuleDataProvider,
val kotlinScopeProvider: FirKotlinScopeProvider,
val defaultDeserializationOrigin: FirDeclarationOrigin,
) : FirSymbolProvider(session) {
// ------------------------ Caches ------------------------
@@ -146,6 +148,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
kotlinScopeProvider,
parentContext,
sourceElement,
origin = defaultDeserializationOrigin,
deserializeNestedClass = this::getClass,
)
symbol to postProcessor
@@ -9,6 +9,7 @@ import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.getDeprecationInfos
import org.jetbrains.kotlin.fir.deserialization.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -44,7 +45,8 @@ class JvmClassFileBasedSymbolProvider(
private val packagePartProvider: PackagePartProvider,
private val kotlinClassFinder: KotlinClassFinder,
private val javaFacade: FirJavaFacade,
) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider) {
defaultDeseializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library
) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, defaultDeseializationOrigin) {
private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder)
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
@@ -437,7 +437,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(session: FirSession): Forbidd
return ForbiddenNamedArgumentsTarget.EXPECTED_CLASS_MEMBER
}
return when (origin) {
FirDeclarationOrigin.Source, FirDeclarationOrigin.Library -> null
FirDeclarationOrigin.Source, FirDeclarationOrigin.Precompiled, FirDeclarationOrigin.Library -> null
FirDeclarationOrigin.Delegated -> delegatedWrapperData?.wrapped?.getAsForbiddenNamedArgumentsTarget(session)
FirDeclarationOrigin.ImportedFromObject -> importedFromObjectData?.original?.getAsForbiddenNamedArgumentsTarget(session)
// For intersection overrides, the logic in
@@ -389,7 +389,7 @@ abstract class AbstractFirStatusResolveTransformer(
@OptIn(ExperimentalStdlibApi::class)
private fun forceResolveStatusesOfClass(regularClass: FirRegularClass) {
if (regularClass.origin == FirDeclarationOrigin.Java) {
if (regularClass.origin == FirDeclarationOrigin.Java || regularClass.origin == FirDeclarationOrigin.Precompiled) {
/*
* If regular class has no corresponding file then it is platform class,
* so we need to resolve supertypes of this class because they could
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations
sealed class FirDeclarationOrigin(private val displayName: String? = null, val fromSupertypes: Boolean = false, val generated: Boolean = false) {
object Source : FirDeclarationOrigin()
object Library : FirDeclarationOrigin()
object Precompiled : FirDeclarationOrigin() // currently used for incremental compilation
object BuiltIns : FirDeclarationOrigin()
object Java : FirDeclarationOrigin()
object Synthetic : FirDeclarationOrigin()