blob: f33f5bd7edc3c4722e3be839db8483c539b788f2 [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.androidapi;
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 TraversalContinuation visitFields(
BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor);
public abstract TraversalContinuation visitMethods(
BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor);
protected TraversalContinuation visitField(
String name,
String typeDescriptor,
int apiLevel,
BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor) {
return visitor.apply(
Reference.field(classReference, name, Reference.typeFromDescriptor(typeDescriptor)),
AndroidApiLevel.getAndroidApiLevel(apiLevel));
}
protected TraversalContinuation visitMethod(
String name,
String[] formalTypeDescriptors,
String returnType,
int apiLevel,
BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor) {
List<TypeReference> typeReferenceList = new ArrayList<>(formalTypeDescriptors.length);
for (String formalTypeDescriptor : formalTypeDescriptors) {
typeReferenceList.add(Reference.typeFromDescriptor(formalTypeDescriptor));
}
return visitor.apply(
Reference.method(
classReference,
name,
typeReferenceList,
returnType == null ? null : Reference.returnTypeFromDescriptor(returnType)),
AndroidApiLevel.getAndroidApiLevel(apiLevel));
}
}