List<PluginDescriptorCandidate> (final Module currentModule, List<? extends DomFileElement<IdeaPlugin>> elements) { ModuleGrouper grouper = ModuleGrouper.instanceFor(currentModule.getProject()); final List<String> groupPath = grouper.getGroupPath(currentModule); elements.sort((o1, o2) -> { // current module = first group final Module module1 = o1.getModule(); final Module module2 = o2.getModule(); if (!Comparing.equal(module1, module2)) { if (currentModule.equals(module1)) return -1; if (currentModule.equals(module2)) return 1; } if (module1 != null && module2 != null) { int groupComparison = Integer.compare(groupMatchLevel(groupPath, grouper.getGroupPath(module2)), groupMatchLevel(groupPath, grouper.getGroupPath(module1))); if (groupComparison != 0) { return groupComparison; } } return ModulesAlphaComparator.INSTANCE.compare(module1, module2); }); elements.sort((o1, o2) -> { if (!Comparing.equal(o1.getModule(), o2.getModule())) return 0; String pluginId1 = o1.getRootElement().getPluginId(); String pluginId2 = o2.getRootElement().getPluginId(); if (pluginId1 == null && pluginId2 == null) { return o1.getFile().getName().compareTo(o2.getFile().getName()); } if (pluginId1 == null) return 1; if (pluginId2 == null) return -1; return Comparing.compare(pluginId1, pluginId2); }); return ContainerUtil.map(elements, new Function<DomFileElement<IdeaPlugin>, PluginDescriptorCandidate>() { private Module myLastModule = currentModule; @Override public PluginDescriptorCandidate fun(DomFileElement<IdeaPlugin> element) { final Module module = element.getModule(); boolean startsNewGroup = !myLastModule.equals(module); myLastModule = module; return new PluginDescriptorCandidate(element, startsNewGroup); } }); }