blob: 1d4e46ac8eca0a3bf33e680ec075f6edc4f621cd [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.Diagnostic;
import com.android.tools.r8.Keep;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Keep
public class MissingDefinitionsDiagnostic implements Diagnostic {
private final Set<ClassReference> missingClasses;
private final Set<FieldReference> missingFields;
private final Set<MethodReference> missingMethods;
MissingDefinitionsDiagnostic(
Set<ClassReference> missingClasses,
Set<FieldReference> missingFields,
Set<MethodReference> missingMethods) {
this.missingClasses = missingClasses;
this.missingFields = missingFields;
this.missingMethods = missingMethods;
}
@Override
public Origin getOrigin() {
return Origin.unknown();
}
@Override
public Position getPosition() {
return Position.UNKNOWN;
}
private <T> void appendSorted(StringBuilder builder, Set<T> missing) {
missing.stream()
.map(Object::toString)
.sorted()
.forEach(item -> builder.append(" ").append(item).append(System.lineSeparator()));
}
public Set<ClassReference> getMissingClasses() {
return missingClasses;
}
public Set<FieldReference> getMissingFields() {
return missingFields;
}
public Set<MethodReference> getMissingMethods() {
return missingMethods;
}
@Override
public String getDiagnosticMessage() {
StringBuilder builder = new StringBuilder("Tracereferences found ");
List<String> components = new ArrayList<>();
if (missingClasses.size() > 0) {
components.add("" + missingClasses.size() + " classe(s)");
}
if (missingFields.size() > 0) {
components.add("" + missingFields.size() + " field(s)");
}
if (missingMethods.size() > 0) {
components.add("" + missingMethods.size() + " method(s)");
}
assert components.size() > 0;
for (int i = 0; i < components.size(); i++) {
if (i != 0) {
builder.append(i < components.size() - 1 ? ", " : " and ");
}
builder.append(components.get(i));
}
builder.append(" without definition");
builder.append(System.lineSeparator());
builder.append(System.lineSeparator());
if (missingClasses.size() > 0) {
builder.append("Classe(s) without definition:" + System.lineSeparator());
appendSorted(builder, missingClasses);
}
if (missingFields.size() > 0) {
builder.append("Field(s) without definition:" + System.lineSeparator());
appendSorted(builder, missingFields);
}
if (missingMethods.size() > 0) {
builder.append("Method(s) without definition:" + System.lineSeparator());
appendSorted(builder, missingMethods);
}
return builder.toString();
}
}