From 7e1091a6af770f06f1e95493c0113b459494748a Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Mon, 3 Sep 2012 17:59:52 +0400 Subject: [PATCH] KT-1850 Fixed: Redundant imports are not removed when classes are used only by FQ name OptimizeImportsMultiFileTest added --- .../importOptimizer/JetImportOptimizer.java | 34 +++++++++++ .../optimizeImports/Kt1850FullQualified.kt | 7 +++ .../Kt1850FullQualified_after.kt | 1 + .../optimizeImports/Kt1850InnerClass.kt | 7 +++ .../optimizeImports/Kt1850InnerClass_after.kt | 4 ++ .../optimizeImports/PartiallyQualified.kt | 6 ++ .../PartiallyQualified_after.kt | 3 + .../KotlinPackage/KotlinPackage_after.kt | 3 + .../multifile/KotlinPackage/kotlinClass.kt | 4 ++ .../multifile/KotlinPackage/main.kt | 6 ++ .../OptimizeImportsMultiFileTest.java | 58 +++++++++++++++++++ .../importOptimizer/OptimizeImportsTest.java | 12 ++++ 12 files changed, 145 insertions(+) create mode 100644 idea/testData/editor/optimizeImports/Kt1850FullQualified.kt create mode 100644 idea/testData/editor/optimizeImports/Kt1850FullQualified_after.kt create mode 100644 idea/testData/editor/optimizeImports/Kt1850InnerClass.kt create mode 100644 idea/testData/editor/optimizeImports/Kt1850InnerClass_after.kt create mode 100644 idea/testData/editor/optimizeImports/PartiallyQualified.kt create mode 100644 idea/testData/editor/optimizeImports/PartiallyQualified_after.kt create mode 100644 idea/testData/editor/optimizeImports/multifile/KotlinPackage/KotlinPackage_after.kt create mode 100644 idea/testData/editor/optimizeImports/multifile/KotlinPackage/kotlinClass.kt create mode 100644 idea/testData/editor/optimizeImports/multifile/KotlinPackage/main.kt create mode 100644 idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsMultiFileTest.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 d4b27284f5e..864c9ab4d06 100644 --- a/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java +++ b/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java @@ -138,6 +138,20 @@ public class JetImportOptimizer implements ImportOptimizer { element.acceptChildren(this); } + @Override + public void visitUserType(JetUserType type) { + if (type.getQualifier() == null) { + super.visitUserType(type); + } + else { + JetTypeArgumentList argumentList = type.getTypeArgumentList(); + if (argumentList != null) { + super.visitTypeArgumentList(argumentList); + } + visitUserType(type.getQualifier()); + } + } + @Override public void visitReferenceExpression(JetReferenceExpression expression) { if (PsiTreeUtil.getParentOfType(expression, JetImportDirective.class) == null && @@ -179,6 +193,26 @@ public class JetImportOptimizer implements ImportOptimizer { if (element instanceof JetFile) { return JetPsiUtil.getFQName((JetFile) element); } + + if (element instanceof JetSimpleNameExpression) { + JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(element, JetNamespaceHeader.class); + if (namespaceHeader != null) { + List simpleNameExpressions = PsiTreeUtil.getChildrenOfTypeAsList(namespaceHeader, JetSimpleNameExpression.class); + FqName fqName = null; + for (JetSimpleNameExpression nameExpression : simpleNameExpressions) { + Name referencedName = nameExpression.getReferencedNameAsName(); + assert referencedName != null; + if (fqName == null) { + fqName = new FqName(referencedName.getName()); + } else { + fqName = QualifiedNamesUtil.combine(fqName, referencedName); + } + if (nameExpression.equals(element)) { + return fqName; + } + } + } + } if (element instanceof JetNamedDeclaration) { return JetPsiUtil.getFQName((JetNamedDeclaration) element); diff --git a/idea/testData/editor/optimizeImports/Kt1850FullQualified.kt b/idea/testData/editor/optimizeImports/Kt1850FullQualified.kt new file mode 100644 index 00000000000..5a2d735591d --- /dev/null +++ b/idea/testData/editor/optimizeImports/Kt1850FullQualified.kt @@ -0,0 +1,7 @@ +import java +import java.util +import java.util.Map +import java.util.List +import java.util.Map.Entry + +var x : java.util.Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/Kt1850FullQualified_after.kt b/idea/testData/editor/optimizeImports/Kt1850FullQualified_after.kt new file mode 100644 index 00000000000..443460c0c10 --- /dev/null +++ b/idea/testData/editor/optimizeImports/Kt1850FullQualified_after.kt @@ -0,0 +1 @@ +var x : java.util.Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/Kt1850InnerClass.kt b/idea/testData/editor/optimizeImports/Kt1850InnerClass.kt new file mode 100644 index 00000000000..a94ad861478 --- /dev/null +++ b/idea/testData/editor/optimizeImports/Kt1850InnerClass.kt @@ -0,0 +1,7 @@ +import java +import java.util +import java.util.Map +import java.util.List +import java.util.Map.Entry + +var x : Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/Kt1850InnerClass_after.kt b/idea/testData/editor/optimizeImports/Kt1850InnerClass_after.kt new file mode 100644 index 00000000000..1c703eb16ce --- /dev/null +++ b/idea/testData/editor/optimizeImports/Kt1850InnerClass_after.kt @@ -0,0 +1,4 @@ +import java.util.List +import java.util.Map + +var x : Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/PartiallyQualified.kt b/idea/testData/editor/optimizeImports/PartiallyQualified.kt new file mode 100644 index 00000000000..896cd41558b --- /dev/null +++ b/idea/testData/editor/optimizeImports/PartiallyQualified.kt @@ -0,0 +1,6 @@ +import java +import java.util +import java.util.Map +import java.util.Map.Entry + +var x : util.Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/PartiallyQualified_after.kt b/idea/testData/editor/optimizeImports/PartiallyQualified_after.kt new file mode 100644 index 00000000000..e6d7d1141f6 --- /dev/null +++ b/idea/testData/editor/optimizeImports/PartiallyQualified_after.kt @@ -0,0 +1,3 @@ +import java.util + +var x : util.Map.Entry, String>? = null diff --git a/idea/testData/editor/optimizeImports/multifile/KotlinPackage/KotlinPackage_after.kt b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/KotlinPackage_after.kt new file mode 100644 index 00000000000..cbff6301392 --- /dev/null +++ b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/KotlinPackage_after.kt @@ -0,0 +1,3 @@ +import test1.test2 + +val s: test2.test3.Class1? = null diff --git a/idea/testData/editor/optimizeImports/multifile/KotlinPackage/kotlinClass.kt b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/kotlinClass.kt new file mode 100644 index 00000000000..521e7bff181 --- /dev/null +++ b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/kotlinClass.kt @@ -0,0 +1,4 @@ +package test1.test2.test3 + +public class Class1 { +} diff --git a/idea/testData/editor/optimizeImports/multifile/KotlinPackage/main.kt b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/main.kt new file mode 100644 index 00000000000..86f2038c174 --- /dev/null +++ b/idea/testData/editor/optimizeImports/multifile/KotlinPackage/main.kt @@ -0,0 +1,6 @@ +import test1 +import test1.test2 +import test1.test2.test3 +import test1.test2.test3.Class1 + +val s: test2.test3.Class1? = null diff --git a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsMultiFileTest.java b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsMultiFileTest.java new file mode 100644 index 00000000000..cd110350735 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsMultiFileTest.java @@ -0,0 +1,58 @@ +/* + * 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.codeInsight.CodeInsightTestCase; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.command.UndoConfirmationPolicy; +import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.plugin.editor.importOptimizer.JetImportOptimizer; + +import java.io.File; + +/** + * @author Natalia Ukhorskaya + */ +public class OptimizeImportsMultiFileTest extends CodeInsightTestCase { + + public void testKotlinPackage() throws Exception { + doTest(getTestName(false) + "/main.kt", getTestName(false) + "/kotlinClass.kt"); + } + + public void doTest(String... fileNames) throws Exception { + configureByFiles(null, fileNames); + invokeFormatFile(); + checkResultByFile(checkFileName(), true); + } + + public String checkFileName() { + return getTestName(false) + "/" + getTestName(false) + "_after.kt"; + } + + @Override + protected String getTestDataPath() { + return new File(PluginTestCaseBase.getTestDataPathBase(), "/editor/optimizeImports/multifile").getPath() + + File.separator; + } + + private void invokeFormatFile() { + CommandProcessor.getInstance().executeCommand( + getProject(), new JetImportOptimizer().processFile(getFile()), + "Optimize Imports", null, UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION); + } + +} diff --git a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java index c36c4a3c647..40df0fc30fc 100644 --- a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java @@ -56,6 +56,18 @@ public class OptimizeImportsTest extends LightCodeInsightTestCase { doTest(); } + public void testKt1850FullQualified() throws Exception { + doTest(); + } + + public void testKt1850InnerClass() throws Exception { + doTest(); + } + + public void testPartiallyQualified() throws Exception { + doTest(); + } + public void doTest() throws Exception { configureByFile(fileName()); invokeFormatFile();