| // 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.androidapi; |
| |
| import static com.android.tools.r8.utils.AndroidApiLevel.getAndroidApiLevel; |
| |
| import com.android.tools.r8.references.ClassReference; |
| import com.android.tools.r8.references.FieldReference; |
| import com.android.tools.r8.references.MethodReference; |
| import com.android.tools.r8.references.Reference; |
| import com.android.tools.r8.references.TypeReference; |
| import com.android.tools.r8.utils.AndroidApiLevel; |
| import com.android.tools.r8.utils.TraversalContinuation; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.function.BiFunction; |
| |
| /** This is a base class for all generated classes from api-versions.xml. */ |
| public abstract class AndroidApiClass { |
| |
| private final ClassReference classReference; |
| |
| public AndroidApiClass(ClassReference classReference) { |
| this.classReference = classReference; |
| } |
| |
| public abstract AndroidApiLevel getApiLevel(); |
| |
| public abstract int getMemberCount(); |
| |
| public TraversalContinuation<?, ?> visitFields( |
| BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor) { |
| return visitFields(visitor, classReference, 1); |
| } |
| |
| public TraversalContinuation<?, ?> visitMethods( |
| BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor) { |
| return visitMethods(visitor, classReference, 1); |
| } |
| |
| protected abstract TraversalContinuation<?, ?> visitFields( |
| BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor, |
| ClassReference holder, |
| int minApiClass); |
| |
| protected abstract TraversalContinuation<?, ?> visitMethods( |
| BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor, |
| ClassReference holder, |
| int minApiClass); |
| |
| protected TraversalContinuation<?, ?> visitField( |
| BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor, |
| ClassReference holder, |
| int minApiClass, |
| int minApiField, |
| String name, |
| String typeDescriptor) { |
| return visitor.apply( |
| Reference.field(holder, name, Reference.typeFromDescriptor(typeDescriptor)), |
| getAndroidApiLevel(Integer.max(minApiClass, minApiField))); |
| } |
| |
| protected TraversalContinuation<?, ?> visitMethod( |
| BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor, |
| ClassReference holder, |
| int minApiClass, |
| int minApiMethod, |
| String name, |
| String[] formalTypeDescriptors, |
| String returnType) { |
| List<TypeReference> typeReferenceList = new ArrayList<>(formalTypeDescriptors.length); |
| for (String formalTypeDescriptor : formalTypeDescriptors) { |
| typeReferenceList.add(Reference.typeFromDescriptor(formalTypeDescriptor)); |
| } |
| return visitor.apply( |
| Reference.method( |
| holder, |
| name, |
| typeReferenceList, |
| returnType == null ? null : Reference.returnTypeFromDescriptor(returnType)), |
| getAndroidApiLevel(Integer.max(minApiClass, minApiMethod))); |
| } |
| } |