blob: d25f105011d68abc92aa47de1e73239f8ce6baa5 [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 static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmMethodSignature;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Reporter;
import kotlinx.metadata.KmLambda;
import kotlinx.metadata.KmLambdaVisitor;
import kotlinx.metadata.jvm.JvmExtensionsKt;
import kotlinx.metadata.jvm.JvmMethodSignature;
// Holds information about a KmLambda
public class KotlinLambdaInfo {
private final KotlinFunctionInfo function;
private KotlinLambdaInfo(KotlinFunctionInfo function) {
this.function = function;
}
static KotlinLambdaInfo create(
DexClass clazz,
KmLambda lambda,
DexDefinitionSupplier definitionSupplier,
Reporter reporter) {
if (lambda == null) {
assert false;
return null;
}
JvmMethodSignature signature = JvmExtensionsKt.getSignature(lambda.function);
if (signature == null) {
assert false;
return null;
}
for (DexEncodedMethod method : clazz.methods()) {
if (toJvmMethodSignature(method.method).asString().equals(signature.asString())) {
KotlinFunctionInfo kotlinFunctionInfo =
KotlinFunctionInfo.create(lambda.function, definitionSupplier, reporter);
method.setKotlinMemberInfo(kotlinFunctionInfo);
return new KotlinLambdaInfo(kotlinFunctionInfo);
}
}
// TODO(b/155536535): Resolve this assert for NestTreeShakeJarVerificationTest.
// assert false;
return null;
}
boolean rewrite(
KmVisitorProviders.KmLambdaVisitorProvider visitorProvider,
DexClass clazz,
AppView<AppInfoWithLiveness> appView,
NamingLens namingLens) {
for (DexEncodedMethod method : clazz.methods()) {
if (method.getKotlinMemberInfo() == function) {
KmLambdaVisitor kmLambdaVisitor = visitorProvider.get();
function.rewrite(kmLambdaVisitor::visitFunction, method, appView, namingLens);
return true;
}
}
return false;
}
}