blob: b87c6ad56fe7ef45a98678ada6267b467c3510a3 [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.horizontalclassmerging;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ClassMethodsBuilder {
private Set<DexMethod> reservedMethods = Sets.newIdentityHashSet();
private List<DexEncodedMethod> virtualMethods = new ArrayList<>();
private List<DexEncodedMethod> directMethods = new ArrayList<>();
public void addVirtualMethod(DexEncodedMethod virtualMethod) {
virtualMethods.add(virtualMethod);
boolean added = reservedMethods.add(virtualMethod.getReference());
assert added;
}
public void addDirectMethod(DexEncodedMethod directMethod) {
directMethods.add(directMethod);
boolean added = reservedMethods.add(directMethod.getReference());
assert added;
}
public boolean isFresh(DexMethod method) {
return !reservedMethods.contains(method);
}
public void setClassMethods(DexProgramClass clazz) {
assert virtualMethods.stream().allMatch(method -> method.getHolderType() == clazz.type);
assert virtualMethods.stream().allMatch(DexEncodedMethod::belongsToVirtualPool);
assert directMethods.stream().allMatch(method -> method.getHolderType() == clazz.type);
assert directMethods.stream().allMatch(DexEncodedMethod::belongsToDirectPool);
clazz.setVirtualMethods(virtualMethods);
clazz.setDirectMethods(directMethods);
}
}