From b9db1a41af0a5efa5a9f4b7f40bc9463e3ada932 Mon Sep 17 00:00:00 2001 From: Jiaxiang Chen Date: Sun, 16 Jun 2024 21:23:04 -0700 Subject: [PATCH] special handling of inline value class signature --- .../devtools/ksp/impl/ResolverAAImpl.kt | 22 +++++++++++-------- .../testData/signatureMapper.kt | 6 +++++ test-utils/testData/api/signatureMapper.kt | 6 +++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt index 05ae0c21cb..d741c3feb8 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt @@ -51,14 +51,7 @@ import com.intellij.psi.PsiMethod import com.intellij.psi.impl.file.impl.JavaFileManager import org.jetbrains.kotlin.analysis.api.components.buildSubstitutor import org.jetbrains.kotlin.analysis.api.fir.types.KaFirType -import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession @@ -757,7 +750,18 @@ class ResolverAAImpl( fun KSType.toSignature(): String { return if (this is KSTypeImpl) { analyze { - this@toSignature.type.toSignature() + val decl = (this@toSignature.declaration as? KSClassDeclaration) + // special handling for single parameter inline value class + // unwrap the underlying for jvm signature. + if ( + decl != null && + (decl.modifiers.contains(Modifier.INLINE) || decl.modifiers.contains(Modifier.VALUE)) && + decl.primaryConstructor?.parameters?.size == 1 + ) { + decl.primaryConstructor!!.parameters.single().type.resolve().toSignature() + } else { + this@toSignature.type.toSignature() + } } } else { "" diff --git a/kotlin-analysis-api/testData/signatureMapper.kt b/kotlin-analysis-api/testData/signatureMapper.kt index 5b69ff8e24..386d146666 100644 --- a/kotlin-analysis-api/testData/signatureMapper.kt +++ b/kotlin-analysis-api/testData/signatureMapper.kt @@ -20,6 +20,7 @@ // LCls; // a: I // foo: ()Ljava/lang/String; +// f: ()I // : ()V // LJavaIntefaceWithVoid; // getVoid: ()Ljava/lang/Void; @@ -38,10 +39,15 @@ // END // FILE: Cls.kt +@JvmInline +value class MyInlineClass(val value: Int) + class Cls { val a: Int = 1 fun foo(): String { return "1" } + + fun f(): MyInlineClass = 1 } // FILE: JavaIntefaceWithVoid.java diff --git a/test-utils/testData/api/signatureMapper.kt b/test-utils/testData/api/signatureMapper.kt index 9135fec79a..0168a62a07 100644 --- a/test-utils/testData/api/signatureMapper.kt +++ b/test-utils/testData/api/signatureMapper.kt @@ -20,6 +20,7 @@ // LCls; // a: I // foo: ()Ljava/lang/String; +// f: ()I // : ()V // LJavaIntefaceWithVoid; // getVoid: ()Ljava/lang/Void; @@ -38,10 +39,15 @@ // END // FILE: Cls.kt +@JvmInline +value class MyInlineClass(val value: Int) + class Cls { val a: Int = 1 fun foo(): String { return "1" } + + fun f(): MyInlineClass = 1 } // FILE: JavaIntefaceWithVoid.java