From 520ae725d14c2e1a6557142e0874c09881824962 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 8 Feb 2024 13:47:06 -0800 Subject: [PATCH] Add test about dependsOn dependency and stdlib-common --- .../androidMain/PointerEvent.android.kt | 11 +++ .../commonMain/PointerEvent.kt | 10 +++ .../builder/StandaloneSessionBuilderTest.kt | 70 ++++++++++++++++++- 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/androidMain/PointerEvent.android.kt create mode 100644 analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/commonMain/PointerEvent.kt diff --git a/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/androidMain/PointerEvent.android.kt b/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/androidMain/PointerEvent.android.kt new file mode 100644 index 00000000000..dd31f4f9969 --- /dev/null +++ b/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/androidMain/PointerEvent.android.kt @@ -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 +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/commonMain/PointerEvent.kt b/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/commonMain/PointerEvent.kt new file mode 100644 index 00000000000..4967f4f9e05 --- /dev/null +++ b/analysis/analysis-api-standalone/testData/sessionBuilder/jvmInlineOnCommon/commonMain/PointerEvent.kt @@ -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) \ 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 028aceddaf1..b6803b30751 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 @@ -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()!! + val localVariable = testFunction.findDescendantOfType()!! + 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()!! + val actualProperty = actualClass.findDescendantOfType()!! + 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"