Change mangling for destructured lambda parameters

This commit is contained in:
Yan Zhulanow
2019-01-09 15:58:52 +03:00
parent d2c2a6c99f
commit 47f0b68a8c
19 changed files with 213 additions and 45 deletions
@@ -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)
}