blob: 7fe95025e6e98047b88e3aa8c62350f60c4e16ea [file] [log] [blame]
// Copyright (c) 2021, 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.utils.codeinspector;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodState;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodStateCollectionByReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.utils.MethodReferenceUtils;
import java.util.function.Predicate;
public class ArgumentPropagatorCodeScannerResultInspector {
private final DexItemFactory dexItemFactory;
private final MethodStateCollectionByReference methodStates;
public ArgumentPropagatorCodeScannerResultInspector(
DexItemFactory dexItemFactory, MethodStateCollectionByReference methodStates) {
this.dexItemFactory = dexItemFactory;
this.methodStates = methodStates;
}
public ArgumentPropagatorCodeScannerResultInspector apply(
ThrowableConsumer<ArgumentPropagatorCodeScannerResultInspector> consumer) {
consumer.acceptWithRuntimeException(this);
return this;
}
public ArgumentPropagatorCodeScannerResultInspector assertHasBottomMethodState(
MethodReference methodReference) {
return assertHasMethodStateThatMatches(
"Expected method state for "
+ MethodReferenceUtils.toSourceString(methodReference)
+ " to be bottom",
methodReference,
MethodState::isBottom);
}
public ArgumentPropagatorCodeScannerResultInspector assertHasMonomorphicMethodState(
MethodReference methodReference) {
return assertHasMethodStateThatMatches(
"Expected method state for "
+ MethodReferenceUtils.toSourceString(methodReference)
+ " to be monomorphic",
methodReference,
MethodState::isMonomorphic);
}
public ArgumentPropagatorCodeScannerResultInspector assertHasPolymorphicMethodState(
MethodReference methodReference) {
return assertHasMethodStateThatMatches(
"Expected method state for "
+ MethodReferenceUtils.toSourceString(methodReference)
+ " to be polymorphic",
methodReference,
MethodState::isPolymorphic);
}
public ArgumentPropagatorCodeScannerResultInspector assertHasUnknownMethodState(
MethodReference methodReference) {
return assertHasMethodStateThatMatches(
"Expected method state for "
+ MethodReferenceUtils.toSourceString(methodReference)
+ " to be unknown",
methodReference,
MethodState::isUnknown);
}
public ArgumentPropagatorCodeScannerResultInspector assertHasMethodStateThatMatches(
String message, MethodReference methodReference, Predicate<MethodState> predicate) {
DexMethod method = MethodReferenceUtils.toDexMethod(methodReference, dexItemFactory);
MethodState methodState = methodStates.get(method);
assertTrue(message + ", was: " + methodState, predicate.test(methodState));
return this;
}
}