Bug 1428989 - Generate Android bindings more deterministically. r?nalexander
There are multiple methods with the same name and that differ in their
arguments. They end up being ordered in the source file randomly,
despite there being some sorting done, because the sorting was only done
on the method name.
Now, when the method name matches, also compare the arguments.
--- a/build/annotationProcessors/SDKProcessor.java
+++ b/build/annotationProcessors/SDKProcessor.java
@@ -328,17 +328,29 @@ public class SDKProcessor {
throw new IllegalArgumentException("expected member to be Method, Constructor, or Field");
}
}
private static Member[] sortAndFilterMembers(Class<?> cls, Member[] members) {
Arrays.sort(members, new Comparator<Member>() {
@Override
public int compare(Member a, Member b) {
- return a.getName().compareTo(b.getName());
+ int result = a.getName().compareTo(b.getName());
+ if (result == 0) {
+ if (a instanceof Constructor && b instanceof Constructor) {
+ String sa = Arrays.toString(((Constructor) a).getParameterTypes());
+ String sb = Arrays.toString(((Constructor) b).getParameterTypes());
+ result = sa.compareTo(sb);
+ } else if (a instanceof Method && b instanceof Method) {
+ String sa = Arrays.toString(((Method) a).getParameterTypes());
+ String sb = Arrays.toString(((Method) b).getParameterTypes());
+ result = sa.compareTo(sb);
+ }
+ }
+ return result;
}
});
ArrayList<Member> list = new ArrayList<>();
for (final Member m : members) {
if (m.getDeclaringClass() == Object.class) {
// Skip methods from Object.
continue;