blob: d7b0439f98fdf67c4e423f0a4c30fbfbf8f7e56f [file] [log] [blame]
// Copyright (c) 2020, 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.utils;
import static com.android.tools.r8.utils.ClassReferenceUtils.getClassReferenceComparator;
import static com.android.tools.r8.utils.TypeReferenceUtils.getTypeReferenceComparator;
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 java.util.Comparator;
public class FieldReferenceUtils {
private static final Comparator<FieldReference> COMPARATOR =
(field, other) -> {
CompareResult holderClassCompareResult =
CompareResult.compare(
field.getHolderClass(), other.getHolderClass(), getClassReferenceComparator());
if (!holderClassCompareResult.isEqual()) {
return holderClassCompareResult.getComparisonResult();
}
CompareResult fieldNameCompareResult =
CompareResult.compare(field.getFieldName(), other.getFieldName());
if (!fieldNameCompareResult.isEqual()) {
return fieldNameCompareResult.getComparisonResult();
}
return getTypeReferenceComparator().compare(field.getFieldType(), other.getFieldType());
};
public static int compare(FieldReference fieldReference, ClassReference other) {
return ClassReferenceUtils.compare(other, fieldReference) * -1;
}
public static int compare(FieldReference fieldReference, FieldReference other) {
return getFieldReferenceComparator().compare(fieldReference, other);
}
public static int compare(FieldReference fieldReference, MethodReference other) {
int comparisonResult =
ClassReferenceUtils.compare(fieldReference.getHolderClass(), other.getHolderClass());
return comparisonResult != 0 ? comparisonResult : -1;
}
public static FieldReference fieldFromField(Class<?> clazz, String name) {
try {
return Reference.fieldFromField(clazz.getDeclaredField(name));
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
public static Comparator<FieldReference> getFieldReferenceComparator() {
return COMPARATOR;
}
public static String toSourceString(FieldReference fieldReference) {
return fieldReference.getFieldType().getTypeName()
+ " "
+ fieldReference.getHolderClass().getTypeName()
+ "."
+ fieldReference.getFieldName();
}
}