blob: bdd7f601e28e03c0bab058d5f00cd6367c1a43da [file] [log] [blame]
// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import kotlinx.metadata.KmConstructor;
import kotlinx.metadata.KmConstructorExtensionVisitor;
import kotlinx.metadata.KmConstructorVisitor;
import kotlinx.metadata.KmExtensionType;
import kotlinx.metadata.KmFunction;
import kotlinx.metadata.KmFunctionExtensionVisitor;
import kotlinx.metadata.KmFunctionVisitor;
import kotlinx.metadata.KmProperty;
import kotlinx.metadata.KmPropertyExtensionVisitor;
import kotlinx.metadata.KmPropertyVisitor;
import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
import kotlinx.metadata.jvm.JvmFieldSignature;
import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
import kotlinx.metadata.jvm.JvmMethodSignature;
import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor;
class KotlinMetadataJvmExtensionUtils {
static JvmFieldSignature toJvmFieldSignature(DexField field) {
return new JvmFieldSignature(field.name.toString(), field.type.toDescriptorString());
}
static JvmMethodSignature toJvmMethodSignature(DexMethod method) {
StringBuilder descBuilder = new StringBuilder();
descBuilder.append("(");
for (DexType argType : method.proto.parameters.values) {
descBuilder.append(argType.toDescriptorString());
}
descBuilder.append(")");
descBuilder.append(method.proto.returnType.toDescriptorString());
return new JvmMethodSignature(method.name.toString(), descBuilder.toString());
}
static class KmConstructorProcessor {
private JvmMethodSignature signature = null;
KmConstructorProcessor(KmConstructor kmConstructor) {
kmConstructor.accept(new KmConstructorVisitor() {
@Override
public KmConstructorExtensionVisitor visitExtensions(KmExtensionType type) {
if (type != JvmConstructorExtensionVisitor.TYPE) {
return null;
}
return new JvmConstructorExtensionVisitor() {
@Override
public void visit(JvmMethodSignature desc) {
assert signature == null : signature.asString();
signature = desc;
}
};
}
});
}
JvmMethodSignature signature() {
return signature;
}
}
static class KmFunctionProcessor {
// Custom name via @JvmName("..."). Otherwise, null.
private JvmMethodSignature signature = null;
KmFunctionProcessor(KmFunction kmFunction) {
kmFunction.accept(new KmFunctionVisitor() {
@Override
public KmFunctionExtensionVisitor visitExtensions(KmExtensionType type) {
if (type != JvmFunctionExtensionVisitor.TYPE) {
return null;
}
return new JvmFunctionExtensionVisitor() {
@Override
public void visit(JvmMethodSignature desc) {
assert signature == null : signature.asString();
signature = desc;
}
};
}
});
}
JvmMethodSignature signature() {
return signature;
}
}
static class KmPropertyProcessor {
private JvmFieldSignature fieldSignature = null;
// Custom getter via @get:JvmName("..."). Otherwise, null.
private JvmMethodSignature getterSignature = null;
// Custom getter via @set:JvmName("..."). Otherwise, null.
private JvmMethodSignature setterSignature = null;
KmPropertyProcessor(KmProperty kmProperty) {
kmProperty.accept(new KmPropertyVisitor() {
@Override
public KmPropertyExtensionVisitor visitExtensions(KmExtensionType type) {
if (type != JvmPropertyExtensionVisitor.TYPE) {
return null;
}
return new JvmPropertyExtensionVisitor() {
@Override
public void visit(
int flags,
JvmFieldSignature fieldDesc,
JvmMethodSignature getterDesc,
JvmMethodSignature setterDesc) {
assert fieldSignature == null : fieldSignature.asString();
fieldSignature = fieldDesc;
assert getterSignature == null : getterSignature.asString();
getterSignature = getterDesc;
assert setterSignature == null : setterSignature.asString();
setterSignature = setterDesc;
}
};
}
});
}
JvmFieldSignature fieldSignature() {
return fieldSignature;
}
JvmMethodSignature getterSignature() {
return getterSignature;
}
JvmMethodSignature setterSignature() {
return setterSignature;
}
}
}