package krasa.formatter.plugin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import krasa.formatter.settings.Settings;
import krasa.formatter.utils.StringUtils;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.psi.*;
/**
* @author Vojtech Krasa
*/
public class ImportSorterAdapter {
public static final String N = Settings.LINE_SEPARATOR;
private Settings.ImportOrdering importOrdering;
private List<String> importsOrder;
public ImportSorterAdapter(Settings.ImportOrdering importOrdering, List<String> importsOrder) {
this.importOrdering = importOrdering;
this.importsOrder = new ArrayList<String>(importsOrder);
}
public String getImportsOrderAsString() {
return Arrays.toString(importsOrder.toArray());
}
public void sortImports(PsiJavaFile file) {
List<String> imports = new ArrayList<String>();
List<PsiElement> nonImports = new ArrayList<PsiElement>();
PsiImportList importList = file.getImportList();
if (importList == null) {
return;
}
PsiElement[] children = importList.getChildren();
for (int i = 0; i < children.length; i++) {
PsiElement child = children[i];
if (child instanceof PsiImportStatementBase) {
imports.add(child.getText());
} else if (!(child instanceof PsiWhiteSpace)) { //todo wild guess
nonImports.add(child);
}
}
List<String> sort = getImportsSorter(file).sort(StringUtils.trimImports(imports));
StringBuilder text = new StringBuilder();
for (int i = 0; i < sort.size(); i++) {
text.append(sort.get(i));
}
for (int i = 0; i < nonImports.size(); i++) {
PsiElement psiElement = nonImports.get(i);
text.append("\n").append(psiElement.getText());
}
PsiFileFactory factory = PsiFileFactory.getInstance(file.getProject());
String ext = StdFileTypes.JAVA.getDefaultExtension();
final PsiJavaFile dummyFile = (PsiJavaFile) factory.createFileFromText("_Dummy_." + ext, StdFileTypes.JAVA,
text);
PsiImportList newImportList = dummyFile.getImportList();
PsiImportList result = (PsiImportList) newImportList.copy();
PsiImportList oldList = file.getImportList();
if (oldList.isReplaceEquivalent(result))
return;
if (!nonImports.isEmpty()) {
PsiElement firstPrevious = newImportList.getPrevSibling();
while (firstPrevious != null && firstPrevious.getPrevSibling() != null) {
firstPrevious = firstPrevious.getPrevSibling();
}
for (PsiElement element = firstPrevious;
element != null && element != newImportList; element = element.getNextSibling()) {
result.add(element.copy());
}
for (PsiElement element = newImportList.getNextSibling();
element != null; element = element.getNextSibling()) {
result.add(element.copy());
}
}
importList.replace(result);
}
@NotNull
private ImportsSorter getImportsSorter(PsiJavaFile file) {
switch (importOrdering) {
case ECLIPSE_44:
return new ImportsSorter450(importsOrder);
case ECLIPSE_452:
return new ImportsSorter452(importsOrder, new ImportsComparator(file.getProject()));
}
throw new RuntimeException(String.valueOf(importOrdering));
}
}