summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoit Lamarche <benoitlamarche@google.com>2015-02-04 15:28:23 +0100
committerBenoit Lamarche <benoitlamarche@google.com>2015-02-10 11:28:26 +0100
commitf254bff87d3fd9f92069e8c3226fd993adb5f53e (patch)
treeb926ab1a38e982777327e56312f2c0d5c166d7c9
parentc53f4b0fda658b11aadcff42f34de5fd7cebf57b (diff)
downloadtoolchain_jack-f254bff87d3fd9f92069e8c3226fd993adb5f53e.tar.gz
toolchain_jack-f254bff87d3fd9f92069e8c3226fd993adb5f53e.tar.bz2
toolchain_jack-f254bff87d3fd9f92069e8c3226fd993adb5f53e.zip
Fix anonymous class handling in DexAnnotationsComparator
Change-Id: I531f0130ce4b405f43aafe11dd374035e1cb9f1c
-rw-r--r--dexcomparator/src/com/android/jack/DexAnnotationsComparator.java41
1 files changed, 31 insertions, 10 deletions
diff --git a/dexcomparator/src/com/android/jack/DexAnnotationsComparator.java b/dexcomparator/src/com/android/jack/DexAnnotationsComparator.java
index 1ad383a7..225bc08a 100644
--- a/dexcomparator/src/com/android/jack/DexAnnotationsComparator.java
+++ b/dexcomparator/src/com/android/jack/DexAnnotationsComparator.java
@@ -54,6 +54,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -420,8 +421,9 @@ public class DexAnnotationsComparator {
}
}
- private boolean compareValues(EncodedValue encodedValue, EncodedValue candEncodedValue,
- String elementString, String type, String name) throws DifferenceFoundException {
+ private boolean compareValues(@Nonnull EncodedValue encodedValue,
+ @Nonnull EncodedValue candEncodedValue, String elementString, String type, String name)
+ throws DifferenceFoundException {
boolean isEqual = false;
if (encodedValue.getValueType().value == candEncodedValue.getValueType().value) {
if (encodedValue instanceof StringEncodedValue) {
@@ -512,25 +514,31 @@ public class DexAnnotationsComparator {
throws DifferenceFoundException {
boolean isEqual = true;
boolean isMemberClass = type.equals(MEMBER_CLASSES_DESCRIPTOR);
- Iterator<EncodedValue> refEncodedValuesIterator = refEncodedValues.iterator();
- Iterator<EncodedValue> candEncodedValuesIterator = candEncodedValues.iterator();
+ ListIterator<EncodedValue> refEncodedValuesIterator = refEncodedValues.listIterator();
+ ListIterator<EncodedValue> candEncodedValuesIterator = candEncodedValues.listIterator();
while (refEncodedValuesIterator.hasNext()) {
if (!candEncodedValuesIterator.hasNext()) {
isEqual = false;
break;
}
- EncodedValue refValue = refEncodedValuesIterator.next();
- // our reference may have additional synthetic anonymous classes that we should ignore
+ EncodedValue refValue;
+ EncodedValue candValue;
+
if (isMemberClass) {
- TypeEncodedValue typeRefValue = (TypeEncodedValue) refValue;
- if (isAnonymousTypeName(typeRefValue.value.getTypeDescriptor())) {
- continue;
+ // we may have additional anonymous classes that we should ignore
+ refValue = getNextEncodedValueOfMemberClassAnnotation(refEncodedValuesIterator);
+ candValue = getNextEncodedValueOfMemberClassAnnotation(candEncodedValuesIterator);
+ if (refValue == null || candValue == null) {
+ isEqual = (refValue == candValue);
+ break;
}
+ } else {
+ refValue = refEncodedValuesIterator.next();
+ candValue = candEncodedValuesIterator.next();
}
- EncodedValue candValue = candEncodedValuesIterator.next();
isEqual = compareValues(refValue, candValue, elementString, type, name);
if (!isEqual) {
break;
@@ -542,6 +550,19 @@ public class DexAnnotationsComparator {
return isEqual;
}
+ @CheckForNull
+ private EncodedValue getNextEncodedValueOfMemberClassAnnotation(
+ @Nonnull Iterator<EncodedValue> encodedValuesIterator) {
+ TypeEncodedValue typeValue;
+ while (encodedValuesIterator.hasNext()) {
+ typeValue = (TypeEncodedValue) encodedValuesIterator.next();
+ if (!isAnonymousTypeName(typeValue.value.getTypeDescriptor())) {
+ return typeValue;
+ }
+ }
+ return null;
+ }
+
private boolean compareMethodIds(MethodIdItem value, MethodIdItem value2) {
boolean isEqual = compareTypeIds(value.getContainingClass(), value2.getContainingClass());
isEqual &= compareProtoIds(value.getPrototype(), value2.getPrototype());