diff options
author | Benoit Lamarche <benoitlamarche@google.com> | 2015-02-04 15:28:23 +0100 |
---|---|---|
committer | Benoit Lamarche <benoitlamarche@google.com> | 2015-02-10 11:28:26 +0100 |
commit | f254bff87d3fd9f92069e8c3226fd993adb5f53e (patch) | |
tree | b926ab1a38e982777327e56312f2c0d5c166d7c9 | |
parent | c53f4b0fda658b11aadcff42f34de5fd7cebf57b (diff) | |
download | toolchain_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.java | 41 |
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()); |