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 else -> KtSymbolOrigin.SOURCE
} }
} }
FirDeclarationOrigin.Precompiled -> KtSymbolOrigin.SOURCE
FirDeclarationOrigin.Library, FirDeclarationOrigin.BuiltIns -> KtSymbolOrigin.LIBRARY FirDeclarationOrigin.Library, FirDeclarationOrigin.BuiltIns -> KtSymbolOrigin.LIBRARY
FirDeclarationOrigin.Java -> KtSymbolOrigin.JAVA FirDeclarationOrigin.Java -> KtSymbolOrigin.JAVA
FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR
@@ -476,7 +476,8 @@ fun FirCallableSymbol<*>.getImplementationStatus(
} }
return when { return when {
isFinal -> ImplementationStatus.CANNOT_BE_IMPLEMENTED 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 containingClassSymbol is FirRegularClassSymbol && containingClassSymbol.isExpect -> ImplementationStatus.CANNOT_BE_IMPLEMENTED
isAbstract -> ImplementationStatus.NOT_IMPLEMENTED isAbstract -> ImplementationStatus.NOT_IMPLEMENTED
else -> ImplementationStatus.INHERITED_OR_SYNTHESIZED 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.analysis.extensions.additionalCheckers
import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers 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.ModuleDataProvider
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
@@ -155,6 +156,7 @@ object FirSessionFactory {
it.packagePartProvider, it.packagePartProvider,
projectEnvironment.getKotlinClassFinder(it.scope), projectEnvironment.getKotlinClassFinder(it.scope),
projectEnvironment.getFirJavaFacade(this, moduleData, 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.createCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue 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.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
@@ -65,6 +66,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
session: FirSession, session: FirSession,
val moduleDataProvider: ModuleDataProvider, val moduleDataProvider: ModuleDataProvider,
val kotlinScopeProvider: FirKotlinScopeProvider, val kotlinScopeProvider: FirKotlinScopeProvider,
val defaultDeserializationOrigin: FirDeclarationOrigin,
) : FirSymbolProvider(session) { ) : FirSymbolProvider(session) {
// ------------------------ Caches ------------------------ // ------------------------ Caches ------------------------
@@ -146,6 +148,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
kotlinScopeProvider, kotlinScopeProvider,
parentContext, parentContext,
sourceElement, sourceElement,
origin = defaultDeserializationOrigin,
deserializeNestedClass = this::getClass, deserializeNestedClass = this::getClass,
) )
symbol to postProcessor symbol to postProcessor
@@ -9,6 +9,7 @@ import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ThreadSafeMutableState 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.declarations.getDeprecationInfos
import org.jetbrains.kotlin.fir.deserialization.* import org.jetbrains.kotlin.fir.deserialization.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -44,7 +45,8 @@ class JvmClassFileBasedSymbolProvider(
private val packagePartProvider: PackagePartProvider, private val packagePartProvider: PackagePartProvider,
private val kotlinClassFinder: KotlinClassFinder, private val kotlinClassFinder: KotlinClassFinder,
private val javaFacade: FirJavaFacade, private val javaFacade: FirJavaFacade,
) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider) { defaultDeseializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library
) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, defaultDeseializationOrigin) {
private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder) private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder)
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> { override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
@@ -437,7 +437,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(session: FirSession): Forbidd
return ForbiddenNamedArgumentsTarget.EXPECTED_CLASS_MEMBER return ForbiddenNamedArgumentsTarget.EXPECTED_CLASS_MEMBER
} }
return when (origin) { return when (origin) {
FirDeclarationOrigin.Source, FirDeclarationOrigin.Library -> null FirDeclarationOrigin.Source, FirDeclarationOrigin.Precompiled, FirDeclarationOrigin.Library -> null
FirDeclarationOrigin.Delegated -> delegatedWrapperData?.wrapped?.getAsForbiddenNamedArgumentsTarget(session) FirDeclarationOrigin.Delegated -> delegatedWrapperData?.wrapped?.getAsForbiddenNamedArgumentsTarget(session)
FirDeclarationOrigin.ImportedFromObject -> importedFromObjectData?.original?.getAsForbiddenNamedArgumentsTarget(session) FirDeclarationOrigin.ImportedFromObject -> importedFromObjectData?.original?.getAsForbiddenNamedArgumentsTarget(session)
// For intersection overrides, the logic in // For intersection overrides, the logic in
@@ -389,7 +389,7 @@ abstract class AbstractFirStatusResolveTransformer(
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
private fun forceResolveStatusesOfClass(regularClass: FirRegularClass) { 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, * If regular class has no corresponding file then it is platform class,
* so we need to resolve supertypes of this class because they could * 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) { sealed class FirDeclarationOrigin(private val displayName: String? = null, val fromSupertypes: Boolean = false, val generated: Boolean = false) {
object Source : FirDeclarationOrigin() object Source : FirDeclarationOrigin()
object Library : FirDeclarationOrigin() object Library : FirDeclarationOrigin()
object Precompiled : FirDeclarationOrigin() // currently used for incremental compilation
object BuiltIns : FirDeclarationOrigin() object BuiltIns : FirDeclarationOrigin()
object Java : FirDeclarationOrigin() object Java : FirDeclarationOrigin()
object Synthetic : FirDeclarationOrigin() object Synthetic : FirDeclarationOrigin()