KT-1426 Implement "Optimize Imports" in plugin - a slightly better formatting

This commit is contained in:
Nikolay Krasko
2012-03-19 21:52:36 +04:00
parent 1c408cdbda
commit 856c05b2a8
6 changed files with 58 additions and 18 deletions
@@ -83,7 +83,9 @@ public class JetImportOptimizer implements ImportOptimizer {
// Remove imports // Remove imports
List<JetImportDirective> imports = jetFile.getImportDirectives(); List<JetImportDirective> imports = jetFile.getImportDirectives();
if (!imports.isEmpty()) { if (!imports.isEmpty()) {
jetFile.deleteChildRange(imports.get(0), imports.get(imports.size() - 1)); jetFile.deleteChildRange(
getWithPreviousWhitespaces(imports.get(0)),
getWithFollowedWhitespaces(imports.get(imports.size() - 1)));
} }
// Insert back only necessary imports in correct order // Insert back only necessary imports in correct order
@@ -201,4 +203,40 @@ public class JetImportOptimizer implements ImportOptimizer {
return null; return null;
} }
private static PsiElement getWithPreviousWhitespaces(PsiElement element) {
PsiElement result = element;
PsiElement siblingIterator = element.getPrevSibling();
while (siblingIterator != null) {
if (siblingIterator.getNode().getElementType() != TokenType.WHITE_SPACE) {
break;
}
else {
result = siblingIterator;
}
siblingIterator = siblingIterator.getPrevSibling();
}
return result;
}
private static PsiElement getWithFollowedWhitespaces(PsiElement element) {
PsiElement result = element;
PsiElement siblingIterator = element.getNextSibling();
while (siblingIterator != null) {
if (siblingIterator.getNode().getElementType() != TokenType.WHITE_SPACE) {
break;
}
else {
result = siblingIterator;
}
siblingIterator = siblingIterator.getNextSibling();
}
return result;
}
} }
@@ -52,12 +52,9 @@ public class JetFormattingModelBuilder implements FormattingModelBuilder {
return new SpacingBuilder(settings) return new SpacingBuilder(settings)
// ============ Line breaks ============== // ============ Line breaks ==============
.after(NAMESPACE_HEADER).blankLines(1) .after(NAMESPACE_HEADER).blankLines(1)
.before(IMPORT_DIRECTIVE).lineBreakInCode()
.between(IMPORT_DIRECTIVE, CLASS).blankLines(1) .between(IMPORT_DIRECTIVE, IMPORT_DIRECTIVE).lineBreakInCode()
.between(IMPORT_DIRECTIVE, FUN).blankLines(1) .after(IMPORT_DIRECTIVE).blankLines(1)
.between(IMPORT_DIRECTIVE, PROPERTY).blankLines(1)
.between(IMPORT_DIRECTIVE, OBJECT_DECLARATION).blankLines(1)
.before(FUN).lineBreakInCode() .before(FUN).lineBreakInCode()
.before(PROPERTY).lineBreakInCode() .before(PROPERTY).lineBreakInCode()
@@ -20,7 +20,10 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.DefaultModuleConfiguration;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
@@ -100,15 +103,7 @@ public class ImportInsertHelper {
lastDirective.getParent().addAfter(newDirective, lastDirective); lastDirective.getParent().addAfter(newDirective, lastDirective);
} }
else { else {
List<JetDeclaration> declarations = file.getDeclarations(); file.getNamespaceHeader().getParent().addAfter(newDirective, file.getNamespaceHeader());
if (!declarations.isEmpty()) {
JetDeclaration firstDeclaration = declarations.iterator().next();
firstDeclaration.getParent().addBefore(newDirective, firstDeclaration);
}
else {
file.getNamespaceHeader().getParent().addAfter(newDirective, file.getNamespaceHeader());
}
} }
} }
@@ -1,3 +1,6 @@
/**
Comment 1
*/
package sometest package sometest
@@ -6,6 +9,9 @@ import java.text.Annotation as TextAnnotation
import java.util.ArrayList import java.util.ArrayList
import java.util.HashSet import java.util.HashSet
/**
Comment 2
*/
class Action { class Action {
fun test(hash : HashSet<Int>) { fun test(hash : HashSet<Int>) {
val some : TextAnnotation? = null val some : TextAnnotation? = null
@@ -1,11 +1,16 @@
/**
Comment 1
*/
package sometest package sometest
import java.io as JavaIO import java.io as JavaIO
import java.text.Annotation as TextAnnotation import java.text.Annotation as TextAnnotation
import java.util.ArrayList import java.util.ArrayList
import java.util.HashSet import java.util.HashSet
/**
Comment 2
*/
class Action { class Action {
fun test(hash : HashSet<Int>) { fun test(hash : HashSet<Int>) {
val some : TextAnnotation? = null val some : TextAnnotation? = null
@@ -1,6 +1,5 @@
package sometest package sometest
import java.util.ArrayList import java.util.ArrayList
import java.util.HashSet import java.util.HashSet