| // 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(); |
| } |
| } |