Introduce 'identical' methods to avoid reference equality
Change-Id: I908f2deedd856926e5b32abfbe11689363564b76
diff --git a/src/main/java/com/android/tools/r8/graph/DexField.java b/src/main/java/com/android/tools/r8/graph/DexField.java
index 02cced2..939c529 100644
--- a/src/main/java/com/android/tools/r8/graph/DexField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexField.java
@@ -22,6 +22,15 @@
public class DexField extends DexMember<DexEncodedField, DexField> {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexField t1, DexField t2) {
+ return t1 == t2;
+ }
+
+ public final boolean isIdenticalTo(DexField other) {
+ return identical(this, other);
+ }
+
public final DexType type;
DexField(DexType holder, DexType type, DexString name, boolean skipNameValidationForTesting) {
@@ -191,9 +200,8 @@
}
@Override
- @SuppressWarnings("ReferenceEquality")
public boolean match(DexField field) {
- return field.name == name && field.type == type;
+ return name.isIdenticalTo(field.name) && type.isIdenticalTo(field.type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexMember.java b/src/main/java/com/android/tools/r8/graph/DexMember.java
index 635b48e..cd13cc7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMember.java
@@ -9,6 +9,11 @@
public abstract class DexMember<D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
extends DexReference implements NamingLensComparable<R> {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexMember<?, ?> t1, DexMember<?, ?> t2) {
+ return t1 == t2;
+ }
+
public final DexType holder;
public final DexString name;
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java
index 156bfb1..c4ee457 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -22,6 +22,15 @@
public class DexMethod extends DexMember<DexEncodedMethod, DexMethod> {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexMethod t1, DexMethod t2) {
+ return t1 == t2;
+ }
+
+ public final boolean isIdenticalTo(DexMethod other) {
+ return identical(this, other);
+ }
+
public final DexProto proto;
DexMethod(DexType holder, DexProto proto, DexString name, boolean skipNameValidationForTesting) {
@@ -244,18 +253,16 @@
}
@Override
- @SuppressWarnings("ReferenceEquality")
public boolean match(DexMethod method) {
- return method == this || match(method.getProto(), method.getName());
+ return isIdenticalTo(method) || match(method.getProto(), method.getName());
}
public boolean match(DexMethodSignature method) {
return match(method.getProto(), method.getName());
}
- @SuppressWarnings("ReferenceEquality")
public boolean match(DexProto methodProto, DexString methodName) {
- return proto == methodProto && name == methodName;
+ return proto.isIdenticalTo(methodProto) && name.isIdenticalTo(methodName);
}
@Override
@@ -307,10 +314,9 @@
return builder.append(")").toString();
}
- @SuppressWarnings("ReferenceEquality")
public boolean isLambdaDeserializeMethod(DexItemFactory dexItemFactory) {
- return name == dexItemFactory.deserializeLambdaMethodName
- && proto == dexItemFactory.deserializeLambdaMethodProto;
+ return dexItemFactory.deserializeLambdaMethodName.isIdenticalTo(name)
+ && dexItemFactory.deserializeLambdaMethodProto.isIdenticalTo(proto);
}
public boolean isInstanceInitializer(DexItemFactory factory) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexProto.java b/src/main/java/com/android/tools/r8/graph/DexProto.java
index c00c8ce..9721adc 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProto.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProto.java
@@ -17,6 +17,15 @@
public class DexProto extends IndexedDexItem
implements NamingLensComparable<DexProto>, LirConstant {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexProto t1, DexProto t2) {
+ return t1 == t2;
+ }
+
+ public final boolean isIdenticalTo(DexProto other) {
+ return identical(this, other);
+ }
+
public static final DexProto SENTINEL = new DexProto(null, null);
public final DexType returnType;
diff --git a/src/main/java/com/android/tools/r8/graph/DexReference.java b/src/main/java/com/android/tools/r8/graph/DexReference.java
index 4f633d3..4f5dbfd 100644
--- a/src/main/java/com/android/tools/r8/graph/DexReference.java
+++ b/src/main/java/com/android/tools/r8/graph/DexReference.java
@@ -14,6 +14,11 @@
/** A common interface for {@link DexType}, {@link DexField}, and {@link DexMethod}. */
public abstract class DexReference extends IndexedDexItem implements LirConstant {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexReference t1, DexReference t2) {
+ return t1 == t2;
+ }
+
public abstract <T> T apply(
Function<DexType, T> classConsumer,
Function<DexField, T> fieldConsumer,
diff --git a/src/main/java/com/android/tools/r8/graph/DexString.java b/src/main/java/com/android/tools/r8/graph/DexString.java
index 24e13a6..95be1fa 100644
--- a/src/main/java/com/android/tools/r8/graph/DexString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexString.java
@@ -21,6 +21,15 @@
public class DexString extends IndexedDexItem
implements NamingLensComparable<DexString>, LirConstant {
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexString t1, DexString t2) {
+ return t1 == t2;
+ }
+
+ public final boolean isIdenticalTo(DexString other) {
+ return identical(this, other);
+ }
+
public static final DexString[] EMPTY_ARRAY = {};
private static final int ARRAY_CHARACTER = '[';
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java
index 81f65e4..ecac370 100644
--- a/src/main/java/com/android/tools/r8/graph/DexType.java
+++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -30,6 +30,16 @@
import java.util.function.Predicate;
public class DexType extends DexReference implements NamingLensComparable<DexType> {
+
+ @SuppressWarnings("ReferenceEquality")
+ public static boolean identical(DexType t1, DexType t2) {
+ return t1 == t2;
+ }
+
+ public final boolean isIdenticalTo(DexType other) {
+ return identical(this, other);
+ }
+
public static final DexType[] EMPTY_ARRAY = {};
// Bundletool is merging classes that may originate from a build with an old version of R8.
@@ -325,10 +335,9 @@
return descriptor.getFirstByteAsChar() == 'D';
}
- @SuppressWarnings("ReferenceEquality")
public boolean isNullValueType() {
boolean isNullValueType = descriptor.getFirstByteAsChar() == 'N';
- assert !isNullValueType || this == DexItemFactory.nullValueType;
+ assert !isNullValueType || isIdenticalTo(DexItemFactory.nullValueType);
return isNullValueType;
}