org.eclipse.jdt.internal.core.dom.rewrite.imports.ImportComparator Maven / Gradle / Ivy
/*******************************************************************************
* 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 - 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:
*
* - configured import group order
* - package name and/or qualified name of containing type (lexicographically)
* - qualified name of import (lexicographically)
*
*/
final class ImportComparator implements Comparator {
private static Comparator createQualifiedNameComparator() {
return new Comparator() {
@Override
public int compare(ImportName o1, ImportName o2) {
return o1.qualifiedName.compareTo(o2.qualifiedName);
}
};
}
private final Comparator importGroupComparator;
private final Comparator typeContainerComparator;
private final Comparator staticContainerComparator;
private final Comparator qualifiedNameComparator;
ImportComparator(
ImportGroupComparator importGroupComparator,
Comparator typeContainerComparator,
Comparator 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 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;
}
}