[Analysis API Standalone] fix builtin resolution for common module
StubBasedBuiltInsSymbolProvider does not work for now for common modules (KT-61757) but compiler builtins provider `FirBuiltinSymbolProvider` works. Also, stub-based symbol providers should not be used in standalone mode. Testdata from standalone is updated because of the difference in property accessors (KT-62449) between stub and compiler builtin symbol providers. Additionally, this commit fixes the behavior of `KotlinStaticPsiDeclarationFromBinaryModuleProvider`. As compiler builtin declarations have no PSI attached, `KotlinStaticPsiDeclarationFromBinaryModuleProvider` is used to get PSI from `DecompiledPsiDeclarationProvider.findPsi`. `DecompiledPsiDeclarationProvider` is only used in UAST standalone mode.
This commit is contained in:
committed by
Space Team
parent
5b4731a780
commit
7db2fc522e
+11
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
|
||||
import org.jetbrains.kotlin.fir.java.FirJavaFacade
|
||||
import org.jetbrains.kotlin.fir.java.deserialization.JvmClassFileBasedSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.session.KlibBasedSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.session.MetadataSymbolProvider
|
||||
@@ -105,6 +106,16 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
|
||||
)
|
||||
}
|
||||
|
||||
override fun createBuiltinsSymbolProvider(
|
||||
session: FirSession,
|
||||
moduleData: LLFirModuleData,
|
||||
kotlinScopeProvider: FirKotlinScopeProvider
|
||||
): List<FirSymbolProvider> {
|
||||
return listOf(
|
||||
FirBuiltinSymbolProvider(session, moduleData, kotlinScopeProvider)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
private fun LLFirModuleData.getLibraryKLibs(): List<KotlinLibrary> {
|
||||
val ktLibraryModule = ktModule as? KtLibraryModule ?: return emptyList()
|
||||
|
||||
Vendored
+1
-1
@@ -1,3 +1,3 @@
|
||||
fun foo() {
|
||||
fun foo(): Unit {
|
||||
val list = listOf(1)
|
||||
}
|
||||
+4
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.components.p
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.providers.DecompiledPsiDeclarationProvider.findPsi
|
||||
@@ -55,6 +56,9 @@ public abstract class AbstractPsiDeclarationProviderTest : AbstractAnalysisApiBa
|
||||
KtSymbolOrigin.LIBRARY -> {
|
||||
findPsi(symbol, project) ?: symbol.psi
|
||||
}
|
||||
KtSymbolOrigin.SUBSTITUTION_OVERRIDE, KtSymbolOrigin.INTERSECTION_OVERRIDE -> {
|
||||
psiForTest((symbol as KtCallableSymbol).unwrapFakeOverrides, project)
|
||||
}
|
||||
else -> symbol.psi
|
||||
}
|
||||
}
|
||||
|
||||
+16
@@ -25,12 +25,15 @@ import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.platform.CommonPlatforms
|
||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||
import org.jetbrains.kotlin.platform.js.JsPlatforms
|
||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
|
||||
import org.jetbrains.kotlin.utils.PathUtil
|
||||
import org.junit.jupiter.api.Assertions
|
||||
@@ -163,8 +166,14 @@ class StandaloneSessionBuilderTest {
|
||||
}
|
||||
}
|
||||
val ktFile = session.modulesWithFiles.getValue(sourceModule).single() as KtFile
|
||||
|
||||
// call
|
||||
val ktCallExpression = ktFile.findDescendantOfType<KtCallExpression>()!!
|
||||
ktCallExpression.assertIsCallOf(CallableId(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME, Name.identifier("listOf")))
|
||||
|
||||
// builtin type
|
||||
val typeReference = ktFile.findDescendantOfType<KtNamedFunction>()!!.typeReference!!
|
||||
typeReference.assertIsReferenceTo(StandardClassIds.Unit)
|
||||
}
|
||||
|
||||
|
||||
@@ -177,4 +186,11 @@ class StandaloneSessionBuilderTest {
|
||||
Assertions.assertEquals(callableId, symbol.callableIdIfNonLocal)
|
||||
}
|
||||
}
|
||||
|
||||
private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) {
|
||||
analyze(this) {
|
||||
val actualClassId = getKtType().expandedClassSymbol?.classIdIfNonLocal
|
||||
Assertions.assertEquals(classId, actualClassId)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user