@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.lower.parents
1111import org.jetbrains.kotlin.backend.common.lower.parentsWithSelf
1212import org.jetbrains.kotlin.backend.jvm.ir.propertyIfAccessor
1313import org.jetbrains.kotlin.builtins.StandardNames
14+ import org.jetbrains.kotlin.codegen.JvmCodegenUtil
1415import org.jetbrains.kotlin.descriptors.*
1516import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
1617import org.jetbrains.kotlin.ir.declarations.*
@@ -23,8 +24,10 @@ import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
2324import org.jetbrains.kotlin.load.java.JvmAbi
2425import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
2526import org.jetbrains.kotlin.load.java.structure.*
27+ import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor
2628import org.jetbrains.kotlin.name.FqName
2729import org.jetbrains.kotlin.name.Name
30+ import org.jetbrains.kotlin.name.NameUtils
2831import org.jetbrains.kotlin.name.SpecialNames
2932import org.jetbrains.kotlin.types.Variance
3033import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -754,11 +757,25 @@ open class KotlinUsesExtractor(
754757
755758 data class FunctionNames (val nameInDB : String , val kotlinName : String )
756759
760+ @OptIn(ObsoleteDescriptorBasedAPI ::class )
761+ private fun getJvmModuleName (f : IrFunction ) =
762+ NameUtils .sanitizeAsJavaIdentifier(
763+ getJvmModuleNameForDeserializedDescriptor(f.descriptor) ? : JvmCodegenUtil .getModuleName(pluginContext.moduleDescriptor)
764+ )
765+
757766 fun getFunctionShortName (f : IrFunction ) : FunctionNames {
758767 if (f.origin == IrDeclarationOrigin .LOCAL_FUNCTION_FOR_LAMBDA || f.isAnonymousFunction)
759768 return FunctionNames (
760769 OperatorNameConventions .INVOKE .asString(),
761770 OperatorNameConventions .INVOKE .asString())
771+
772+ fun getSuffixIfInternal () =
773+ if (f.visibility == DescriptorVisibilities .INTERNAL ) {
774+ " \$ " + getJvmModuleName(f)
775+ } else {
776+ " "
777+ }
778+
762779 (f as ? IrSimpleFunction )?.correspondingPropertySymbol?.let {
763780 val propName = it.owner.name.asString()
764781 val getter = it.owner.getter
@@ -774,35 +791,26 @@ open class KotlinUsesExtractor(
774791 }
775792 }
776793
777- when (f) {
778- getter -> {
779- val defaultFunctionName = JvmAbi .getterName(propName)
780- val defaultDbName = if (getter.visibility == DescriptorVisibilities .PRIVATE && getter.origin == IrDeclarationOrigin .DEFAULT_PROPERTY_ACCESSOR ) {
781- // In JVM these functions don't exist, instead the backing field is accessed directly
782- defaultFunctionName + " \$ private"
783- } else {
784- defaultFunctionName
785- }
786- return FunctionNames (getJvmName(getter) ? : defaultDbName, defaultFunctionName)
787- }
788- setter -> {
789- val defaultFunctionName = JvmAbi .setterName(propName)
790- val defaultDbName = if (setter.visibility == DescriptorVisibilities .PRIVATE && setter.origin == IrDeclarationOrigin .DEFAULT_PROPERTY_ACCESSOR ) {
791- // In JVM these functions don't exist, instead the backing field is accessed directly
792- defaultFunctionName + " \$ private"
793- } else {
794- defaultFunctionName
795- }
796- return FunctionNames (getJvmName(setter) ? : defaultDbName, defaultFunctionName)
797- }
794+ val maybeFunctionName = when (f) {
795+ getter -> JvmAbi .getterName(propName)
796+ setter -> JvmAbi .setterName(propName)
798797 else -> {
799798 logger.error(
800799 " Function has a corresponding property, but is neither the getter nor the setter"
801800 )
801+ null
802+ }
803+ }
804+ maybeFunctionName?.let { defaultFunctionName ->
805+ val suffix = if (f.visibility == DescriptorVisibilities .PRIVATE && f.origin == IrDeclarationOrigin .DEFAULT_PROPERTY_ACCESSOR ) {
806+ " \$ private"
807+ } else {
808+ getSuffixIfInternal()
802809 }
810+ return FunctionNames (getJvmName(f) ? : " $defaultFunctionName$suffix " , defaultFunctionName)
803811 }
804812 }
805- return FunctionNames (getJvmName(f) ? : f.name.asString(), f.name.asString())
813+ return FunctionNames (getJvmName(f) ? : " ${ f.name.asString()}${getSuffixIfInternal()} " , f.name.asString())
806814 }
807815
808816 // This excludes class type parameters that show up in (at least) constructors' typeParameters list.
0 commit comments