blob: 3baea9cf7f1a5e3efa91f61dec9b98541f5843b9 [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.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
import kotlinx.metadata.jvm.KotlinClassHeader;
import kotlinx.metadata.jvm.KotlinClassMetadata;
import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
// Holds information about Metadata.MultiFileClassFace
public class KotlinMultiFileClassFacadeInfo implements KotlinClassLevelInfo {
private final List<DexType> partClassNames;
private final String packageName;
private KotlinMultiFileClassFacadeInfo(List<DexType> partClassNames, String packageName) {
this.partClassNames = partClassNames;
this.packageName = packageName;
}
static KotlinMultiFileClassFacadeInfo create(
MultiFileClassFacade kmMultiFileClassFacade,
String packageName,
DexDefinitionSupplier definitionSupplier) {
ImmutableList.Builder<DexType> builder = ImmutableList.builder();
for (String partClassName : kmMultiFileClassFacade.getPartClassNames()) {
String descriptor = DescriptorUtils.getDescriptorFromClassBinaryName(partClassName);
DexType type = definitionSupplier.dexItemFactory().createType(descriptor);
builder.add(type);
}
return new KotlinMultiFileClassFacadeInfo(builder.build(), packageName);
}
@Override
public boolean isMultiFileFacade() {
return true;
}
@Override
public KotlinMultiFileClassFacadeInfo asMultiFileFacade() {
return this;
}
@Override
public KotlinClassHeader rewrite(
DexClass clazz, AppView<AppInfoWithLiveness> appView, NamingLens namingLens) {
KotlinClassMetadata.MultiFileClassFacade.Writer writer =
new KotlinClassMetadata.MultiFileClassFacade.Writer();
List<String> partClassNameStrings = new ArrayList<>(partClassNames.size());
for (DexType partClassName : partClassNames) {
if (appView.appInfo().isNonProgramTypeOrLiveProgramType(partClassName)) {
DexString descriptor = namingLens.lookupDescriptor(partClassName);
String classifier = DescriptorUtils.descriptorToKotlinClassifier(descriptor.toString());
partClassNameStrings.add(classifier);
}
}
return writer.write(partClassNameStrings).getHeader();
}
@Override
public String getPackageName() {
return packageName;
}
}