| // 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.structural; |
| |
| import com.android.tools.r8.graph.DexField; |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.naming.NamingLens; |
| import com.android.tools.r8.utils.structural.StructuralItem.CompareToAccept; |
| |
| public class CompareToVisitorWithNamingLens extends CompareToVisitorBase { |
| |
| public static <T> int run(T item1, T item2, NamingLens namingLens, StructuralMapping<T> visit) { |
| return run(item1, item2, namingLens, (i1, i2, visitor) -> visitor.visit(i1, i2, visit)); |
| } |
| |
| public static <T> int run( |
| T item1, T item2, NamingLens namingLens, CompareToAccept<T> compareToAccept) { |
| if (item1 == item2) { |
| return 0; |
| } |
| CompareToVisitorWithNamingLens state = new CompareToVisitorWithNamingLens(namingLens); |
| return compareToAccept.acceptCompareTo(item1, item2, state); |
| } |
| |
| private final NamingLens namingLens; |
| |
| public CompareToVisitorWithNamingLens(NamingLens namingLens) { |
| this.namingLens = namingLens; |
| } |
| |
| @Override |
| public int visitDexType(DexType type1, DexType type2) { |
| if (type1 == type2) { |
| return 0; |
| } |
| return debug( |
| namingLens |
| .lookupDescriptor(type1) |
| .acceptCompareTo(namingLens.lookupDescriptor(type2), this)); |
| } |
| |
| @Override |
| public int visitDexField(DexField field1, DexField field2) { |
| if (field1 == field2) { |
| return 0; |
| } |
| int order = field1.holder.acceptCompareTo(field2.holder, this); |
| if (order != 0) { |
| return debug(order); |
| } |
| order = namingLens.lookupName(field1).acceptCompareTo(namingLens.lookupName(field2), this); |
| if (order != 0) { |
| return debug(order); |
| } |
| return debug(field1.type.acceptCompareTo(field2.type, this)); |
| } |
| |
| @Override |
| public int visitDexMethod(DexMethod method1, DexMethod method2) { |
| if (method1 == method2) { |
| return 0; |
| } |
| int order = method1.holder.acceptCompareTo(method2.holder, this); |
| if (order != 0) { |
| return debug(order); |
| } |
| order = namingLens.lookupName(method1).acceptCompareTo(namingLens.lookupName(method2), this); |
| if (order != 0) { |
| return debug(order); |
| } |
| return debug(method1.proto.acceptCompareTo(method2.proto, this)); |
| } |
| } |