From ddb7b54eee4a43c3f033e2ebade06d366ce4d3f6 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 15 May 2013 14:03:17 +0400 Subject: [PATCH] KT-3620 Don't auto-import js.* and remove in `optimize imports` KT-3620 Fixed --- .../jet/util/QualifiedNamesUtil.java | 10 +++++ .../plugin/quickfix/ImportInsertHelper.java | 34 +++++++-------- .../handlers/DoNotInsertDefaultJsImports.kt | 6 +++ .../DoNotInsertDefaultJsImports.kt.after | 6 +++ .../optimizeImports/DefaultJsImports.kt | 8 ++++ .../optimizeImports/DefaultJsImports_after.kt | 6 +++ .../handlers/CompletionHandlerTest.java | 42 ++++++------------- .../JetLightCodeInsightFixtureTestCase.java | 7 +++- .../importOptimizer/OptimizeImportsTest.java | 9 ++-- 9 files changed, 76 insertions(+), 52 deletions(-) create mode 100644 idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt create mode 100644 idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt.after create mode 100644 idea/testData/editor/optimizeImports/DefaultJsImports.kt create mode 100644 idea/testData/editor/optimizeImports/DefaultJsImports_after.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/util/QualifiedNamesUtil.java b/compiler/frontend/src/org/jetbrains/jet/util/QualifiedNamesUtil.java index be00e670556..85384187dc5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/util/QualifiedNamesUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/util/QualifiedNamesUtil.java @@ -143,6 +143,16 @@ public final class QualifiedNamesUtil { return isImported(alreadyImported, newImport.fqnPart()); } + public static boolean isImported(@NotNull Iterable imports, @NotNull ImportPath newImport) { + for (ImportPath alreadyImported : imports) { + if (isImported(alreadyImported, newImport)) { + return true; + } + } + + return false; + } + public static boolean isValidJavaFqName(@Nullable String qualifiedName) { if (qualifiedName == null) return false; diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java index d78f4cbfca3..7f0e9c84c4a 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportInsertHelper.java @@ -37,9 +37,11 @@ import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.plugin.JetPluginUtil; +import org.jetbrains.jet.plugin.framework.KotlinFrameworkDetector; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.references.JetPsiReference; import org.jetbrains.jet.util.QualifiedNamesUtil; +import org.jetbrains.k2js.analyze.JsConfiguration; import java.util.List; @@ -145,7 +147,7 @@ public class ImportInsertHelper { /** * Check that import is useless. */ - private static boolean isImportedByDefault(@NotNull ImportPath importPath, @NotNull FqName filePackageFqn) { + private static boolean isImportedByDefault(@NotNull ImportPath importPath, @NotNull JetFile jetFile) { if (importPath.fqnPart().isRoot()) { return true; } @@ -157,33 +159,31 @@ public class ImportInsertHelper { } // There's no need to import a declaration from the package of current file - if (filePackageFqn.equals(importPath.fqnPart().parent())) { + if (JetPsiUtil.getFQName(jetFile).equals(importPath.fqnPart().parent())) { return true; } } if (isImportedWithKotlinDefault(importPath)) return true; - if (isImportedWithJavaDefault(importPath)) return true; - return false; + if (KotlinFrameworkDetector.isJsKotlinModule(jetFile)) { + return isImportedWithJsDefault(importPath); + } + else { + return isImportedWithJavaDefault(importPath); + } } public static boolean isImportedWithJavaDefault(ImportPath importPath) { - for (ImportPath defaultJavaImport : JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS) { - if (QualifiedNamesUtil.isImported(defaultJavaImport, importPath)) { - return true; - } - } - return false; + return QualifiedNamesUtil.isImported(JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS, importPath); + } + + public static boolean isImportedWithJsDefault(ImportPath importPath) { + return QualifiedNamesUtil.isImported(JsConfiguration.DEFAULT_IMPORT_PATHS, importPath); } public static boolean isImportedWithKotlinDefault(ImportPath importPath) { - for (ImportPath defaultJetImport : DefaultModuleConfiguration.DEFAULT_JET_IMPORTS) { - if (QualifiedNamesUtil.isImported(defaultJetImport, importPath)) { - return true; - } - } - return false; + return QualifiedNamesUtil.isImported(DefaultModuleConfiguration.DEFAULT_JET_IMPORTS, importPath); } public static boolean doNeedImport(@NotNull ImportPath importPath, @NotNull JetFile file) { @@ -196,7 +196,7 @@ public class ImportInsertHelper { importPath = new ImportPath(withoutJavaRoot, importPath.isAllUnder(), importPath.getAlias()); } - if (isImportedByDefault(importPath, JetPsiUtil.getFQName(file))) { + if (isImportedByDefault(importPath, file)) { return false; } diff --git a/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt b/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt new file mode 100644 index 00000000000..f3346bb9f4a --- /dev/null +++ b/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt @@ -0,0 +1,6 @@ +fun main(args: Array) { + println +} + +// For KT-3620: Don't auto-import js.* and remove in `optimize imports` +// JS \ No newline at end of file diff --git a/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt.after b/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt.after new file mode 100644 index 00000000000..b0281749b13 --- /dev/null +++ b/idea/testData/completion/handlers/DoNotInsertDefaultJsImports.kt.after @@ -0,0 +1,6 @@ +fun main(args: Array) { + println() +} + +// For KT-3620: Don't auto-import js.* and remove in `optimize imports` +// JS \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/DefaultJsImports.kt b/idea/testData/editor/optimizeImports/DefaultJsImports.kt new file mode 100644 index 00000000000..a6644787327 --- /dev/null +++ b/idea/testData/editor/optimizeImports/DefaultJsImports.kt @@ -0,0 +1,8 @@ +import js.Json + +fun main(args: Array) { + val a: Json? = null +} + +// For KT-3620 Don't auto-import js.* and remove in `optimize imports` +// JS \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/DefaultJsImports_after.kt b/idea/testData/editor/optimizeImports/DefaultJsImports_after.kt new file mode 100644 index 00000000000..d522ff63a54 --- /dev/null +++ b/idea/testData/editor/optimizeImports/DefaultJsImports_after.kt @@ -0,0 +1,6 @@ +fun main(args: Array) { + val a: Json? = null +} + +// For KT-3620 Don't auto-import js.* and remove in `optimize imports` +// JS \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java index 89b59e22f95..eb35e457f24 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java @@ -22,35 +22,19 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.codeInsight.lookup.LookupEvent; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; -import com.intellij.ide.startup.impl.StartupManagerImpl; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.startup.StartupManager; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; -import com.intellij.testFramework.LightProjectDescriptor; -import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import junit.framework.Assert; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.plugin.JetLightProjectDescriptor; +import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase; import org.jetbrains.jet.plugin.PluginTestCaseBase; import org.jetbrains.jet.plugin.formatter.JetCodeStyleSettings; import java.io.File; -public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { - @Override - protected void setUp() throws Exception { - super.setUp(); - ((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities(); - } - - @NotNull - @Override - protected LightProjectDescriptor getProjectDescriptor() { - return JetLightProjectDescriptor.INSTANCE; - } - +public class CompletionHandlerTest extends JetLightCodeInsightFixtureTestCase { public void testClassCompletionImport() { doTest(CompletionType.BASIC, 2, "SortedSet", null, '\n'); } @@ -59,6 +43,10 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { doTest(); } + public void testDoNotInsertDefaultJsImports() { + doTest(); + } + public void testDoNotInsertImportIfResolvedIntoJavaConstructor() { doTest(); } @@ -88,9 +76,9 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { } public void testSingleBrackets() { - myFixture.configureByFile(getBeforeFileName()); + myFixture.configureByFile(fileName()); myFixture.type('('); - myFixture.checkResultByFile(getAfterFileName()); + myFixture.checkResultByFile(afterFileName()); } public void testExistingSingleBrackets() { @@ -106,9 +94,9 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { } public void testInsertFunctionWithBothParentheses() { - myFixture.configureByFile(getBeforeFileName()); + myFixture.configureByFile(fileName()); myFixture.type("test()"); - myFixture.checkResultByFile(getAfterFileName()); + myFixture.checkResultByFile(afterFileName()); } public void testInsertImportOnTab() { @@ -144,7 +132,7 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { } public void doTest(CompletionType type, int time, @Nullable String lookupString, @Nullable String tailText, char completionChar) { - myFixture.configureByFile(getBeforeFileName()); + myFixture.configureByFile(fileName()); if (lookupString != null || tailText != null) { myFixture.complete(type, time); @@ -158,7 +146,7 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { forceCompleteFirst(type, time); } - myFixture.checkResultByFile(getAfterFileName()); + myFixture.checkResultByFile(afterFileName()); } @Nullable @@ -203,11 +191,7 @@ public class CompletionHandlerTest extends LightCodeInsightFixtureTestCase { return foundElement; } - protected String getBeforeFileName() { - return getTestName(false) + ".kt"; - } - - protected String getAfterFileName() { + protected String afterFileName() { return getTestName(false) + ".kt.after"; } diff --git a/idea/tests/org/jetbrains/jet/plugin/JetLightCodeInsightFixtureTestCase.java b/idea/tests/org/jetbrains/jet/plugin/JetLightCodeInsightFixtureTestCase.java index 985f7d91651..ae4309512ae 100644 --- a/idea/tests/org/jetbrains/jet/plugin/JetLightCodeInsightFixtureTestCase.java +++ b/idea/tests/org/jetbrains/jet/plugin/JetLightCodeInsightFixtureTestCase.java @@ -35,6 +35,9 @@ public abstract class JetLightCodeInsightFixtureTestCase extends LightCodeInsigh if (InTextDirectivesUtils.isDirectiveDefined(fileText, "RUNTIME")) { projectDescriptor = JetWithJdkAndRuntimeLightProjectDescriptor.INSTANCE; } + else if (InTextDirectivesUtils.isDirectiveDefined(fileText, "JS")) { + projectDescriptor = JetStdJSProjectDescriptor.INSTANCE; + } else { projectDescriptor = JetLightProjectDescriptor.INSTANCE; } @@ -56,5 +59,7 @@ public abstract class JetLightCodeInsightFixtureTestCase extends LightCodeInsigh return projectDescriptor; } - protected abstract String fileName(); + protected String fileName() { + return getTestName(false) + ".kt"; + } } diff --git a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java index b422671bc34..a84def047b5 100644 --- a/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/importOptimizer/OptimizeImportsTest.java @@ -29,6 +29,10 @@ public class OptimizeImportsTest extends JetLightCodeInsightFixtureTestCase { doTest(); } + public void testDefaultJsImports() throws Exception { + doTest(); + } + public void testRemoveImportsIfGeneral() throws Exception { doTest(); } @@ -85,11 +89,6 @@ public class OptimizeImportsTest extends JetLightCodeInsightFixtureTestCase { File.separator; } - @Override - public String fileName() { - return getTestName(false) + ".kt"; - } - public String checkFileName() { return getTestName(false) + "_after.kt"; }