From 856c05b2a8066b170d81997f69c695c2e3fe3336 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 19 Mar 2012 21:52:36 +0400 Subject: [PATCH] KT-1426 Implement "Optimize Imports" in plugin - a slightly better formatting --- .../importOptimizer/JetImportOptimizer.java | 40 ++++++++++++++++++- .../formatter/JetFormattingModelBuilder.java | 7 +--- .../plugin/quickfix/ImportInsertHelper.java | 15 +++---- .../optimizeImports/AlreadyOptimized.kt | 6 +++ .../optimizeImports/AlreadyOptimized_after.kt | 7 +++- .../optimizeImports/SortImports_after.kt | 1 - 6 files changed, 58 insertions(+), 18 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java b/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java index 31049a9dac3..9adc238ec7f 100644 --- a/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java +++ b/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java @@ -83,7 +83,9 @@ public class JetImportOptimizer implements ImportOptimizer { // Remove imports List imports = jetFile.getImportDirectives(); 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 @@ -201,4 +203,40 @@ public class JetImportOptimizer implements ImportOptimizer { 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; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java index f67d6c5f6ca..daba83c28db 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java +++ b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java @@ -52,12 +52,9 @@ public class JetFormattingModelBuilder implements FormattingModelBuilder { return new SpacingBuilder(settings) // ============ Line breaks ============== .after(NAMESPACE_HEADER).blankLines(1) - .before(IMPORT_DIRECTIVE).lineBreakInCode() - .between(IMPORT_DIRECTIVE, CLASS).blankLines(1) - .between(IMPORT_DIRECTIVE, FUN).blankLines(1) - .between(IMPORT_DIRECTIVE, PROPERTY).blankLines(1) - .between(IMPORT_DIRECTIVE, OBJECT_DECLARATION).blankLines(1) + .between(IMPORT_DIRECTIVE, IMPORT_DIRECTIVE).lineBreakInCode() + .after(IMPORT_DIRECTIVE).blankLines(1) .before(FUN).lineBreakInCode() .before(PROPERTY).lineBreakInCode() diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java index 42f1f03c5a6..3d476bd6c44 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java @@ -20,7 +20,10 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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.FqName; import org.jetbrains.jet.lang.resolve.ImportPath; @@ -100,15 +103,7 @@ public class ImportInsertHelper { lastDirective.getParent().addAfter(newDirective, lastDirective); } else { - List declarations = file.getDeclarations(); - - if (!declarations.isEmpty()) { - JetDeclaration firstDeclaration = declarations.iterator().next(); - firstDeclaration.getParent().addBefore(newDirective, firstDeclaration); - } - else { - file.getNamespaceHeader().getParent().addAfter(newDirective, file.getNamespaceHeader()); - } + file.getNamespaceHeader().getParent().addAfter(newDirective, file.getNamespaceHeader()); } } diff --git a/idea/testData/editor/optimizeImports/AlreadyOptimized.kt b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt index e10c44d2b82..56e8778dabf 100644 --- a/idea/testData/editor/optimizeImports/AlreadyOptimized.kt +++ b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt @@ -1,3 +1,6 @@ +/** +Comment 1 +*/ package sometest @@ -6,6 +9,9 @@ import java.text.Annotation as TextAnnotation import java.util.ArrayList import java.util.HashSet +/** +Comment 2 +*/ class Action { fun test(hash : HashSet) { val some : TextAnnotation? = null diff --git a/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt b/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt index e10c44d2b82..e55e48c777f 100644 --- a/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt +++ b/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt @@ -1,11 +1,16 @@ +/** +Comment 1 +*/ package sometest - import java.io as JavaIO import java.text.Annotation as TextAnnotation import java.util.ArrayList import java.util.HashSet +/** +Comment 2 +*/ class Action { fun test(hash : HashSet) { val some : TextAnnotation? = null diff --git a/idea/testData/editor/optimizeImports/SortImports_after.kt b/idea/testData/editor/optimizeImports/SortImports_after.kt index eee9472d4ea..e3b3f5cf16a 100644 --- a/idea/testData/editor/optimizeImports/SortImports_after.kt +++ b/idea/testData/editor/optimizeImports/SortImports_after.kt @@ -1,6 +1,5 @@ package sometest - import java.util.ArrayList import java.util.HashSet