diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt new file mode 100644 index 00000000000..2d0a8b99efc --- /dev/null +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.session.builder + +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals +import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider +import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider +import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession +import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule +import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtLibraryModule +import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtSourceModule +import org.jetbrains.kotlin.builtins.StandardNames +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.platform.TargetPlatform +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.junit.jupiter.api.Assertions +import java.nio.file.Path + +@OptIn(KtAnalysisApiInternals::class) +abstract class AbstractStandaloneSessionBuilderAgainstStdlibTest { + protected fun doTestKotlinStdLibResolve( + targetPlatform: TargetPlatform, platformStdlibPath: Path, + additionalStdlibRoots: List = emptyList(), + ) { + lateinit var sourceModule: KtSourceModule + val session = buildStandaloneAnalysisAPISession { + registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider()) + + buildKtModuleProvider { + platform = targetPlatform + val stdlib = addModule( + buildKtLibraryModule { + addBinaryRoot(platformStdlibPath) + addBinaryRoots(additionalStdlibRoots) + platform = targetPlatform + libraryName = "stdlib" + } + ) + sourceModule = addModule( + buildKtSourceModule { + addSourceRoot(testDataPath("stdlibFunctionUsage")) + addRegularDependency(stdlib) + platform = targetPlatform + moduleName = "source" + } + ) + } + } + val ktFile = session.modulesWithFiles.getValue(sourceModule).single() as KtFile + + // call + val ktCallExpression = ktFile.findDescendantOfType()!! + ktCallExpression.assertIsCallOf(CallableId(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME, Name.identifier("listOf"))) + + // builtin type + val typeReference = ktFile.findDescendantOfType()!!.typeReference!! + typeReference.assertIsReferenceTo(StandardClassIds.Unit) + } + + private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) { + analyze(this) { + val actualClassId = getKtType().expandedClassSymbol?.classIdIfNonLocal + Assertions.assertEquals(classId, actualClassId) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderAgainstStdlibTest.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderAgainstStdlibTest.kt new file mode 100644 index 00000000000..38570cde8df --- /dev/null +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderAgainstStdlibTest.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.session.builder + +import org.jetbrains.kotlin.platform.CommonPlatforms +import org.jetbrains.kotlin.platform.js.JsPlatforms +import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.utils.PathUtil +import org.junit.Test +import java.nio.file.Paths + +class StandaloneSessionBuilderAgainstStdlibTest : AbstractStandaloneSessionBuilderAgainstStdlibTest() { + @Test + fun testKotlinStdlibJvm() { + doTestKotlinStdLibResolve(JvmPlatforms.defaultJvmPlatform, PathUtil.kotlinPathsForDistDirectory.stdlibPath.toPath()) + } + + @Test + fun testKotlinStdLibCommon() { + doTestKotlinStdLibResolve(CommonPlatforms.defaultCommonPlatform, Paths.get("dist/common/kotlin-stdlib-common.jar")) + } + + @Test + fun testKotlinStdLibJs() { + doTestKotlinStdLibResolve(JsPlatforms.defaultJsPlatform, PathUtil.kotlinPathsForDistDirectory.jsStdLibKlibPath.toPath()) + } + + @Test + fun testKotlinStdLibJsWithInvalidKlib() { + doTestKotlinStdLibResolve( + JsPlatforms.defaultJsPlatform, + PathUtil.kotlinPathsForDistDirectory.jsStdLibKlibPath.toPath(), + additionalStdlibRoots = listOf( + Paths.get(System.getProperty("java.home")), // directory which exists and does not contain KLibs inside + PathUtil.kotlinPathsForDistDirectory.stdlibPath.toPath(), // file which exists and not a KLib + ) + ) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt index 4a762b6d8c9..7a31da3cbc2 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt @@ -15,30 +15,23 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtLibraryModule import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtSdkModule import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtSourceModule -import org.jetbrains.kotlin.builtins.StandardNames 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 import org.junit.jupiter.api.Test -import java.nio.file.Path import java.nio.file.Paths @OptIn(KtAnalysisApiInternals::class) @@ -112,33 +105,6 @@ class StandaloneSessionBuilderTest { ktCallExpression.assertIsCallOf(CallableId(FqName("commonKLib"), Name.identifier("commonKLibFunction"))) } - @Test - fun testKotlinStdlibJvm() { - doTestKotlinStdLibResolve(JvmPlatforms.defaultJvmPlatform, PathUtil.kotlinPathsForDistDirectory.stdlibPath.toPath()) - } - - @Test - fun testKotlinStdLibCommon() { - doTestKotlinStdLibResolve(CommonPlatforms.defaultCommonPlatform, Paths.get("dist/common/kotlin-stdlib-common.jar")) - } - - @Test - fun testKotlinStdLibJs() { - doTestKotlinStdLibResolve(JsPlatforms.defaultJsPlatform, PathUtil.kotlinPathsForDistDirectory.jsStdLibKlibPath.toPath()) - } - - @Test - fun testKotlinStdLibJsWithInvalidKlib() { - doTestKotlinStdLibResolve( - JsPlatforms.defaultJsPlatform, - PathUtil.kotlinPathsForDistDirectory.jsStdLibKlibPath.toPath(), - additionalStdlibRoots = listOf( - Paths.get(System.getProperty("java.home")), // directory which exists and does not contain KLibs inside - PathUtil.kotlinPathsForDistDirectory.stdlibPath.toPath(), // file which exists and not a KLib - ) - ) - } - @Test fun testKotlinSourceModuleSessionBuilder() { lateinit var sourceModule: KtSourceModule @@ -168,51 +134,4 @@ class StandaloneSessionBuilderTest { val ktCallExpression = ktFile.findDescendantOfType()!! ktCallExpression.assertIsCallOf(CallableId(FqName.ROOT, Name.identifier("foo"))) } - - private fun doTestKotlinStdLibResolve( - targetPlatform: TargetPlatform, platformStdlibPath: Path, - additionalStdlibRoots: List = emptyList(), - ) { - lateinit var sourceModule: KtSourceModule - val session = buildStandaloneAnalysisAPISession { - registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider()) - - buildKtModuleProvider { - platform = targetPlatform - val stdlib = addModule( - buildKtLibraryModule { - addBinaryRoot(platformStdlibPath) - addBinaryRoots(additionalStdlibRoots) - platform = targetPlatform - libraryName = "stdlib" - } - ) - sourceModule = addModule( - buildKtSourceModule { - addSourceRoot(testDataPath("stdlibFunctionUsage")) - addRegularDependency(stdlib) - platform = targetPlatform - moduleName = "source" - } - ) - } - } - val ktFile = session.modulesWithFiles.getValue(sourceModule).single() as KtFile - - // call - val ktCallExpression = ktFile.findDescendantOfType()!! - ktCallExpression.assertIsCallOf(CallableId(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME, Name.identifier("listOf"))) - - // builtin type - val typeReference = ktFile.findDescendantOfType()!!.typeReference!! - typeReference.assertIsReferenceTo(StandardClassIds.Unit) - } - - - private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) { - analyze(this) { - val actualClassId = getKtType().expandedClassSymbol?.classIdIfNonLocal - Assertions.assertEquals(classId, actualClassId) - } - } } \ No newline at end of file