JVM IR: sanitize indy lambda proxy names correctly
In case there are several proxy functions for indy lambdas in the same container, its names are "...__proxy", "...__proxy-0", "...__proxy-1", ..., yet before this change, only the first one was sanitized. So if it's happening inside a constructor, `<init>` was left unrenamed which led to ClassFormatError. #KT-52040 Fixed
This commit is contained in:
+5
-13
@@ -33,15 +33,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
interface LocalNameProvider {
|
||||
fun localName(declaration: IrDeclarationWithName): String =
|
||||
declaration.name.asString()
|
||||
|
||||
companion object {
|
||||
val DEFAULT = object : LocalNameProvider {}
|
||||
}
|
||||
}
|
||||
|
||||
interface VisibilityPolicy {
|
||||
fun forClass(declaration: IrClass, inInlineFunctionScope: Boolean): DescriptorVisibility =
|
||||
declaration.visibility
|
||||
@@ -77,7 +68,7 @@ object BOUND_RECEIVER_PARAMETER : IrDeclarationOriginImpl("BOUND_RECEIVER_PARAME
|
||||
*/
|
||||
class LocalDeclarationsLowering(
|
||||
val context: CommonBackendContext,
|
||||
val localNameProvider: LocalNameProvider = LocalNameProvider.DEFAULT,
|
||||
val localNameSanitizer: (String) -> String = { it },
|
||||
val visibilityPolicy: VisibilityPolicy = VisibilityPolicy.DEFAULT,
|
||||
val suggestUniqueNames: Boolean = true, // When `true` appends a `-#index` suffix to lifted declaration names
|
||||
val forceFieldsForInlineCaptures: Boolean = false // See `LocalClassContext`
|
||||
@@ -594,13 +585,14 @@ class LocalDeclarationsLowering(
|
||||
}
|
||||
|
||||
private fun suggestLocalName(declaration: IrDeclarationWithName): String {
|
||||
val declarationName = localNameSanitizer(declaration.name.asString())
|
||||
localFunctions[declaration]?.let {
|
||||
val baseName = if (declaration.name.isSpecial) "lambda" else declaration.name
|
||||
val baseName = if (declaration.name.isSpecial) "lambda" else declarationName
|
||||
if (it.index >= 0)
|
||||
return if (suggestUniqueNames) "$baseName-${it.index}" else "$baseName"
|
||||
return if (suggestUniqueNames) "$baseName-${it.index}" else baseName
|
||||
}
|
||||
|
||||
return localNameProvider.localName(declaration)
|
||||
return declarationName
|
||||
}
|
||||
|
||||
private fun generateNameForLiftedDeclaration(
|
||||
|
||||
@@ -116,10 +116,7 @@ internal val localDeclarationsPhase = makeIrFilePhase(
|
||||
{ context ->
|
||||
LocalDeclarationsLowering(
|
||||
context,
|
||||
object : LocalNameProvider {
|
||||
override fun localName(declaration: IrDeclarationWithName): String =
|
||||
NameUtils.sanitizeAsJavaIdentifier(super.localName(declaration))
|
||||
},
|
||||
NameUtils::sanitizeAsJavaIdentifier,
|
||||
object : VisibilityPolicy {
|
||||
// Note: any condition that results in non-`LOCAL` visibility here should be duplicated in `JvmLocalClassPopupLowering`,
|
||||
// else it won't detect the class as local.
|
||||
|
||||
Reference in New Issue
Block a user