[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:
Ilya Kirillov
2023-10-06 21:47:15 +02:00
committed by Space Team
parent 5b4731a780
commit 7db2fc522e
24 changed files with 8197 additions and 44 deletions
@@ -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()
@@ -1,3 +1,3 @@
fun foo() {
fun foo(): Unit {
val list = listOf(1)
}
@@ -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
}
}
@@ -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)
}
}
}