blob: d546d11a1d464c2bc59b02b75b71cdfcbc41846d [file] [log] [blame]
// Copyright (c) 2019, 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.references.TypeReference;
import com.android.tools.r8.retrace.RetraceTypeResult.Element;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class RetraceTypeResult extends Result<Element, RetraceTypeResult> {
private final TypeReference obfuscatedType;
private final RetraceApi retracer;
private RetraceTypeResult(TypeReference obfuscatedType, RetraceApi retracer) {
this.obfuscatedType = obfuscatedType;
this.retracer = retracer;
}
static RetraceTypeResult create(TypeReference obfuscatedType, RetraceApi retracer) {
return new RetraceTypeResult(obfuscatedType, retracer);
}
@Override
public Stream<Element> stream() {
// Handle void and primitive types as single element results.
if (obfuscatedType == null || obfuscatedType.isPrimitive()) {
return Stream.of(new Element(RetracedType.create(obfuscatedType)));
}
if (obfuscatedType.isArray()) {
int dimensions = obfuscatedType.asArray().getDimensions();
return retracer.retrace(obfuscatedType.asArray().getBaseType()).stream()
.map(
baseElement ->
new Element(RetracedType.create(baseElement.retracedType.toArray(dimensions))));
}
return retracer.retrace(obfuscatedType.asClass()).stream()
.map(classElement -> new Element(classElement.getRetracedClass().getRetracedType()));
}
@Override
public boolean isAmbiguous() {
return false;
}
@Override
public RetraceTypeResult forEach(Consumer<Element> resultConsumer) {
stream().forEach(resultConsumer);
return this;
}
public static class Element {
private final RetracedType retracedType;
public Element(RetracedType retracedType) {
this.retracedType = retracedType;
}
public RetracedType getType() {
return retracedType;
}
}
}