meituan/WMRouter

Compiler中Processor的Process 先排序后遍历

cocpublic opened this issue · 0 comments

public class PageAnnotationProcessor extends BaseProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
       ....
        for (Element element : env.getElementsAnnotatedWith(RouterPage.class)) {
    }
}

这段apt生成文件的逻辑中,env.getElementsAnnotatedWith(RouterPage.class)返回的set不能保证有序,而文件名中的md5是遍历的第一个元素生成的。

相同或微调的代码,在两次编译中,router生成的相关类可能差异较大,再做一些增量工作(例如Tinker 补丁包)时,会导致差异偏大。

目前做了一个简单的排序

public static Set<? extends Element> sort(Set<? extends Element> set) {
        TreeSet treeSet = new TreeSet<>(new Comparator<Element>() {
            @Override
            public int compare(Element o1, Element o2) {
                return o1.toString().compareTo(o2.toString());
            }
        });
        treeSet.addAll(set);

        return treeSet;
    }

auto组件中warning也有提到https://github.com/google/auto/blob/master/value/userguide/index.md#warnings