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:
+1
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -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
|
||||
|
||||
+3
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user