From fda2bc25dce9a451b3937405590ac05e00934533 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 16 Mar 2012 19:41:44 +0400 Subject: [PATCH] KT-1426 Implement "Optimize Imports" in plugin - tests and small fix for aliases. --- .../importOptimizer/JetImportOptimizer.java | 1 - .../formatter/JetFormattingModelBuilder.java | 4 +- .../plugin/quickfix/ImportInsertHelper.java | 8 +- .../optimizeImports/AlreadyOptimized.kt | 15 +++ .../optimizeImports/AlreadyOptimized_after.kt | 15 +++ .../optimizeImports/RemoveImportsIfGeneral.kt | 9 ++ .../RemoveImportsIfGeneral_after.kt | 7 ++ .../editor/optimizeImports/SortImports.kt | 10 ++ .../optimizeImports/SortImports_after.kt | 11 ++ .../editor/optimizeImports/UnusedImports.kt | 13 +++ .../optimizeImports/UnusedImports_after.kt | 9 ++ .../editor/optimizeImports/WithAliases.kt | 10 ++ .../optimizeImports/WithAliases_after.kt | 9 ++ .../formatter/AbstractJetFormatterTest.java | 16 --- .../importOptimizer/OptimizeImportsTest.java | 105 ++++++++++++++++++ 15 files changed, 219 insertions(+), 23 deletions(-) create mode 100644 idea/testData/editor/optimizeImports/AlreadyOptimized.kt create mode 100644 idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt create mode 100644 idea/testData/editor/optimizeImports/RemoveImportsIfGeneral.kt create mode 100644 idea/testData/editor/optimizeImports/RemoveImportsIfGeneral_after.kt create mode 100644 idea/testData/editor/optimizeImports/SortImports.kt create mode 100644 idea/testData/editor/optimizeImports/SortImports_after.kt create mode 100644 idea/testData/editor/optimizeImports/UnusedImports.kt create mode 100644 idea/testData/editor/optimizeImports/UnusedImports_after.kt create mode 100644 idea/testData/editor/optimizeImports/WithAliases.kt create mode 100644 idea/testData/editor/optimizeImports/WithAliases_after.kt create mode 100644 idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java 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 b06b7597db3..f3d55253980 100644 --- a/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java +++ b/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java @@ -119,7 +119,6 @@ public class JetImportOptimizer implements ImportOptimizer { } public static Set extractUsedQualifiedNames(JetFile jetFile) { - final Set usedQualifiedNames = new HashSet(); jetFile.accept(new JetVisitorVoid() { @Override diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java index 46ddd2835a2..f67d6c5f6ca 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java +++ b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java @@ -52,8 +52,8 @@ 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) @@ -77,7 +77,7 @@ public class JetFormattingModelBuilder implements FormattingModelBuilder { .around(TokenSet.create(EQEQ, EXCLEQ, EQEQEQ, EXCLEQEQEQ)).spaceIf(jetCommonSettings.SPACE_AROUND_EQUALITY_OPERATORS) .aroundInside(TokenSet.create(LT, GT, LTEQ, GTEQ), BINARY_EXPRESSION).spaceIf(jetCommonSettings.SPACE_AROUND_RELATIONAL_OPERATORS) .around(TokenSet.create(PLUS, MINUS)).spaceIf(jetCommonSettings.SPACE_AROUND_ADDITIVE_OPERATORS) - .around(TokenSet.create(MUL, DIV, PERC)).spaceIf(jetCommonSettings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS) + .aroundInside(TokenSet.create(MUL, DIV, PERC), BINARY_EXPRESSION).spaceIf(jetCommonSettings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS) .around(TokenSet.create(PLUSPLUS, MINUSMINUS, MINUS, PLUS, EXCL)).spaceIf(jetCommonSettings.SPACE_AROUND_UNARY_OPERATOR) .around(RANGE).spaceIf(jetSettings.SPACE_AROUND_RANGE) diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java index 5663e88c382..42f1f03c5a6 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java @@ -89,10 +89,10 @@ public class ImportInsertHelper { // Check if import is already present for (JetImportDirective directive : importDirectives) { ImportPath existentImportPath = JetPsiUtil.getImportPath(directive); - if (existentImportPath != null && - directive.getAliasName() == null && - QualifiedNamesUtil.isImported(existentImportPath, importPath)) { - return; + if (directive.getAliasName() == null && aliasName == null) { + if (existentImportPath != null && QualifiedNamesUtil.isImported(existentImportPath, importPath)) { + return; + } } } diff --git a/idea/testData/editor/optimizeImports/AlreadyOptimized.kt b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt new file mode 100644 index 00000000000..e10c44d2b82 --- /dev/null +++ b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt @@ -0,0 +1,15 @@ +package sometest + + +import java.io as JavaIO +import java.text.Annotation as TextAnnotation +import java.util.ArrayList +import java.util.HashSet + +class Action { + fun test(hash : HashSet) { + val some : TextAnnotation? = null + val test : ArrayList? = null + JavaIO.File(StringBuilder().append("Hello").toString()) + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt b/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt new file mode 100644 index 00000000000..e10c44d2b82 --- /dev/null +++ b/idea/testData/editor/optimizeImports/AlreadyOptimized_after.kt @@ -0,0 +1,15 @@ +package sometest + + +import java.io as JavaIO +import java.text.Annotation as TextAnnotation +import java.util.ArrayList +import java.util.HashSet + +class Action { + fun test(hash : HashSet) { + val some : TextAnnotation? = null + val test : ArrayList? = null + JavaIO.File(StringBuilder().append("Hello").toString()) + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral.kt b/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral.kt new file mode 100644 index 00000000000..fb111c1c82d --- /dev/null +++ b/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral.kt @@ -0,0 +1,9 @@ +import java.util.HashSet +import java.util.ArrayList +import java.util.* + +class Action { + fun test(hash: HashSet) { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral_after.kt b/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral_after.kt new file mode 100644 index 00000000000..02236aad175 --- /dev/null +++ b/idea/testData/editor/optimizeImports/RemoveImportsIfGeneral_after.kt @@ -0,0 +1,7 @@ +import java.util.* + +class Action { + fun test(hash: HashSet) { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/SortImports.kt b/idea/testData/editor/optimizeImports/SortImports.kt new file mode 100644 index 00000000000..e59b4eec770 --- /dev/null +++ b/idea/testData/editor/optimizeImports/SortImports.kt @@ -0,0 +1,10 @@ +package sometest + +import java.util.HashSet +import java.util.ArrayList + +class Action { + fun test(hash: HashSet) { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/SortImports_after.kt b/idea/testData/editor/optimizeImports/SortImports_after.kt new file mode 100644 index 00000000000..eee9472d4ea --- /dev/null +++ b/idea/testData/editor/optimizeImports/SortImports_after.kt @@ -0,0 +1,11 @@ +package sometest + + +import java.util.ArrayList +import java.util.HashSet + +class Action { + fun test(hash: HashSet) { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/UnusedImports.kt b/idea/testData/editor/optimizeImports/UnusedImports.kt new file mode 100644 index 00000000000..1a073f5d448 --- /dev/null +++ b/idea/testData/editor/optimizeImports/UnusedImports.kt @@ -0,0 +1,13 @@ +import com.sun.corba.se.impl.util.JDKBridge +import com.sun.org.apache.xpath.internal.operations.And +import java.lang.StringBuilder +import java.net.HttpRetryException +import java.util.ArrayList +import kotlin.util.measureTimeMillis + +class Action { + fun test() { + measureTimeMillis({ println("Some")}) + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/UnusedImports_after.kt b/idea/testData/editor/optimizeImports/UnusedImports_after.kt new file mode 100644 index 00000000000..0287773ec7d --- /dev/null +++ b/idea/testData/editor/optimizeImports/UnusedImports_after.kt @@ -0,0 +1,9 @@ +import java.util.ArrayList +import kotlin.util.measureTimeMillis + +class Action { + fun test() { + measureTimeMillis({ println("Some")}) + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/WithAliases.kt b/idea/testData/editor/optimizeImports/WithAliases.kt new file mode 100644 index 00000000000..5a40a3b86c3 --- /dev/null +++ b/idea/testData/editor/optimizeImports/WithAliases.kt @@ -0,0 +1,10 @@ +import java.util.ArrayList +import java.util.ArrayList as SomeThing +import java.io as JavaIO +import java.io.* + +class Action { + fun test() { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/WithAliases_after.kt b/idea/testData/editor/optimizeImports/WithAliases_after.kt new file mode 100644 index 00000000000..d8959d1aba3 --- /dev/null +++ b/idea/testData/editor/optimizeImports/WithAliases_after.kt @@ -0,0 +1,9 @@ +import java.io as JavaIO +import java.util.ArrayList +import java.util.ArrayList as SomeThing + +class Action { + fun test() { + val test : ArrayList? = null + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/formatter/AbstractJetFormatterTest.java b/idea/tests/org/jetbrains/jet/formatter/AbstractJetFormatterTest.java index d651c0bea40..fb17dd563b9 100644 --- a/idea/tests/org/jetbrains/jet/formatter/AbstractJetFormatterTest.java +++ b/idea/tests/org/jetbrains/jet/formatter/AbstractJetFormatterTest.java @@ -146,22 +146,6 @@ public abstract class AbstractJetFormatterTest extends LightIdeaTestCase { } -// public void doMethodTest(@NonNls final String before, @NonNls final String after) throws Exception { -// doTextTest( -// Action.REFORMAT, -// "class Foo{\n" + " void foo() {\n" + before + '\n' + " }\n" + "}", -// "class Foo {\n" + " void foo() {\n" + StringUtil.shiftIndentInside(after, 8, false) + '\n' + " }\n" + "}" -// ); -// } -// -// public void doClassTest(@NonNls final String before, @NonNls final String after) throws Exception { -// doTextTest( -// Action.REFORMAT, -// "class Foo{\n" + before + '\n' + "}", -// "class Foo {\n" + StringUtil.shiftIndentInside(after, 4, false) + '\n' + "}" -// ); -// } - private static String prepareText(String actual) { if (actual.startsWith("\n")) { actual = actual.substring(1); diff --git a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java new file mode 100644 index 00000000000..2e4b3298d6d --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java @@ -0,0 +1,105 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.importOptimizer; + +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.command.UndoConfirmationPolicy; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.testFramework.LightCodeInsightTestCase; +import org.apache.commons.lang.SystemUtils; +import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.plugin.editor.importOptimizer.JetImportOptimizer; +import org.jetbrains.jet.testing.ConfigRuntimeUtil; + +import java.io.File; + +/** + * @author Nikolay Krasko + */ +public class OptimizeImportsTest extends LightCodeInsightTestCase { + + public void testAlreadyOptimized() throws Exception { + doTest(); + } + + public void testRemoveImportsIfGeneral() throws Exception { + doTest(); + } + + public void testSortImports() throws Exception { + doTest(); + } + + public void testUnusedImports() throws Exception { + doTestWithKotlinRuntime(); + } + + public void testWithAliases() throws Exception { + doTest(); + } + + public void doTest() throws Exception { + configureByFile(fileName()); + invokeFormatFile(); + checkResultByFile(null, checkFileName(), true); + } + + public void doTestWithKotlinRuntime() { + try { + ConfigRuntimeUtil.configureKotlinRuntime(getModule(), getFullJavaJDK()); + + configureByFile(fileName()); + invokeFormatFile(); + + checkResultByFile(null, checkFileName(), false); + } + finally { + ConfigRuntimeUtil.unConfigureKotlinRuntime(getModule(), getProjectJDK()); + } + } + + @Override + protected String getTestDataPath() { + return new File(PluginTestCaseBase.getTestDataPathBase(), "/editor/optimizeImports").getPath() + + File.separator; + } + + @Override + protected Sdk getProjectJDK() { + return PluginTestCaseBase.jdkFromIdeaHome(); + } + + protected static Sdk getFullJavaJDK() { + return JavaSdk.getInstance().createJdk("JDK", SystemUtils.getJavaHome().getAbsolutePath()); + } + + public String fileName() { + return getTestName(false) + ".kt"; + } + + public String checkFileName() { + return getTestName(false) + "_after.kt"; + } + + private static void invokeFormatFile() { + CommandProcessor.getInstance().executeCommand( + getProject(), new JetImportOptimizer().processFile(getFile()), + "Optimize Imports", null, UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION); + } + +} \ No newline at end of file