Add test about dependsOn dependency and stdlib-common

This commit is contained in:
Jinseong Jeon
2024-02-08 13:47:06 -08:00
committed by Space Team
parent 6c062b0cea
commit 520ae725d1
3 changed files with 89 additions and 2 deletions
@@ -0,0 +1,11 @@
package test.pkg
actual class PointerEvent {
actual val keyboardModifiers = PointerKeyboardModifiers(42)
}
internal actual typealias NativePointerKeyboardModifiers = Int
fun test() {
val m = PointerEvent().keyboardModifiers.packedValue
}
@@ -0,0 +1,10 @@
package test.pkg
expect class PointerEvent {
val keyboardModifiers: PointerKeyboardModifiers
}
expect class NativePointerKeyboardModifiers
@kotlin.jvm.JvmInline
value class PointerKeyboardModifiers(val packedValue: NativePointerKeyboardModifiers)
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.session.buil
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.annotations.annotations
import org.jetbrains.kotlin.analysis.api.calls.KtSuccessCallInfo
import org.jetbrains.kotlin.analysis.api.calls.successfulFunctionCallOrNull
import org.jetbrains.kotlin.analysis.api.calls.symbol
@@ -15,6 +16,7 @@ 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.types.KtNonErrorClassType
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
@@ -26,8 +28,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.CommonPlatforms
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
@@ -72,6 +73,71 @@ class StandaloneSessionBuilderTest : TestWithDisposable() {
}
}
@Test
fun testJvmInlineOnCommon() {
// Example from https://youtrack.jetbrains.com/issue/KT-55085
val root = "jvmInlineOnCommon"
lateinit var sourceModule: KtSourceModule
val session = buildStandaloneAnalysisAPISession(disposable) {
registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider())
buildKtModuleProvider {
platform = CommonPlatforms.defaultCommonPlatform
val stdlib = addModule(
buildKtLibraryModule {
addBinaryRoot(Paths.get("dist/common/kotlin-stdlib-common.jar"))
platform = CommonPlatforms.defaultCommonPlatform
libraryName = "stdlib"
}
)
val commonModule = addModule(
buildKtSourceModule {
addSourceRoot(testDataPath(root).resolve("commonMain"))
addRegularDependency(stdlib)
platform = CommonPlatforms.defaultCommonPlatform
moduleName = "common"
}
)
sourceModule = addModule(
buildKtSourceModule {
addSourceRoot(testDataPath(root).resolve("androidMain"))
addDependsOnDependency(commonModule)
platform = JvmPlatforms.defaultJvmPlatform
moduleName = "android"
}
)
}
}
val ktFile = session.modulesWithFiles.getValue(sourceModule).single() as KtFile
// Test dependsOn dependency: expect in the common module, actual "typealias" in the platform-specific module
val testFunction = ktFile.findDescendantOfType<KtFunction>()!!
val localVariable = testFunction.findDescendantOfType<KtProperty>()!!
analyze(localVariable) {
val localVariableSymbol = localVariable.getVariableSymbol()
val type = localVariableSymbol.returnType as KtNonErrorClassType
Assertions.assertEquals(
ClassId(FqName("test.pkg"), FqName("NativePointerKeyboardModifiers"), isLocal = false),
type.classId
)
// expanded to `actual` `typealias`
val expandedType = type.fullyExpandedType
Assertions.assertTrue(expandedType.isInt)
}
// Test stdlib-common: @JvmInline in the common module
val actualClass = ktFile.findDescendantOfType<KtClassOrObject>()!!
val actualProperty = actualClass.findDescendantOfType<KtProperty>()!!
analyze(actualProperty) {
val symbol = actualProperty.getVariableSymbol()
val type = symbol.returnType as KtNonErrorClassType
Assertions.assertEquals(
ClassId.fromString("kotlin/jvm/JvmInline"),
type.classSymbol.annotations.single().classId
)
}
}
@Test
fun testResolveAgainstCommonKlib() {
val root = "resolveAgainstCommonKLib"