| // 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()); |
| } |
| } |
| } |