Merge "Update RootSetBuilder.verifyKeptItemsAreKept()"
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index 374553a..7dde660 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -1119,11 +1119,21 @@
for (DexProgramClass clazz : application.classes()) {
Set<DexDefinition> requiredDefinitions =
requiredDefinitionsPerType.getOrDefault(clazz.type, ImmutableSet.of());
+
+ Set<DexField> fields = null;
+ Set<DexMethod> methods = null;
+
for (DexDefinition requiredDefinition : requiredDefinitions) {
if (requiredDefinition.isDexEncodedField()) {
DexEncodedField requiredField = requiredDefinition.asDexEncodedField();
- assert Streams.stream(clazz.fields())
- .anyMatch(field -> field.field == requiredField.field);
+ if (fields == null) {
+ // Create a Set of the fields to avoid quadratic behavior.
+ fields =
+ Streams.stream(clazz.fields())
+ .map(DexEncodedField::getKey)
+ .collect(Collectors.toSet());
+ }
+ assert fields.contains(requiredField.field);
} else if (requiredDefinition.isDexEncodedMethod()) {
DexEncodedMethod requiredMethod = requiredDefinition.asDexEncodedMethod();
if (isInterfaceMethodDesugaringEnabled) {
@@ -1133,8 +1143,14 @@
continue;
}
}
- assert Streams.stream(clazz.methods())
- .anyMatch(method -> method.method == requiredMethod.method);
+ if (methods == null) {
+ // Create a Set of the methods to avoid quadratic behavior.
+ methods =
+ Streams.stream(clazz.methods())
+ .map(DexEncodedMethod::getKey)
+ .collect(Collectors.toSet());
+ }
+ assert methods.contains(requiredMethod.method);
} else {
assert false;
}