diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt index bbc4fb64f26..5ea32fc61c5 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtDefaultLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.lifetime.KtReadActionConfinementDefaultLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory +import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInDefinitionFile +import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProviderImpl import org.jetbrains.kotlin.analysis.providers.* @@ -49,16 +51,24 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() { val roots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots( moduleStructure.binaryModules.flatMap { binary -> binary.getBinaryRoots() }, testServices.environmentManager.getProjectEnvironment() - ).distinct() + ) project.apply { registerService(KtModuleScopeProvider::class.java, KtModuleScopeProviderImpl()) registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles)) - registerService(KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory( - project, - allKtFiles, - additionalRoots = roots - )) + val filter = BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES + try { + BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = false + registerService( + KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory( + project, + allKtFiles, + additionalRoots = roots + ) + ) + } finally { + BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = filter + } registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, allKtFiles)) registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java) registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java) diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt index 7e1649284ba..3e1010b7dd7 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt @@ -296,7 +296,11 @@ public class KotlinStaticDeclarationProviderFactory( ktFileStub.childrenStubs.forEach(::indexStub) } - loadBuiltIns().forEach { processStub(it) } + val builtins = mutableSetOf() + loadBuiltIns().forEach { stub -> + processStub(stub) + builtins.add(stub.psi.virtualFile.name) + } val binaryClassCache = ClsKotlinBinaryClassCache.getInstance() for (root in additionalRoots) { @@ -304,10 +308,20 @@ public class KotlinStaticDeclarationProviderFactory( val stubs = mutableListOf() VfsUtilCore.visitChildrenRecursively(additionalRoot, object : VirtualFileVisitor() { override fun visitFile(file: VirtualFile): Boolean { - if (!file.isDirectory && file.fileType == JavaClassFileType.INSTANCE) { + if (!file.isDirectory) { val fileContent = FileContentImpl.createByFile(file) if (!binaryClassCache.isKotlinJvmCompiledFile(file, fileContent.content)) return true - val stub = KotlinClsStubBuilder().buildFileStub(fileContent) as? KotlinFileStubImpl ?: return true + val stub: KotlinFileStubImpl = when { + file.fileType == JavaClassFileType.INSTANCE -> { + if (!binaryClassCache.isKotlinJvmCompiledFile(file, fileContent.content)) return true + KotlinClsStubBuilder().buildFileStub(fileContent) as? KotlinFileStubImpl ?: return true + } + file.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION -> { + if (!builtins.add(file.name)) return true + builtInDecompiler.stubBuilder.buildFileStub(fileContent) as? KotlinFileStubImpl ?: return true + } + else -> return true + } val fakeFile = object : KtFile(KtClassFileViewProvider(psiManager, fileContent.file), isCompiled = true) { override fun getStub() = stub override fun isPhysical() = false diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/StandaloneProjectFactory.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/StandaloneProjectFactory.kt index 0fa65625b92..5f476f7f900 100644 --- a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/StandaloneProjectFactory.kt +++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/StandaloneProjectFactory.kt @@ -226,7 +226,7 @@ object StandaloneProjectFactory { VirtualFileManager.getInstance().findFileByNioPath(path) } } - } + }.distinct() } private fun withAllTransitiveDependencies(ktModules: List): List { diff --git a/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/MutableList.txt b/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/MutableList.txt index 07e8e9b4f0a..207c04965e5 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/MutableList.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/MutableList.txt @@ -1261,39 +1261,9 @@ KtKotlinPropertySymbol: deprecationStatus: null callableIdIfNonLocal: kotlin/collections/List.size contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: ABSTRACT - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/Int - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public - getDispatchReceiver(): KtUsualClassType: - annotationsList: [] - ownTypeArguments: [ - KtTypeParameterType: - annotationsList: [] - type: E - ] - type: kotlin/collections/List - getContainingModule: KtBinaryModule "Builtins for JVM (1.8)" - deprecationStatus: null + getter: null hasBackingField: false - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false diff --git a/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/enumEntry.txt b/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/enumEntry.txt index 2050a6b710b..0303ceb8c3b 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/enumEntry.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/memberScopeByFqName/enumEntry.txt @@ -337,39 +337,9 @@ KtKotlinPropertySymbol: deprecationStatus: null callableIdIfNonLocal: kotlin/Enum.name contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: FINAL - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/String - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public - getDispatchReceiver(): KtUsualClassType: - annotationsList: [] - ownTypeArguments: [ - KtTypeParameterType: - annotationsList: [] - type: E - ] - type: kotlin/Enum - getContainingModule: KtBinaryModule "Builtins for JVM (1.8)" - deprecationStatus: null + getter: null hasBackingField: true - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false @@ -428,39 +398,9 @@ KtKotlinPropertySymbol: deprecationStatus: null callableIdIfNonLocal: kotlin/Enum.ordinal contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: FINAL - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/Int - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public - getDispatchReceiver(): KtUsualClassType: - annotationsList: [] - ownTypeArguments: [ - KtTypeParameterType: - annotationsList: [] - type: E - ] - type: kotlin/Enum - getContainingModule: KtBinaryModule "Builtins for JVM (1.8)" - deprecationStatus: null + getter: null hasBackingField: true - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false diff --git a/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/enumEntry.txt b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/enumEntry.txt index fe70bef69a5..72d2441ed95 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/enumEntry.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/enumEntry.txt @@ -333,29 +333,9 @@ scopes: typeParameters: [] callableIdIfNonLocal: kotlin/Enum.name contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: FINAL - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/String - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public + getter: null hasBackingField: true - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false @@ -397,29 +377,9 @@ scopes: typeParameters: [] callableIdIfNonLocal: kotlin/Enum.ordinal contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: FINAL - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/Int - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public + getter: null hasBackingField: true - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false diff --git a/analysis/analysis-api/testData/components/scopeProvider/typeScope/intList.txt b/analysis/analysis-api/testData/components/scopeProvider/typeScope/intList.txt index 19858b06ccc..6fa5e2b7382 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/typeScope/intList.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/typeScope/intList.txt @@ -623,29 +623,9 @@ KtKotlinPropertySymbol: typeParameters: [] callableIdIfNonLocal: kotlin/collections/List.size contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: ABSTRACT - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/Int - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public + getter: null hasBackingField: false - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false diff --git a/analysis/analysis-api/testData/components/scopeProvider/typeScope/typeParamList.txt b/analysis/analysis-api/testData/components/scopeProvider/typeScope/typeParamList.txt index 2b4f74303d7..0d18ebd4ed8 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/typeScope/typeParamList.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/typeScope/typeParamList.txt @@ -623,29 +623,9 @@ KtKotlinPropertySymbol: typeParameters: [] callableIdIfNonLocal: kotlin/collections/List.size contextReceivers: [] - getter: KtPropertyGetterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - contextReceivers: [] - hasBody: false - hasStableParameterNames: true - isDefault: true - isExtension: false - isInline: false - isOverride: false - modality: ABSTRACT - origin: LIBRARY - receiverParameter: null - returnType: KtUsualClassType: - annotationsList: [] - ownTypeArguments: [] - type: kotlin/Int - symbolKind: ACCESSOR - typeParameters: [] - valueParameters: [] - visibility: Public + getter: null hasBackingField: false - hasGetter: true + hasGetter: false hasSetter: false initializer: null isConst: false diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt index eb1445a9e0e..26807c0df06 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt @@ -7,9 +7,12 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure import com.intellij.openapi.project.Project import com.intellij.openapi.util.ModificationTracker -import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirBuiltinSymbolProvider +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.search.DelegatingGlobalSearchScope +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirBuiltinsAndCloneableSessionProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession +import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.JvmStubBasedFirDeserializedSymbolProvider import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl @@ -17,8 +20,11 @@ import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.PrivateSessionConstructor import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped @@ -29,12 +35,15 @@ import org.jetbrains.kotlin.fir.session.registerCommonComponentsAfterExtensionsA import org.jetbrains.kotlin.fir.session.registerCommonJavaComponents import org.jetbrains.kotlin.fir.session.registerModuleData import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.platform.isJs import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import java.util.concurrent.ConcurrentHashMap @OptIn(PrivateSessionConstructor::class, SessionConfiguration::class) @@ -46,6 +55,11 @@ class LLFirBuiltinsSessionFactory(private val project: Project) { return builtinsAndCloneableSession.getOrPut(platform) { createBuiltinsAndCloneableSession(platform) } } + @TestOnly + fun clearForTheNextTest() { + builtinsAndCloneableSession.clear() + } + private fun createBuiltinsAndCloneableSession(platform: TargetPlatform): LLFirBuiltinsAndCloneableSession { val builtinsModule = KtBuiltinsModule(platform, platform.getAnalyzerServices(), project) @@ -64,7 +78,28 @@ class LLFirBuiltinsSessionFactory(private val project: Project) { register(FirKotlinScopeProvider::class, kotlinScopeProvider) val symbolProvider = createCompositeSymbolProvider(this) { - add(LLFirBuiltinSymbolProvider(session, moduleData, kotlinScopeProvider)) + val moduleDataProvider = SingleModuleDataProvider(moduleData) + add( + object : JvmStubBasedFirDeserializedSymbolProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + project, + BuiltinsGlobalSearchScope(project), + FirDeclarationOrigin.BuiltIns + ) { + private val syntheticFunctionInterfaceProvider = FirBuiltinSyntheticFunctionInterfaceProvider( + session, + moduleData, + kotlinScopeProvider + ) + + override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { + return super.getClassLikeSymbolByClassId(classId) + ?: syntheticFunctionInterfaceProvider.getClassLikeSymbolByClassId(classId) + } + } + ) add(FirExtensionSyntheticFunctionInterfaceProvider(session, moduleData, kotlinScopeProvider)) add(FirCloneableSymbolProvider(session, moduleData, kotlinScopeProvider)) } @@ -81,6 +116,15 @@ class LLFirBuiltinsSessionFactory(private val project: Project) { } } +internal class BuiltinsGlobalSearchScope(project: Project) : DelegatingGlobalSearchScope(project, allScope(project)) { + override fun contains(file: VirtualFile): Boolean { + if (file.extension != BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) { + return false + } + return super.contains(file) + } +} + private fun TargetPlatform.getAnalyzerServices() = when { isJvm() -> JvmPlatformAnalyzerServices isJs() -> JvmPlatformAnalyzerServices/*TODO*/ diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/extensions/LLFirResolveExtensionTool.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/extensions/LLFirResolveExtensionTool.kt index 83b720fdcfc..b4386ca1269 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/extensions/LLFirResolveExtensionTool.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/extensions/LLFirResolveExtensionTool.kt @@ -239,7 +239,7 @@ class LLFirResolveExtensionToolDeclarationProvider internal constructor( } override fun computePackageSetWithTopLevelCallableDeclarations(): Set { - return emptySet() //todo + return emptySet() } private inline fun getDeclarationProvidersByPackage( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt index fa8d766f921..ebbf6289165 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt @@ -11,8 +11,10 @@ import com.intellij.psi.util.CachedValuesManager import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.canBePartOfParentDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.retryOnInvalidSession +import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FirElementsRecorder import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache @@ -99,9 +101,6 @@ internal abstract class LLFirResolvableResolveSession( ktDeclaration: KtDeclaration, phase: FirResolvePhase ): FirBasedSymbol<*> { - if (ktDeclaration.containingKtFile.isCompiled) { - return findFirCompiledSymbol(ktDeclaration) - } val module = ktDeclaration.getKtModule() retryOnInvalidSession { return when (getModuleKind(module)) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmFromStubDecompilerSource.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmFromStubDecompilerSource.kt index c949ff9ab95..f26d75f693a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmFromStubDecompilerSource.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmFromStubDecompilerSource.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ //required for LLFirDependenciesSymbolProvider#jvmClassName, to resolve ambiguities //todo check if moving builtins to stubs would solve the issue -class JvmFromStubDecompilerSource( +internal class JvmFromStubDecompilerSource( override val className: JvmClassName, override val facadeClassName: JvmClassName? = null, override val incompatibility: IncompatibleVersionErrorData? = null, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedDeserializedSymbolProviderFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedDeserializedSymbolProviderFactory.kt index fb57d342922..d6f9e60652b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedDeserializedSymbolProviderFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedDeserializedSymbolProviderFactory.kt @@ -12,8 +12,8 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.JvmFirDeserializedSymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.createJavaSymbolProvider -import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.java.FirJavaFacade import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol -class JvmStubBasedDeserializedSymbolProviderFactory : JvmFirDeserializedSymbolProviderFactory() { +internal class JvmStubBasedDeserializedSymbolProviderFactory : JvmFirDeserializedSymbolProviderFactory() { override fun createJvmFirDeserializedSymbolProviders( project: Project, session: FirSession, @@ -42,12 +42,16 @@ class JvmStubBasedDeserializedSymbolProviderFactory : JvmFirDeserializedSymbolPr session, moduleDataProvider, kotlinScopeProvider, - project.createDeclarationProvider(object : DelegatingGlobalSearchScope(project, scope) { + project, + object : DelegatingGlobalSearchScope(project, scope) { override fun contains(file: VirtualFile): Boolean { - if (file.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) return false + if (file.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) { + return false + } return super.contains(file) } - }) + }, + FirDeclarationOrigin.Library ) ) add(createJavaSymbolProvider(session, moduleData, project, scope)) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedFirDeserializedSymbolProvider.kt index fba7b9a6398..b685df88f46 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedFirDeserializedSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubBasedFirDeserializedSymbolProvider.kt @@ -5,13 +5,17 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolProviderNameCache import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider import org.jetbrains.kotlin.fir.FirSession 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.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinBuiltins import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -40,18 +44,26 @@ typealias DeserializedTypeAliasPostProcessor = (FirTypeAliasSymbol) -> Unit * * Same as [JvmClassFileBasedSymbolProvider], resulting fir elements are already resolved. */ -class JvmStubBasedFirDeserializedSymbolProvider( +internal open class JvmStubBasedFirDeserializedSymbolProvider( session: FirSession, moduleDataProvider: SingleModuleDataProvider, private val kotlinScopeProvider: FirKotlinScopeProvider, - private val declarationProvider: KotlinDeclarationProvider + project: Project, + scope: GlobalSearchScope, + private val initialOrigin: FirDeclarationOrigin ) : FirSymbolProvider(session) { + private val declarationProvider by lazy(LazyThreadSafetyMode.PUBLICATION) { project.createDeclarationProvider(scope) } private val moduleData = moduleDataProvider.getModuleData(null) private val packageSetWithTopLevelCallableDeclarations: Set by lazy(LazyThreadSafetyMode.PUBLICATION) { declarationProvider.computePackageSetWithTopLevelCallableDeclarations() } - private val namesByPackageCache = LLFirKotlinSymbolProviderNameCache(session, declarationProvider) + private val namesByPackageCache by lazy(LazyThreadSafetyMode.PUBLICATION) { + LLFirKotlinSymbolProviderNameCache( + session, + declarationProvider + ) + } private val typeAliasCache: FirCache = session.firCachesFactory.createCacheWithPostCompute( @@ -92,7 +104,7 @@ class JvmStubBasedFirDeserializedSymbolProvider( classId.packageFqName, classId.relativeClassName, classLikeDeclaration, - null, null, symbol + null, null, symbol, initialOrigin ) rootContext.memberDeserializer.loadTypeAlias(classLikeDeclaration, symbol) } @@ -117,8 +129,13 @@ class JvmStubBasedFirDeserializedSymbolProvider( StubBasedAnnotationDeserializer(session), kotlinScopeProvider, parentContext, - JvmFromStubDecompilerSource(JvmClassName.byClassId(classId)), + containerSource = if (initialOrigin == FirDeclarationOrigin.BuiltIns) null else JvmFromStubDecompilerSource( + JvmClassName.byClassId( + classId + ) + ), deserializeNestedClass = this::getClass, + initialOrigin ) return symbol } @@ -135,12 +152,12 @@ class JvmStubBasedFirDeserializedSymbolProvider( val file = original.containingKtFile val virtualFile = file.virtualFile if (virtualFile.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION) return@mapNotNull null - if (file.packageFqName.asString() + if (initialOrigin != FirDeclarationOrigin.BuiltIns && file.packageFqName.asString() .replace(".", "/") + "/" + virtualFile.nameWithoutExtension in KotlinBuiltins ) return@mapNotNull null val symbol = FirNamedFunctionSymbol(callableId) val rootContext = - StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol) + StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol, initialOrigin) rootContext.memberDeserializer.loadFunction(original, null, session, symbol).symbol } } @@ -154,7 +171,7 @@ class JvmStubBasedFirDeserializedSymbolProvider( if (origins != null && !origins.add(original)) return@mapNotNull null val symbol = FirPropertySymbol(callableId) val rootContext = - StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol) + StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol, initialOrigin) rootContext.memberDeserializer.loadProperty(original, null, symbol).symbol } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedAnnotationDeserializer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedAnnotationDeserializer.kt index 1803e6ecb26..f3ef49e6a50 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedAnnotationDeserializer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedAnnotationDeserializer.kt @@ -5,19 +5,21 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization -import org.jetbrains.kotlin.constant.* import com.intellij.psi.PsiElement import org.jetbrains.kotlin.KtRealPsiSourceElement +import org.jetbrains.kotlin.constant.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.collectEnumEntries -import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirConstExpression +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.buildUnaryArgumentList import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.references.builder.buildFromMissingDependenciesNamedReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.lexer.KtTokens @@ -25,23 +27,24 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtAnnotated +import org.jetbrains.kotlin.psi.KtAnnotationEntry +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes -import org.jetbrains.kotlin.psi.stubs.impl.* +import org.jetbrains.kotlin.psi.stubs.impl.KotlinAnnotationEntryStubImpl +import org.jetbrains.kotlin.psi.stubs.impl.KotlinClassTypeBean +import org.jetbrains.kotlin.psi.stubs.impl.KotlinPropertyStubImpl import org.jetbrains.kotlin.types.ConstantValueKind class StubBasedAnnotationDeserializer( private val session: FirSession, ) { - //fun inheritAnnotationInfo(parent: StubBasedAnnotationDeserializer) {} - fun loadAnnotations( ktAnnotated: KtAnnotated, - useSiteTarget: AnnotationUseSiteTarget? = null ): List { val annotations = ktAnnotated.annotationEntries if (annotations.isEmpty()) return emptyList() - return annotations.map { deserializeAnnotation(it, useSiteTarget) } + return annotations.map { deserializeAnnotation(it) } } private val constantCache = mutableMapOf() @@ -55,8 +58,7 @@ class StubBasedAnnotationDeserializer( } private fun deserializeAnnotation( - ktAnnotation: KtAnnotationEntry, - useSiteTarget: AnnotationUseSiteTarget? = null + ktAnnotation: KtAnnotationEntry ): FirAnnotation { val userType = ktAnnotation.getStubOrPsiChild(KtStubElementTypes.CONSTRUCTOR_CALLEE)?.getStubOrPsiChild(KtStubElementTypes.TYPE_REFERENCE) @@ -65,7 +67,7 @@ class StubBasedAnnotationDeserializer( ktAnnotation, userType.classId(), (ktAnnotation.stub as? KotlinAnnotationEntryStubImpl)?.valueArguments, - useSiteTarget + ktAnnotation.useSiteTarget?.getAnnotationUseSiteTarget() ) } @@ -78,13 +80,11 @@ class StubBasedAnnotationDeserializer( return buildAnnotation { source = KtRealPsiSourceElement(ktAnnotation) annotationTypeRef = buildResolvedTypeRef { - type = classId.toLookupTag().constructClassType(emptyArray(), isNullable = false) + type = classId.toLookupTag().constructClassType(ConeTypeProjection.EMPTY_ARRAY, isNullable = false) } - session.lazyDeclarationResolver.disableLazyResolveContractChecksInside { - this.argumentMapping = buildAnnotationArgumentMapping { - valueArguments?.forEach { (name, constantValue) -> - mapping[name] = resolveValue(ktAnnotation, constantValue) - } + this.argumentMapping = buildAnnotationArgumentMapping { + valueArguments?.forEach { (name, constantValue) -> + mapping[name] = resolveValue(ktAnnotation, constantValue) } } useSiteTarget?.let { @@ -102,7 +102,7 @@ class StubBasedAnnotationDeserializer( is KClassValue -> buildGetClassCall { source = KtRealPsiSourceElement(sourceElement) val lookupTag = (value.value as KClassValue.Value.NormalClass).classId.toLookupTag() - val referencedType = lookupTag.constructType(emptyArray(), isNullable = false) + val referencedType = lookupTag.constructType(ConeTypeProjection.EMPTY_ARRAY, isNullable = false) val resolvedTypeRef = buildResolvedTypeRef { type = StandardClassIds.KClass.constructClassLikeType(arrayOf(referencedType), false) } @@ -118,9 +118,6 @@ class StubBasedAnnotationDeserializer( argumentList = buildArgumentList { value.value.mapTo(arguments) { resolveValue(sourceElement, it) } } -// typeRef = buildResolvedTypeRef { -// type = expectedArrayElementType.createArrayType() //todo -// } } is AnnotationValue -> { deserializeAnnotation( @@ -147,7 +144,12 @@ class StubBasedAnnotationDeserializer( } } - private fun const(kind: ConstantValueKind, value: T, typeRef: FirResolvedTypeRef, sourceElement: PsiElement): FirConstExpression { + private fun const( + kind: ConstantValueKind, + value: T, + typeRef: FirResolvedTypeRef, + sourceElement: PsiElement + ): FirConstExpression { return buildConstExpression( KtRealPsiSourceElement(sourceElement), kind, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt index cf829439a37..ca312046965 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt @@ -45,7 +45,7 @@ internal val KtDeclaration.modality: Modality } } -fun deserializeClassToSymbol( +internal fun deserializeClassToSymbol( classId: ClassId, classOrObject: KtClassOrObject, symbol: FirRegularClassSymbol, @@ -55,7 +55,8 @@ fun deserializeClassToSymbol( scopeProvider: FirScopeProvider, parentContext: StubBasedFirDeserializationContext? = null, containerSource: DeserializedContainerSource? = null, - deserializeNestedClass: (ClassId, StubBasedFirDeserializationContext) -> FirRegularClassSymbol? + deserializeNestedClass: (ClassId, StubBasedFirDeserializationContext) -> FirRegularClassSymbol?, + initialOrigin: FirDeclarationOrigin ) { val kind = when (classOrObject) { is KtObjectDeclaration -> ClassKind.OBJECT @@ -98,17 +99,13 @@ fun deserializeClassToSymbol( moduleData, annotationDeserializer, containerSource, - symbol + symbol, + initialOrigin ) -// if (status.isCompanion) { -// parentContext?.let { -// context.annotationDeserializer.inheritAnnotationInfo(it.annotationDeserializer) -// } -// } buildRegularClass { source = KtRealPsiSourceElement(classOrObject) this.moduleData = moduleData - this.origin = FirDeclarationOrigin.Library + this.origin = initialOrigin name = classId.shortClassName this.status = status classKind = kind @@ -131,7 +128,7 @@ fun deserializeClassToSymbol( it.typeReference ?: error("Super entry doesn't have type reference $it") ) }) - } else if (StandardClassIds.Any != classId) { + } else if (StandardClassIds.Any != classId && StandardClassIds.Nothing != classId) { superTypeRefs.add(session.builtinTypes.anyType) } @@ -159,17 +156,21 @@ fun deserializeClassToSymbol( moduleData, classId.packageFqName, classId.relativeClassName, - origin = FirDeclarationOrigin.Library + origin = initialOrigin ) - generateValueOfFunction(moduleData, classId.packageFqName, classId.relativeClassName, origin = FirDeclarationOrigin.Library) - generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName, origin = FirDeclarationOrigin.Library) + generateValueOfFunction(moduleData, classId.packageFqName, classId.relativeClassName, origin = initialOrigin) + generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName, origin = initialOrigin) } if (classOrObject.isData() && firPrimaryConstructor != null) { val zippedParameters = classOrObject.primaryConstructorParameters.filter { it.hasValOrVar() } zip declarations.filterIsInstance() addDeclaration(createDataClassCopyFunction(classId, classOrObject, context.dispatchReceiver, zippedParameters, - createClassTypeRefWithSourceKind = { firPrimaryConstructor.returnTypeRef.copyWithNewSourceKind(it) }, + createClassTypeRefWithSourceKind = { + firPrimaryConstructor.returnTypeRef.copyWithNewSourceKind( + it + ) + }, createParameterTypeRefWithSourceKind = { property, newKind -> property.returnTypeRef.copyWithNewSourceKind(newKind) }) { src, kind -> @@ -196,14 +197,6 @@ fun deserializeClassToSymbol( contextReceivers.addAll(memberDeserializer.createContextReceiversForClass(classOrObject)) }.apply { - //todo sealed inheritors - //if (modality == Modality.SEALED) { -// val inheritors = classOrObject.sealedSubclassFqNameList.map { nameIndex -> -// ClassId.fromString(nameResolver.getQualifiedClassName(nameIndex)) -// } -// setSealedClassInheritors(inheritors) - //} - valueClassRepresentation = computeValueClassRepresentation(this, session) replaceAnnotations( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirContractDeserializer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirContractDeserializer.kt index c83c2bb3458..0c3ab7b715e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirContractDeserializer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirContractDeserializer.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.stubs.impl.* -class StubBasedFirContractDeserializer( +internal class StubBasedFirContractDeserializer( private val simpleFunction: FirSimpleFunction, private val typeDeserializer: StubBasedFirTypeDeserializer ) { @@ -123,8 +123,10 @@ class StubBasedFirContractDeserializer( booleanValueParameterReference: KtBooleanValueParameterReference, data: Nothing? ): ConeContractDescriptionElement { - return ConeBooleanValueParameterReference(booleanValueParameterReference.parameterIndex, - getParameterName(booleanValueParameterReference.parameterIndex)) + return ConeBooleanValueParameterReference( + booleanValueParameterReference.parameterIndex, + getParameterName(booleanValueParameterReference.parameterIndex) + ) } private fun getParameterName(parameterIndex: Int): String { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt index 2a8962e7fd3..3ab2a386542 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.sourceElement import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub @@ -35,7 +36,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource -class StubBasedFirDeserializationContext( +internal class StubBasedFirDeserializationContext( val moduleData: FirModuleData, val packageFqName: FqName, val relativeClassName: FqName?, @@ -43,7 +44,8 @@ class StubBasedFirDeserializationContext( val annotationDeserializer: StubBasedAnnotationDeserializer, val containerSource: DeserializedContainerSource?, val outerClassSymbol: FirRegularClassSymbol?, - val outerTypeParameters: List + val outerTypeParameters: List, + private val initialOrigin: FirDeclarationOrigin ) { val session: FirSession = moduleData.session @@ -67,16 +69,18 @@ class StubBasedFirDeserializationContext( annotationDeserializer, typeDeserializer, containingDeclarationSymbol, - owner + owner, + initialOrigin ), annotationDeserializer, containerSource, outerClassSymbol, - if (capturesTypeParameters) allTypeParameters else emptyList() + if (capturesTypeParameters) allTypeParameters else emptyList(), + initialOrigin ) - val memberDeserializer: StubBasedFirMemberDeserializer = StubBasedFirMemberDeserializer(this) - val dispatchReceiver = relativeClassName?.let { ClassId(packageFqName, it, false).defaultType(allTypeParameters) } + val memberDeserializer: StubBasedFirMemberDeserializer = StubBasedFirMemberDeserializer(this, initialOrigin) + val dispatchReceiver = relativeClassName?.let { ClassId(packageFqName, it, /* local = */ false).defaultType(allTypeParameters) } companion object { @@ -86,7 +90,8 @@ class StubBasedFirDeserializationContext( moduleData: FirModuleData, annotationDeserializer: StubBasedAnnotationDeserializer, containerSource: DeserializedContainerSource?, - outerClassSymbol: FirRegularClassSymbol + outerClassSymbol: FirRegularClassSymbol, + initialOrigin: FirDeclarationOrigin ): StubBasedFirDeserializationContext = createRootContext( moduleData, annotationDeserializer, @@ -95,7 +100,8 @@ class StubBasedFirDeserializationContext( classOrObject, containerSource, outerClassSymbol, - outerClassSymbol + outerClassSymbol, + initialOrigin ) fun createRootContext( @@ -106,7 +112,8 @@ class StubBasedFirDeserializationContext( owner: KtTypeParameterListOwner, containerSource: DeserializedContainerSource?, outerClassSymbol: FirRegularClassSymbol?, - containingDeclarationSymbol: FirBasedSymbol<*>? + containingDeclarationSymbol: FirBasedSymbol<*>?, + initialOrigin: FirDeclarationOrigin ): StubBasedFirDeserializationContext = StubBasedFirDeserializationContext( moduleData, packageFqName, @@ -114,14 +121,16 @@ class StubBasedFirDeserializationContext( StubBasedFirTypeDeserializer( moduleData, annotationDeserializer, - null, + parent = null, containingDeclarationSymbol, - owner + owner, + initialOrigin ), annotationDeserializer, containerSource, outerClassSymbol, - emptyList() + outerTypeParameters = emptyList(), + initialOrigin ) fun createRootContext( @@ -129,21 +138,27 @@ class StubBasedFirDeserializationContext( moduleData: FirModuleData, callableId: CallableId, parameterListOwner: KtTypeParameterListOwner, - symbol: FirBasedSymbol<*> + symbol: FirBasedSymbol<*>, + initialOrigin: FirDeclarationOrigin ): StubBasedFirDeserializationContext = createRootContext( moduleData, StubBasedAnnotationDeserializer(session), callableId.packageName, callableId.className, parameterListOwner, - JvmFromStubDecompilerSource(callableId.packageName), - null, - symbol + containerSource = if (initialOrigin == FirDeclarationOrigin.BuiltIns || callableId.packageName.isRoot) + null else JvmFromStubDecompilerSource(callableId.packageName), + outerClassSymbol = null, + symbol, + initialOrigin ) } } -class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationContext) { +internal class StubBasedFirMemberDeserializer( + private val c: StubBasedFirDeserializationContext, + private val initialOrigin: FirDeclarationOrigin +) { fun loadTypeAlias(typeAlias: KtTypeAlias, aliasSymbol: FirTypeAliasSymbol): FirTypeAlias { val name = typeAlias.nameAsSafeName @@ -151,7 +166,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC return buildTypeAlias { source = KtRealPsiSourceElement(typeAlias) moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = initialOrigin this.name = name val visibility = typeAlias.visibility status = FirResolvedDeclarationStatusImpl( @@ -185,7 +200,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC return buildPropertyAccessor { source = KtRealPsiSourceElement(getter) moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = initialOrigin this.returnTypeRef = returnTypeRef resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES isGetter = true @@ -198,9 +213,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC this.propertySymbol = propertySymbol }.apply { replaceAnnotations( - c.annotationDeserializer.loadAnnotations( - getter, AnnotationUseSiteTarget.PROPERTY_GETTER - ) + c.annotationDeserializer.loadAnnotations(getter) ) containingClassForStaticMemberAttr = c.dispatchReceiver?.lookupTag } @@ -218,7 +231,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC return buildPropertyAccessor { source = KtRealPsiSourceElement(setter) moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = initialOrigin this.returnTypeRef = FirImplicitUnitTypeRef(source) resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES isGetter = false @@ -235,9 +248,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC this.propertySymbol = propertySymbol }.apply { replaceAnnotations( - c.annotationDeserializer.loadAnnotations( - setter, AnnotationUseSiteTarget.PROPERTY_SETTER - ) + c.annotationDeserializer.loadAnnotations(setter) ) containingClassForStaticMemberAttr = c.dispatchReceiver?.lookupTag } @@ -258,7 +269,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC val getter = property.getter val receiverTypeReference = property.receiverTypeReference val receiverAnnotations = if (getter != null && receiverTypeReference != null) { - c.annotationDeserializer.loadAnnotations(receiverTypeReference, AnnotationUseSiteTarget.PROPERTY_GETTER) + c.annotationDeserializer.loadAnnotations(receiverTypeReference) } else { emptyList() } @@ -269,7 +280,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC return buildProperty { source = KtRealPsiSourceElement(property) moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = initialOrigin this.returnTypeRef = returnTypeRef receiverParameter = receiverTypeReference?.toTypeRef(local)?.let { receiverType -> buildReceiverParameter { @@ -295,8 +306,18 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } - annotations += - c.annotationDeserializer.loadAnnotations(property, AnnotationUseSiteTarget.PROPERTY) + val allAnnotations = c.annotationDeserializer.loadAnnotations(property) + annotations += allAnnotations.filter { it.useSiteTarget == null } + val backingFieldAnnotations = + allAnnotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.FIELD || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD } + backingField = FirDefaultPropertyBackingField( + c.moduleData, + backingFieldAnnotations.toMutableList(), + returnTypeRef, + isVar, + symbol, + status + ) if (getter != null) { this.getter = loadPropertyGetter( getter, @@ -356,7 +377,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC val simpleFunction = buildSimpleFunction { moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = initialOrigin source = KtRealPsiSourceElement(function) returnTypeRef = function.typeReference?.toTypeRef(local) ?: session.builtinTypes.unitType receiverParameter = function.receiverTypeReference?.toTypeRef(local)?.let { receiverType -> @@ -436,7 +457,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC }.apply { moduleData = c.moduleData source = KtRealPsiSourceElement(constructor) - origin = FirDeclarationOrigin.Library + origin = initialOrigin returnTypeRef = delegatedSelfType val visibility = constructor.visibility val isInner = classBuilder.status.isInner @@ -487,7 +508,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC source = KtRealPsiSourceElement(ktParameter) moduleData = c.moduleData this.containingFunctionSymbol = functionSymbol - origin = FirDeclarationOrigin.Library + origin = initialOrigin returnTypeRef = ktParameter.typeReference?.toTypeRef(c) ?: error("KtParameter $ktParameter doesn't have type, $functionSymbol") isVararg = ktParameter.isVarArg @@ -498,12 +519,9 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC symbol = FirValueParameterSymbol(name) resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - defaultValue = if (ktParameter.hasDefaultValue()) { + defaultValue = if (ktParameter.hasDefaultValue() || addDefaultValue) { buildExpressionStub() } else null - if (addDefaultValue) { - defaultValue = buildExpressionStub() - } isCrossinline = ktParameter.hasModifier(KtTokens.CROSSINLINE_KEYWORD) isNoinline = ktParameter.hasModifier(KtTokens.NOINLINE_KEYWORD) annotations += c.annotationDeserializer.loadAnnotations( @@ -527,7 +545,7 @@ class StubBasedFirMemberDeserializer(private val c: StubBasedFirDeserializationC val enumEntry = buildEnumEntry { source = KtRealPsiSourceElement(declaration) this.moduleData = c.moduleData - this.origin = FirDeclarationOrigin.Library + this.origin = initialOrigin returnTypeRef = buildResolvedTypeRef { type = enumType } name = Name.identifier(enumEntryName) this.symbol = FirEnumEntrySymbol(CallableId(classId, name)) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirTypeDeserializer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirTypeDeserializer.kt index f13ed51175e..260568c35a0 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirTypeDeserializer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirTypeDeserializer.kt @@ -29,7 +29,6 @@ import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasSuspendModifier import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability @@ -38,12 +37,13 @@ import org.jetbrains.kotlin.psi.stubs.impl.* import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.Variance -class StubBasedFirTypeDeserializer( +internal class StubBasedFirTypeDeserializer( private val moduleData: FirModuleData, private val annotationDeserializer: StubBasedAnnotationDeserializer, private val parent: StubBasedFirTypeDeserializer?, private val containingSymbol: FirBasedSymbol<*>?, - owner: KtTypeParameterListOwner + owner: KtTypeParameterListOwner, + initialOrigin: FirDeclarationOrigin ) { private val typeParametersByName: Map @@ -64,7 +64,7 @@ class StubBasedFirTypeDeserializer( source = KtRealPsiSourceElement(typeParameter) moduleData = this@StubBasedFirTypeDeserializer.moduleData resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - origin = FirDeclarationOrigin.Library + origin = initialOrigin this.name = name this.symbol = symbol this.containingDeclarationSymbol = containingSymbol ?: error("Top-level type parameter ???") @@ -109,7 +109,7 @@ class StubBasedFirTypeDeserializer( annotations += buildAnnotation { annotationTypeRef = buildResolvedTypeRef { type = StandardNames.FqNames.parameterNameClassId.toLookupTag() - .constructClassType(emptyArray(), isNullable = false) + .constructClassType(ConeTypeProjection.EMPTY_ARRAY, isNullable = false) } this.argumentMapping = buildAnnotationArgumentMapping { mapping[Name.identifier("name")] = @@ -295,12 +295,12 @@ internal fun KtUserType.classId(): ClassId { return ClassId( FqName.fromSegments(packageFragments).parent(), FqName(packageFragments.last()), - false + /* local = */ false ) } return ClassId( FqName.fromSegments(packageFragments), FqName.fromSegments(classFragments), - false + /* local = */ false ) } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt index 18106e0640c..f1ccfda7341 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt @@ -16,8 +16,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol -import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.name.StandardClassIds object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessExpressionChecker() { override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { @@ -29,7 +29,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessExpres val containingClassSymbol = expression.toResolvedCallableSymbol()?.getContainingClassSymbol(context.session) as? FirRegularClassSymbol ?: return - if (containingClassSymbol.source != null && containingClassSymbol.classKind == ClassKind.CLASS) { + if (containingClassSymbol.source != null && containingClassSymbol.classKind == ClassKind.CLASS && containingClassSymbol.classId != StandardClassIds.Any) { reporter.reportOn(expression.explicitReceiver?.source, FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE, context) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt index 56aa166243e..6a07e13eb26 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.fir.resolve.providers.impl -import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirModuleData @@ -16,14 +16,18 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction -import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl -import org.jetbrains.kotlin.fir.types.constructType +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.toEffectiveVisibility import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.fir.types.constructType +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds @NoMutableState class FirCloneableSymbolProvider( @@ -35,12 +39,14 @@ class FirCloneableSymbolProvider( resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES origin = FirDeclarationOrigin.Library this.moduleData = moduleData - status = FirDeclarationStatusImpl( + status = FirResolvedDeclarationStatusImpl( Visibilities.Public, - Modality.ABSTRACT + Modality.ABSTRACT, + EffectiveVisibility.Public ) classKind = ClassKind.INTERFACE - symbol = FirRegularClassSymbol(StandardClassIds.Cloneable) + val classSymbol = FirRegularClassSymbol(StandardClassIds.Cloneable) + symbol = classSymbol declarations += buildSimpleFunction { this.moduleData = moduleData resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES @@ -48,7 +54,10 @@ class FirCloneableSymbolProvider( returnTypeRef = buildResolvedTypeRef { type = session.builtinTypes.anyType.type } - status = FirDeclarationStatusImpl(Visibilities.Protected, Modality.OPEN) + status = FirResolvedDeclarationStatusImpl( + Visibilities.Protected, + Modality.OPEN, + Visibilities.Protected.toEffectiveVisibility(classSymbol)) name = StandardClassIds.Callables.clone.callableName symbol = FirNamedFunctionSymbol(StandardClassIds.Callables.clone) dispatchReceiverType = this@buildRegularClass.symbol.constructType(emptyArray(), isNullable = false)