blob: 2d852fd6c6a4abbc9e7d7bac8da33c54ec3c9a1a [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.retrace;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.keepanno.annotations.KeepForApi;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.references.TypeReference;
import com.google.common.base.Splitter;
import java.util.ArrayList;
import java.util.List;
@KeepForApi
public abstract class StackTraceElementProxy<T, ST extends StackTraceElementProxy<T, ST>> {
public abstract boolean hasClassName();
public abstract boolean hasMethodName();
public abstract boolean hasSourceFile();
public abstract boolean hasLineNumber();
public abstract boolean hasFieldName();
public abstract boolean hasFieldOrReturnType();
public abstract boolean hasMethodArguments();
public abstract ClassReference getClassReference();
public abstract String getMethodName();
public abstract String getSourceFile();
public abstract int getLineNumber();
public abstract String getFieldName();
public abstract String getFieldOrReturnType();
public abstract String getMethodArguments();
public List<TypeReference> getMethodArgumentTypeReferences() {
if (!hasMethodArguments()) {
return null;
}
List<TypeReference> typeReferences = new ArrayList<>();
for (String typeName : Splitter.onPattern(",\\s*").split(getMethodArguments())) {
typeReferences.add(Reference.typeFromTypeName(typeName));
}
return typeReferences;
}
public abstract T toRetracedItem(
RetraceStackTraceElementProxy<T, ST> retracedProxy, boolean verbose);
public void registerUses(
MappingSupplierBase<?> mappingSupplier, DiagnosticsHandler diagnosticsHandler) {
if (hasClassName()) {
mappingSupplier.registerClassUse(diagnosticsHandler, getClassReference());
}
if (hasMethodArguments()) {
getMethodArgumentTypeReferences()
.forEach(
typeReference ->
registerUseFromTypeReference(mappingSupplier, typeReference, diagnosticsHandler));
}
if (hasFieldOrReturnType() && !getFieldOrReturnType().equals("void")) {
registerUseFromTypeReference(
mappingSupplier, Reference.typeFromTypeName(getFieldOrReturnType()), diagnosticsHandler);
}
}
private static void registerUseFromTypeReference(
MappingSupplierBase<?> mappingSupplier,
TypeReference typeReference,
DiagnosticsHandler diagnosticsHandler) {
if (typeReference.isArray()) {
typeReference = typeReference.asArray().getBaseType();
}
if (typeReference.isClass()) {
mappingSupplier.registerClassUse(diagnosticsHandler, typeReference.asClass());
}
}
}