@@ -57,7 +57,7 @@ import com.intellij.psi.impl.source.PsiClassReferenceType
57
57
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
58
58
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
59
59
import org.jetbrains.kotlin.codegen.ClassBuilderMode
60
- import org.jetbrains.kotlin.codegen.OwnerKind
60
+ import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
61
61
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
62
62
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
63
63
import org.jetbrains.kotlin.container.ComponentProvider
@@ -66,9 +66,11 @@ import org.jetbrains.kotlin.container.tryGetService
66
66
import org.jetbrains.kotlin.descriptors.*
67
67
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
68
68
import org.jetbrains.kotlin.descriptors.annotations.Annotations
69
+ import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
69
70
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
70
71
import org.jetbrains.kotlin.load.java.components.TypeUsage
71
72
import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor
73
+ import org.jetbrains.kotlin.load.java.descriptors.getImplClassNameForDeserialized
72
74
import org.jetbrains.kotlin.load.java.lazy.*
73
75
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaTypeParameterDescriptor
74
76
import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeResolver
@@ -106,13 +108,15 @@ import org.jetbrains.kotlin.resolve.multiplatform.findExpects
106
108
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
107
109
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
108
110
import org.jetbrains.kotlin.resolve.scopes.MemberScope
111
+ import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
109
112
import org.jetbrains.kotlin.types.*
110
113
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext
111
114
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
112
115
import org.jetbrains.kotlin.types.typeUtil.substitute
113
116
import org.jetbrains.kotlin.types.typeUtil.supertypes
114
117
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
115
118
import org.jetbrains.org.objectweb.asm.Opcodes
119
+ import org.jetbrains.org.objectweb.asm.Type
116
120
import java.io.File
117
121
import java.util.*
118
122
@@ -356,20 +360,28 @@ class ResolverImpl(
356
360
override fun mapToJvmSignature (declaration : KSDeclaration ): String? = mapToJvmSignatureInternal(declaration)
357
361
358
362
internal fun mapToJvmSignatureInternal (declaration : KSDeclaration ): String? = when (declaration) {
359
- is KSClassDeclaration -> resolveClassDeclaration(declaration)?.let { typeMapper.mapType(it).descriptor }
363
+ is KSClassDeclaration -> resolveClassDeclaration(declaration)?.let {
364
+ typeMapper.mapType(it.defaultType).descriptor
365
+ }
360
366
is KSFunctionDeclaration -> resolveFunctionDeclaration(declaration)?.let {
361
367
when (it) {
362
368
is FunctionDescriptor -> typeMapper.mapAsmMethod(it).descriptor
363
- is PropertyDescriptor -> typeMapper.mapFieldSignature (it.type, it) ? : typeMapper.mapType(it).descriptor
369
+ is PropertyDescriptor -> typeMapper.mapPropertySignature (it)
364
370
else -> throw IllegalStateException (" Unexpected descriptor type for declaration: $declaration " )
365
371
}
366
372
}
367
373
is KSPropertyDeclaration -> resolvePropertyDeclaration(declaration)?.let {
368
- typeMapper.mapFieldSignature (it.type, it) ? : typeMapper.mapType(it).descriptor
374
+ typeMapper.mapPropertySignature (it)
369
375
}
370
376
else -> null
371
377
}
372
378
379
+ private fun KotlinTypeMapper.mapPropertySignature (descriptor : PropertyDescriptor ): String? {
380
+ val sw = BothSignatureWriter (BothSignatureWriter .Mode .TYPE )
381
+ writeFieldSignature(descriptor.type, descriptor, sw)
382
+ return sw.makeJavaGenericSignature() ? : mapType(descriptor.type).descriptor
383
+ }
384
+
373
385
override fun overrides (overrider : KSDeclaration , overridee : KSDeclaration ): Boolean {
374
386
fun resolveForOverride (declaration : KSDeclaration ): DeclarationDescriptor ? {
375
387
return when (declaration) {
@@ -880,22 +892,13 @@ class ResolverImpl(
880
892
881
893
@KspExperimental
882
894
override fun getJvmName (accessor : KSPropertyAccessor ): String? {
883
- val descriptor = resolvePropertyAccessorDeclaration(accessor)
884
-
885
- return descriptor?.let {
886
- // KotlinTypeMapper.mapSignature always uses OwnerKind.IMPLEMENTATION
887
- typeMapper.mapFunctionName(descriptor, OwnerKind .IMPLEMENTATION )
888
- }
895
+ return resolvePropertyAccessorDeclaration(accessor)?.let (typeMapper::mapFunctionName)
889
896
}
890
897
891
898
@KspExperimental
892
899
override fun getJvmName (declaration : KSFunctionDeclaration ): String? {
893
900
// function names might be mangled if they receive inline class parameters or they are internal
894
- val descriptor = resolveFunctionDeclaration(declaration)
895
- return (descriptor as ? FunctionDescriptor )?.let {
896
- // KotlinTypeMapper.mapSignature always uses OwnerKind.IMPLEMENTATION
897
- typeMapper.mapFunctionName(it, OwnerKind .IMPLEMENTATION )
898
- }
901
+ return (resolveFunctionDeclaration(declaration) as ? FunctionDescriptor )?.let (typeMapper::mapFunctionName)
899
902
}
900
903
901
904
@KspExperimental
@@ -911,11 +914,35 @@ class ResolverImpl(
911
914
}
912
915
913
916
private fun getJvmOwnerQualifiedName (descriptor : DeclarationDescriptor ): String? {
914
- return try {
915
- typeMapper.mapImplementationOwner(descriptor).className
916
- } catch (unsupported: UnsupportedOperationException ) {
917
- null
917
+ return typeMapper.mapJvmImplementationOwner(descriptor)?.className
918
+ }
919
+
920
+ private fun KotlinTypeMapper.mapJvmImplementationOwner (descriptor : DeclarationDescriptor ): Type ? {
921
+ if (descriptor is ConstructorDescriptor ) {
922
+ return mapClass(descriptor.constructedClass)
918
923
}
924
+
925
+ return when (val container = descriptor.containingDeclaration) {
926
+ is PackageFragmentDescriptor ->
927
+ internalNameForPackageMemberOwner(descriptor as CallableMemberDescriptor )?.let (Type ::getObjectType)
928
+ is ClassDescriptor ->
929
+ mapClass(container)
930
+ else -> null
931
+ }
932
+ }
933
+
934
+ private fun internalNameForPackageMemberOwner (descriptor : CallableMemberDescriptor ): String? {
935
+ val file = DescriptorToSourceUtils .getContainingFile(descriptor)
936
+ if (file != null ) {
937
+ return JvmFileClassUtil .getFileClassInternalName(file)
938
+ }
939
+
940
+ val directMember = DescriptorUtils .getDirectMember(descriptor)
941
+ if (directMember is DescriptorWithContainerSource ) {
942
+ return directMember.getImplClassNameForDeserialized()?.internalName
943
+ }
944
+
945
+ return null
919
946
}
920
947
921
948
// TODO: refactor and reuse BinaryClassInfoCache
0 commit comments