blob: e40f3d73ec8af4325d9eb8c1810e7277533d62de [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.tracereferences;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.PackageReference;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedClass;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedField;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedMethod;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class TraceReferencesResult {
final Set<TracedClass> types;
final Map<ClassReference, Set<TracedField>> fields;
final Map<ClassReference, Set<TracedMethod>> methods;
final Set<PackageReference> keepPackageNames;
final Set<Object> missingDefinition;
TraceReferencesResult(
Set<TracedClass> types,
Map<ClassReference, Set<TracedField>> fields,
Map<ClassReference, Set<TracedMethod>> methods,
Set<PackageReference> keepPackageNames,
Set<Object> missingDefinition) {
this.types = types;
this.fields = fields;
this.methods = methods;
this.keepPackageNames = keepPackageNames;
this.missingDefinition = missingDefinition;
}
static Builder builder() {
return new Builder();
}
static class Builder implements TraceReferencesConsumer {
private final Set<TracedClass> types = new HashSet<>();
private final Map<ClassReference, Set<TracedField>> fields = new HashMap<>();
private final Map<ClassReference, Set<TracedMethod>> methods = new HashMap<>();
private final Set<Object> missingDefinition = new HashSet<>();
private final Set<PackageReference> keepPackageNames = new HashSet<>();
@Override
public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {
types.add(tracedClass);
if (tracedClass.isMissingDefinition()) {
this.missingDefinition.add(tracedClass.getReference());
}
}
@Override
public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {
FieldReference field = tracedField.getReference();
fields.computeIfAbsent(field.getHolderClass(), k -> new HashSet<>()).add(tracedField);
if (tracedField.isMissingDefinition()) {
this.missingDefinition.add(field);
}
}
@Override
public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {
MethodReference method = tracedMethod.getReference();
methods.computeIfAbsent(method.getHolderClass(), k -> new HashSet<>()).add(tracedMethod);
if (tracedMethod.isMissingDefinition()) {
this.missingDefinition.add(method);
}
}
@Override
public void acceptPackage(PackageReference pkg, DiagnosticsHandler handler) {
keepPackageNames.add(pkg);
}
@Override
public void finished(DiagnosticsHandler handler) {}
TraceReferencesResult build() {
missingDefinition.forEach(
missingDefinition -> {
assert missingDefinition instanceof ClassReference
|| missingDefinition instanceof FieldReference
|| missingDefinition instanceof MethodReference;
});
return new TraceReferencesResult(types, fields, methods, keepPackageNames, missingDefinition);
}
}
}