blob: e5d0df279d965435b301264ebf2fa3530299c73d [file] [log] [blame]
// Copyright (c) 2021, 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.internal;
import com.android.tools.r8.naming.ClassNamingForNameMapper;
import com.android.tools.r8.naming.mappinginformation.MappingInformation;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.retrace.RetraceStackTraceContext;
import com.android.tools.r8.retrace.RetraceThrownExceptionElement;
import com.android.tools.r8.retrace.RetraceThrownExceptionResult;
import com.android.tools.r8.retrace.RetracedSourceFile;
import java.util.stream.Stream;
public class RetraceThrownExceptionResultImpl implements RetraceThrownExceptionResult {
private final RetraceStackTraceContextImpl context;
private final ClassReference obfuscatedReference;
private final ClassNamingForNameMapper mapper;
RetraceThrownExceptionResultImpl(
RetraceStackTraceContextImpl context,
ClassReference obfuscatedReference,
ClassNamingForNameMapper mapper) {
this.context = context;
this.obfuscatedReference = obfuscatedReference;
this.mapper = mapper;
}
@Override
public Stream<RetraceThrownExceptionElement> stream() {
return Stream.of(createElement());
}
@Override
public boolean isEmpty() {
return obfuscatedReference == null;
}
private RetraceThrownExceptionElement createElement() {
return new RetraceThrownExceptionElementImpl(
this,
RetracedClassReferenceImpl.create(
mapper == null
? obfuscatedReference
: Reference.classFromTypeName(mapper.originalName)),
mapper,
obfuscatedReference);
}
public static class RetraceThrownExceptionElementImpl implements RetraceThrownExceptionElement {
private final RetraceThrownExceptionResultImpl thrownExceptionResult;
private final RetracedClassReferenceImpl classReference;
private final ClassNamingForNameMapper mapper;
private final ClassReference thrownException;
private RetraceThrownExceptionElementImpl(
RetraceThrownExceptionResultImpl thrownExceptionResult,
RetracedClassReferenceImpl classReference,
ClassNamingForNameMapper mapper,
ClassReference thrownException) {
this.thrownExceptionResult = thrownExceptionResult;
this.classReference = classReference;
this.mapper = mapper;
this.thrownException = thrownException;
}
@Override
public RetracedClassReferenceImpl getRetracedClass() {
return classReference;
}
@Override
public RetraceThrownExceptionResult getParentResult() {
return thrownExceptionResult;
}
@Override
public RetracedSourceFile getSourceFile() {
String sourceFile = null;
if (mapper != null) {
for (MappingInformation info : mapper.getAdditionalMappingInfo()) {
if (info.isFileNameInformation()) {
sourceFile = info.asFileNameInformation().getFileName();
break;
}
}
}
return new RetracedSourceFileImpl(getRetracedClass().getClassReference(), sourceFile);
}
@Override
public boolean isCompilerSynthesized() {
return false;
}
@Override
public RetraceStackTraceContext getContext() {
return RetraceStackTraceContextImpl.builder().setThrownException(thrownException).build();
}
}
}