From b96e5b072a18efb8ad958034fe23dd3bd01a7205 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 5 Jun 2023 12:46:11 +0000 Subject: [PATCH] [LL] ensure that stub based symbol provider works on class files This makes `.originalElements` calls redundant, no need to filter duplicates. Additionally, it ensures that ktDeclaration's are from cls, so all types are fully qualified and stubs contain all additional information, required to build resolved fir e.g., fully qualified names are split as classIds, flexible types, etc Merge-request: KT-MR-10449 Merged-by: Anna Kozlova --- ...bBasedDeserializedSymbolProviderFactory.kt | 4 ++-- ...mStubBasedFirDeserializedSymbolProvider.kt | 24 +++++++------------ 2 files changed, 11 insertions(+), 17 deletions(-) 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 ddfbc3f5a80..1e37eb9287f 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization +import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.DelegatingGlobalSearchScope @@ -20,7 +21,6 @@ import org.jetbrains.kotlin.fir.java.FirJavaFacade import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider -import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol @LLFirInternals class JvmStubBasedDeserializedSymbolProviderFactory : JvmFirDeserializedSymbolProviderFactory() { @@ -47,7 +47,7 @@ class JvmStubBasedDeserializedSymbolProviderFactory : JvmFirDeserializedSymbolPr project, object : DelegatingGlobalSearchScope(project, scope) { override fun contains(file: VirtualFile): Boolean { - if (file.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) { + if (file.extension != JavaClassFileType.INSTANCE.defaultExtension) { return false } return super.contains(file) 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 8e0fc40a31b..0d037bb0043 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 @@ -81,7 +81,7 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider( context: StubBasedFirDeserializationContext?, ): Pair { val classLikeDeclaration = - (context?.classLikeDeclaration ?: declarationProvider.getClassLikeDeclarationByClassId(classId))?.originalElement + (context?.classLikeDeclaration ?: declarationProvider.getClassLikeDeclarationByClassId(classId)) if (classLikeDeclaration is KtTypeAlias) { val symbol = FirTypeAliasSymbol(classId) val postProcessor: DeserializedTypeAliasPostProcessor = { @@ -106,9 +106,9 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider( ): FirRegularClassSymbol? { val (classLikeDeclaration, context) = if (parentContext?.classLikeDeclaration != null) { - parentContext.classLikeDeclaration.originalElement to null + parentContext.classLikeDeclaration to null } else { - (declarationProvider.getClassLikeDeclarationByClassId(classId)?.originalElement ?: return null) to parentContext + (declarationProvider.getClassLikeDeclarationByClassId(classId) ?: return null) to parentContext } val symbol = FirRegularClassSymbol(classId) @@ -140,12 +140,9 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider( foundFunctions: Collection?, ): List { val topLevelFunctions = foundFunctions ?: declarationProvider.getTopLevelFunctions(callableId) - val origins = if (topLevelFunctions.size > 1) mutableSetOf() else null return topLevelFunctions .mapNotNull { function -> - val original = function.originalElement as? KtNamedFunction ?: return@mapNotNull null - if (origins != null && !origins.add(original)) return@mapNotNull null - val file = original.containingKtFile + val file = function.containingKtFile val virtualFile = file.virtualFile if (virtualFile.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION) return@mapNotNull null if (initialOrigin != FirDeclarationOrigin.BuiltIns && file.packageFqName.asString() @@ -153,22 +150,19 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider( ) return@mapNotNull null val symbol = FirNamedFunctionSymbol(callableId) val rootContext = - StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol, initialOrigin) - rootContext.memberDeserializer.loadFunction(original, null, session, symbol).symbol + StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, function, symbol, initialOrigin) + rootContext.memberDeserializer.loadFunction(function, null, session, symbol).symbol } } private fun loadPropertiesByCallableId(callableId: CallableId, foundProperties: Collection?): List { val topLevelProperties = foundProperties ?: declarationProvider.getTopLevelProperties(callableId) - val origins = if (topLevelProperties.size > 1) mutableSetOf() else null return topLevelProperties - .mapNotNull { property -> - val original = property.originalElement as? KtProperty ?: return@mapNotNull null - if (origins != null && !origins.add(original)) return@mapNotNull null + .map { property -> val symbol = FirPropertySymbol(callableId) val rootContext = - StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, original, symbol, initialOrigin) - rootContext.memberDeserializer.loadProperty(original, null, symbol).symbol + StubBasedFirDeserializationContext.createRootContext(session, moduleData, callableId, property, symbol, initialOrigin) + rootContext.memberDeserializer.loadProperty(property, null, symbol).symbol } }