Change mangling for destructured lambda parameters
This commit is contained in:
@@ -45,7 +45,6 @@ import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker;
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver;
|
||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
|
||||
import org.jetbrains.kotlin.resolve.jvm.*;
|
||||
import org.jetbrains.kotlin.resolve.jvm.checkers.DalvikIdentifierUtils;
|
||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer;
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor;
|
||||
@@ -205,26 +204,7 @@ public class AsmUtil {
|
||||
return defaultName;
|
||||
}
|
||||
|
||||
if (!DalvikIdentifierUtils.isValidDalvikIdentifier(callableName)) {
|
||||
return prefix + mangleLabel(callableName);
|
||||
}
|
||||
|
||||
return prefix + callableName;
|
||||
}
|
||||
|
||||
private static String mangleLabel(String label) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
for (char c : label.toCharArray()) {
|
||||
if (DalvikIdentifierUtils.isValidDalvikCharacter(c)) {
|
||||
sb.append(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
sb.append("_u").append(Integer.toHexString(c));
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
return prefix + VariableAsmNameManglingUtils.mangleNameIfNeeded(callableName);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -843,7 +843,7 @@ public class FunctionCodegen {
|
||||
|
||||
if (kind == JvmMethodParameterKind.VALUE) {
|
||||
ValueParameterDescriptor parameter = valueParameterIterator.next();
|
||||
String nameForDestructuredParameter = ValueParameterDescriptorImpl.getNameForDestructuredParameterOrNull(parameter);
|
||||
String nameForDestructuredParameter = VariableAsmNameManglingUtils.getNameForDestructuredParameterOrNull(parameter);
|
||||
|
||||
parameterName =
|
||||
nameForDestructuredParameter == null
|
||||
@@ -902,7 +902,7 @@ public class FunctionCodegen {
|
||||
List<ValueParameterDescriptor> destructuredParametersForSuspendLambda
|
||||
) {
|
||||
for (ValueParameterDescriptor parameter : destructuredParametersForSuspendLambda) {
|
||||
String nameForDestructuredParameter = ValueParameterDescriptorImpl.getNameForDestructuredParameterOrNull(parameter);
|
||||
String nameForDestructuredParameter = VariableAsmNameManglingUtils.getNameForDestructuredParameterOrNull(parameter);
|
||||
if (nameForDestructuredParameter == null) continue;
|
||||
|
||||
Type type = typeMapper.mapType(parameter.getType());
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:JvmName("VariableAsmNameManglingUtils")
|
||||
package org.jetbrains.kotlin.codegen
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.resolve.jvm.checkers.isValidDalvikCharacter
|
||||
|
||||
fun getNameForDestructuredParameterOrNull(valueParameterDescriptor: ValueParameterDescriptor): String? {
|
||||
val variables = ValueParameterDescriptorImpl.getDestructuringVariablesOrNull(valueParameterDescriptor) ?: return null
|
||||
|
||||
@Suppress("SpellCheckingInspection")
|
||||
return "\$dstr\$" + variables.joinToString(separator = "$") { descriptor ->
|
||||
val name = descriptor.name
|
||||
mangleNameIfNeeded(
|
||||
when {
|
||||
name.isSpecial -> "\$_\$"
|
||||
else -> descriptor.name.asString()
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun mangleNameIfNeeded(name: String): String {
|
||||
if (name.all { it.isValidCharacter() }) {
|
||||
return name
|
||||
}
|
||||
|
||||
return buildString {
|
||||
for (c in name) {
|
||||
if (c.isValidCharacter()) {
|
||||
append(c)
|
||||
continue
|
||||
}
|
||||
|
||||
append("_u").append(Integer.toHexString(c.toInt()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Char.isValidCharacter(): Boolean {
|
||||
return this != '$' && this != '-' && isValidDalvikCharacter(this)
|
||||
}
|
||||
Reference in New Issue
Block a user