[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 <Anna.Kozlova@jetbrains.com>
This commit is contained in:
+2
-2
@@ -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)
|
||||
|
||||
+9
-15
@@ -81,7 +81,7 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider(
|
||||
context: StubBasedFirDeserializationContext?,
|
||||
): Pair<FirTypeAliasSymbol?, DeserializedTypeAliasPostProcessor?> {
|
||||
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<KtNamedFunction>?,
|
||||
): List<FirNamedFunctionSymbol> {
|
||||
val topLevelFunctions = foundFunctions ?: declarationProvider.getTopLevelFunctions(callableId)
|
||||
val origins = if (topLevelFunctions.size > 1) mutableSetOf<KtNamedFunction>() 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<KtProperty>?): List<FirPropertySymbol> {
|
||||
val topLevelProperties = foundProperties ?: declarationProvider.getTopLevelProperties(callableId)
|
||||
val origins = if (topLevelProperties.size > 1) mutableSetOf<KtProperty>() 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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user