blob: b3b442c31b3ad3b84552751a9a32a31eb3556b97 [file] [log] [blame]
// Copyright (c) 2025, 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.graph;
import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.graph.GenericSignature.ReturnType;
import com.android.tools.r8.graph.GenericSignature.TypeSignature;
import java.util.List;
public interface GenericSignatureUseRegistry {
void registerType(DexType type);
default Visitor toVisitor() {
return new Visitor(this);
}
class Visitor implements GenericSignatureVisitor {
private final GenericSignatureUseRegistry registry;
public Visitor(GenericSignatureUseRegistry registry) {
this.registry = registry;
}
@Override
public FieldTypeSignature visitClassBound(FieldTypeSignature fieldSignature) {
return visitFieldTypeSignature(fieldSignature);
}
@Override
public ClassTypeSignature visitEnclosing(
ClassTypeSignature enclosingSignature, ClassTypeSignature enclosedSignature) {
return enclosingSignature.visit(this);
}
@Override
public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
if (fieldSignature.isStar() || fieldSignature.isTypeVariableSignature()) {
return fieldSignature;
} else if (fieldSignature.isArrayTypeSignature()) {
return fieldSignature.asArrayTypeSignature().visit(this);
} else {
assert fieldSignature.isClassTypeSignature();
return fieldSignature.asClassTypeSignature().visit(this);
}
}
public List<FieldTypeSignature> visitFieldTypeSignatures(
List<FieldTypeSignature> fieldTypeSignatures) {
fieldTypeSignatures.forEach(this::visitFieldTypeSignature);
return fieldTypeSignatures;
}
@Override
public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
return formalTypeParameter.visit(this);
}
@Override
public List<FormalTypeParameter> visitFormalTypeParameters(
List<FormalTypeParameter> formalTypeParameters) {
formalTypeParameters.forEach(this::visitFormalTypeParameter);
return formalTypeParameters;
}
@Override
public FieldTypeSignature visitInterfaceBound(FieldTypeSignature fieldSignature) {
return visitFieldTypeSignature(fieldSignature);
}
@Override
public List<FieldTypeSignature> visitInterfaceBounds(List<FieldTypeSignature> fieldSignatures) {
fieldSignatures.forEach(this::visitInterfaceBound);
return fieldSignatures;
}
@Override
public MethodTypeSignature visitMethodSignature(MethodTypeSignature methodSignature) {
return methodSignature.visit(this);
}
public TypeSignature visitMethodTypeSignature(TypeSignature typeSignature) {
return visitTypeSignature(typeSignature);
}
@Override
public List<TypeSignature> visitMethodTypeSignatures(List<TypeSignature> typeSignatures) {
typeSignatures.forEach(this::visitMethodTypeSignature);
return typeSignatures;
}
@Override
public ReturnType visitReturnType(ReturnType returnType) {
if (!returnType.isVoidDescriptor()) {
visitTypeSignature(returnType.typeSignature());
}
return returnType;
}
@Override
public ClassTypeSignature visitSuperClass(
ClassTypeSignature classTypeSignatureOrNullForObject) {
if (classTypeSignatureOrNullForObject != null) {
return classTypeSignatureOrNullForObject.visit(this);
} else {
return classTypeSignatureOrNullForObject;
}
}
@Override
public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
return classTypeSignature.visit(this);
}
@Override
public List<ClassTypeSignature> visitSuperInterfaces(
List<ClassTypeSignature> interfaceSignatures) {
interfaceSignatures.forEach(this::visitSuperInterface);
return interfaceSignatures;
}
@Override
public List<TypeSignature> visitThrowsSignatures(List<TypeSignature> typeSignatures) {
return visitTypeSignatures(typeSignatures);
}
@Override
public DexType visitType(DexType type) {
registry.registerType(type);
return type;
}
@Override
public List<FieldTypeSignature> visitTypeArguments(
DexType originalType, DexType lookedUpType, List<FieldTypeSignature> typeArguments) {
return visitFieldTypeSignatures(typeArguments);
}
@Override
public TypeSignature visitTypeSignature(TypeSignature typeSignature) {
if (typeSignature.isBaseTypeSignature()) {
assert typeSignature.asBaseTypeSignature().getType().isPrimitiveType();
return typeSignature;
} else {
assert typeSignature.isFieldTypeSignature();
return visitFieldTypeSignature(typeSignature.asFieldTypeSignature());
}
}
public List<TypeSignature> visitTypeSignatures(List<TypeSignature> typeSignatures) {
typeSignatures.forEach(this::visitTypeSignature);
return typeSignatures;
}
}
}