blob: 9c1c5290627b89b72717bb9e60bf1c394f205e2d [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.shaking;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
import com.google.common.collect.Sets;
import java.util.Set;
import java.util.function.Consumer;
public class MainDexClasses {
private final Set<DexType> mainDexClasses;
private MainDexClasses() {
this(Sets.newIdentityHashSet());
}
private MainDexClasses(Set<DexType> mainDexClasses) {
this.mainDexClasses = mainDexClasses;
}
public static Builder builder() {
return new Builder();
}
public static MainDexClasses createEmptyMainDexClasses() {
return new MainDexClasses();
}
public void add(DexProgramClass clazz) {
mainDexClasses.add(clazz.getType());
}
public void addAll(MainDexClasses other) {
mainDexClasses.addAll(other.mainDexClasses);
}
public void addAll(MainDexTracingResult other) {
mainDexClasses.addAll(other.getClasses());
}
public void addAll(Iterable<DexProgramClass> classes) {
for (DexProgramClass clazz : classes) {
add(clazz);
}
}
public boolean contains(DexType type) {
return mainDexClasses.contains(type);
}
public boolean contains(DexProgramClass clazz) {
return contains(clazz.getType());
}
public boolean containsAnyOf(Iterable<DexProgramClass> classes) {
for (DexProgramClass clazz : classes) {
if (contains(clazz)) {
return true;
}
}
return false;
}
public void forEach(Consumer<DexType> fn) {
mainDexClasses.forEach(fn);
}
public boolean isEmpty() {
return mainDexClasses.isEmpty();
}
public MainDexClasses rewrittenWithLens(GraphLens lens) {
MainDexClasses rewrittenMainDexClasses = createEmptyMainDexClasses();
for (DexType mainDexClass : mainDexClasses) {
DexType rewrittenMainDexClass = lens.lookupType(mainDexClass);
rewrittenMainDexClasses.mainDexClasses.add(rewrittenMainDexClass);
}
return rewrittenMainDexClasses;
}
public int size() {
return mainDexClasses.size();
}
public MainDexClasses withoutPrunedItems(PrunedItems prunedItems) {
if (prunedItems.isEmpty()) {
return this;
}
MainDexClasses mainDexClassesAfterPruning = createEmptyMainDexClasses();
for (DexType mainDexClass : mainDexClasses) {
if (!prunedItems.getRemovedClasses().contains(mainDexClass)) {
mainDexClassesAfterPruning.mainDexClasses.add(mainDexClass);
}
}
return mainDexClassesAfterPruning;
}
public static class Builder {
private final Set<DexType> mainDexClasses = Sets.newIdentityHashSet();
private Builder() {}
public void add(DexProgramClass clazz) {
mainDexClasses.add(clazz.getType());
}
public MainDexClasses build() {
return new MainDexClasses(mainDexClasses);
}
}
}