/******************************************************************************* * Copyright (c) 2014 Google Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * John Glassmyer <jogl@google.com> - import group sorting is broken - https://bugs.eclipse.org/430303 *******************************************************************************/ package org.eclipse.jdt.internal.core.dom.rewrite.imports; import java.util.Comparator; /** * Sorts imports by, in order of decreasing precedence, the following: * <ul> * <li>configured import group order</li> * <li>package name and/or qualified name of containing type (lexicographically)</li> * <li>qualified name of import (lexicographically)</li> * </ul> */ final class ImportComparator implements Comparator<ImportName> { private static Comparator<ImportName> createQualifiedNameComparator() { return new Comparator<ImportName>() { @Override public int compare(ImportName o1, ImportName o2) { return o1.qualifiedName.compareTo(o2.qualifiedName); } }; } private final Comparator<ImportName> importGroupComparator; private final Comparator<ImportName> typeContainerComparator; private final Comparator<ImportName> staticContainerComparator; private final Comparator<ImportName> qualifiedNameComparator; ImportComparator( ImportGroupComparator importGroupComparator, Comparator<ImportName> typeContainerComparator, Comparator<ImportName> staticContainerComparator) { this.importGroupComparator = importGroupComparator; this.typeContainerComparator = typeContainerComparator; this.staticContainerComparator = staticContainerComparator; this.qualifiedNameComparator = createQualifiedNameComparator(); } @Override public int compare(ImportName o1, ImportName o2) { final int comparison; int importGroupComparison = this.importGroupComparator.compare(o1, o2); if (importGroupComparison != 0) { comparison = importGroupComparison; } else { // The two imports sorted into the same import group, so o2.isStatic == o1.isStatic. Comparator<ImportName> containerComparator = o1.isStatic ? this.staticContainerComparator : this.typeContainerComparator; int containerComparison = containerComparator.compare(o1, o2); if (containerComparison != 0) { comparison = containerComparison; } else { comparison = this.qualifiedNameComparator.compare(o1, o2); } } return comparison; } }