KT-1426 Implement "Optimize Imports" in plugin - tests and small fix for aliases.

This commit is contained in:
Nikolay Krasko
2012-03-16 19:41:44 +04:00
parent 76cc231cb2
commit fda2bc25dc
15 changed files with 219 additions and 23 deletions
@@ -119,7 +119,6 @@ public class JetImportOptimizer implements ImportOptimizer {
}
public static Set<FqName> extractUsedQualifiedNames(JetFile jetFile) {
final Set<FqName> usedQualifiedNames = new HashSet<FqName>();
jetFile.accept(new JetVisitorVoid() {
@Override
@@ -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)
@@ -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;
}
}
}
@@ -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<Int>) {
val some : TextAnnotation? = null
val test : ArrayList<Int>? = null
JavaIO.File(StringBuilder().append("Hello").toString())
}
}
@@ -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<Int>) {
val some : TextAnnotation? = null
val test : ArrayList<Int>? = null
JavaIO.File(StringBuilder().append("Hello").toString())
}
}
@@ -0,0 +1,9 @@
import java.util.HashSet
import java.util.ArrayList
import java.util.*
class Action {
fun test(hash: HashSet<Int>) {
val test : ArrayList<Int>? = null
}
}
@@ -0,0 +1,7 @@
import java.util.*
class Action {
fun test(hash: HashSet<Int>) {
val test : ArrayList<Int>? = null
}
}
@@ -0,0 +1,10 @@
package sometest
import java.util.HashSet
import java.util.ArrayList
class Action {
fun test(hash: HashSet<Int>) {
val test : ArrayList<Int>? = null
}
}
@@ -0,0 +1,11 @@
package sometest
import java.util.ArrayList
import java.util.HashSet
class Action {
fun test(hash: HashSet<Int>) {
val test : ArrayList<Int>? = null
}
}
@@ -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<Int>? = null
}
}
@@ -0,0 +1,9 @@
import java.util.ArrayList
import kotlin.util.measureTimeMillis
class Action {
fun test() {
measureTimeMillis({ println("Some")})
val test : ArrayList<Int>? = null
}
}
@@ -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<Int>? = null
}
}
@@ -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<Int>? = null
}
}
@@ -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);
@@ -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);
}
}