From 796dad5798f214e89e552221677537c2347e0ce2 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Fri, 18 Oct 2013 15:09:43 +0400 Subject: [PATCH] Do not expand imports after optimizing --- .../importOptimizer/JetImportOptimizer.java | 22 +---- .../optimizeImports/AlreadyOptimized.kt | 1 - .../onFly/OptimizeImportsOnFly.kt.after | 2 +- .../foldingAfterOptimizeImports.kt | 12 +++ .../folding/AbstractKotlinFoldingTest.java | 67 +++++++++------ .../FoldingAfterOptimizeImportsTest.kt | 83 +++++++++++++++++++ 6 files changed, 142 insertions(+), 45 deletions(-) create mode 100644 idea/testData/folding/afterOptimizeImports/foldingAfterOptimizeImports.kt create mode 100644 idea/tests/org/jetbrains/jet/plugin/folding/FoldingAfterOptimizeImportsTest.kt 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 23a88befa92..547b99d3f77 100644 --- a/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java +++ b/idea/src/org/jetbrains/jet/plugin/editor/importOptimizer/JetImportOptimizer.java @@ -67,23 +67,7 @@ public class JetImportOptimizer implements ImportOptimizer { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { - // Remove imports - List imports = jetFile.getImportDirectives(); - if (!imports.isEmpty()) { - PsiElement firstForDelete = getWithPreviousWhitespaces(imports.get(0)); - PsiElement lastForDelete = getWithFollowedWhitespaces(imports.get(imports.size() - 1)); - - // Should be found before deletion - PsiElement elementBeforeImports = firstForDelete.getPrevSibling(); - - jetFile.deleteChildRange(firstForDelete, lastForDelete); - - if (elementBeforeImports != null) { - jetFile.addAfter(JetPsiFactory.createNewLine(jetFile.getProject()), elementBeforeImports); - } - } - - // Insert back only necessary imports in correct order + // Remove only unnecessary imports for (JetImportDirective anImport : directives) { directivesAfterCurrent.remove(anImport); @@ -95,9 +79,11 @@ public class JetImportOptimizer implements ImportOptimizer { if (isUseful(importPath, usedQualifiedNames) && doNeedImport(importPath, jetFile, directivesBeforeCurrent) && doNeedImport(importPath, jetFile, directivesAfterCurrent)) { - ImportInsertHelper.writeImportToFile(importPath, jetFile); directivesBeforeCurrent.add(anImport); } + else { + anImport.delete(); + } } } }); diff --git a/idea/testData/editor/optimizeImports/AlreadyOptimized.kt b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt index 56e8778dabf..e55e48c777f 100644 --- a/idea/testData/editor/optimizeImports/AlreadyOptimized.kt +++ b/idea/testData/editor/optimizeImports/AlreadyOptimized.kt @@ -3,7 +3,6 @@ Comment 1 */ package sometest - import java.io as JavaIO import java.text.Annotation as TextAnnotation import java.util.ArrayList diff --git a/idea/testData/editor/optimizeImports/onFly/OptimizeImportsOnFly.kt.after b/idea/testData/editor/optimizeImports/onFly/OptimizeImportsOnFly.kt.after index e4931c7e313..dbaefd21df0 100644 --- a/idea/testData/editor/optimizeImports/onFly/OptimizeImportsOnFly.kt.after +++ b/idea/testData/editor/optimizeImports/onFly/OptimizeImportsOnFly.kt.after @@ -1 +1 @@ -import java.util.HashSet +import java.util.HashSet \ No newline at end of file diff --git a/idea/testData/folding/afterOptimizeImports/foldingAfterOptimizeImports.kt b/idea/testData/folding/afterOptimizeImports/foldingAfterOptimizeImports.kt new file mode 100644 index 00000000000..2873b9ad9c3 --- /dev/null +++ b/idea/testData/folding/afterOptimizeImports/foldingAfterOptimizeImports.kt @@ -0,0 +1,12 @@ +package sometest + +import java.util.HashSet +import java.util.HashMap +import java.util.ArrayList + +val some: HashSet? = null +val some2: HashMap? = null + +// SET_TRUE: setCollapseImports +// REGION BEFORE: 25:94 +// REGION AFTER: 25:67 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/folding/AbstractKotlinFoldingTest.java b/idea/tests/org/jetbrains/jet/plugin/folding/AbstractKotlinFoldingTest.java index 9af2be9017d..7c3a4b0a665 100644 --- a/idea/tests/org/jetbrains/jet/plugin/folding/AbstractKotlinFoldingTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/folding/AbstractKotlinFoldingTest.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.plugin.folding; +import com.google.common.base.Function; import com.intellij.codeInsight.folding.JavaCodeFoldingSettings; import com.intellij.codeInsight.folding.impl.JavaCodeFoldingSettingsImpl; import com.intellij.openapi.editor.FoldRegion; @@ -30,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.testing.SettingsConfigurator; +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; @@ -48,37 +50,50 @@ public abstract class AbstractKotlinFoldingTest extends LightCodeInsightFixtureT throw new RuntimeException(e); } + String directText = fileText.replaceAll("~true~", "true").replaceAll("~false~", "false"); + directText += "\n\n// Generated from: " + path; + + Function doExpandSettingsTestFunction = new Function() { + @Nullable + @Override + public Void apply(@Nullable String fileText) { + doExpandSettingsTest(fileText); + return null; + } + }; + + doTestWithSettings(directText, doExpandSettingsTestFunction); + + // Clean all regions in model to force IDEA treat all regions as new ones + cleanAllFoldedRegions(); + + String invertedText = fileText + .replaceAll("~false~", "true").replaceAll("~true~", "false") + .replaceAll(SettingsConfigurator.SET_TRUE_DIRECTIVE, "~TEMP_TRUE_DIRECTIVE~") + .replaceAll(SettingsConfigurator.SET_FALSE_DIRECTIVE, SettingsConfigurator.SET_TRUE_DIRECTIVE) + .replaceAll("~TEMP_TRUE_DIRECTIVE~", SettingsConfigurator.SET_FALSE_DIRECTIVE); + invertedText += "\n\n// Generated from: " + path + " with !INVERTED! settings"; + + doTestWithSettings(invertedText, doExpandSettingsTestFunction); + } + + protected static void doTestWithSettings(@NotNull String fileText, @NotNull Function runnable) { JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance(); JavaCodeFoldingSettingsImpl restoreSettings = new JavaCodeFoldingSettingsImpl(); restoreSettings.loadState((JavaCodeFoldingSettingsImpl) settings); try { - String directText = fileText.replaceAll("~true~", "true").replaceAll("~false~", "false"); - directText += "\n\n// Generated from: " + path; + SettingsConfigurator configurator = new SettingsConfigurator(fileText, settings); + configurator.configureSettings(); - doExpandSettingsTest(directText, settings); - - // Clean all regions in model to force IDEA treat all regions as new ones - cleanAllFoldedRegions(); - - String invertedText = fileText - .replaceAll("~false~", "true").replaceAll("~true~", "false") - .replaceAll(SettingsConfigurator.SET_TRUE_DIRECTIVE, "~TEMP_TRUE_DIRECTIVE~") - .replaceAll(SettingsConfigurator.SET_FALSE_DIRECTIVE, SettingsConfigurator.SET_TRUE_DIRECTIVE) - .replaceAll("~TEMP_TRUE_DIRECTIVE~", SettingsConfigurator.SET_FALSE_DIRECTIVE); - invertedText += "\n\n// Generated from: " + path + " with !INVERTED! settings"; - - doExpandSettingsTest(invertedText, settings); - } - catch (IOException e) { - throw new IllegalStateException(e); + runnable.apply(fileText); } finally { ((JavaCodeFoldingSettingsImpl) JavaCodeFoldingSettings.getInstance()).loadState(restoreSettings); } } - private void cleanAllFoldedRegions() { + protected void cleanAllFoldedRegions() { final FoldingModelEx model = (FoldingModelEx) myFixture.getEditor().getFoldingModel(); Runnable runnable = new Runnable() { @Override @@ -91,12 +106,14 @@ public abstract class AbstractKotlinFoldingTest extends LightCodeInsightFixtureT model.runBatchFoldingOperation(runnable); } - private void doExpandSettingsTest(String fileText, JavaCodeFoldingSettings settings) throws IOException { - SettingsConfigurator configurator = new SettingsConfigurator(fileText, settings); - configurator.configureSettings(); - - VirtualFile tempFile = PlatformTestCase.createTempFile("kt", null, fileText, Charset.defaultCharset()); - myFixture.testFoldingWithCollapseStatus(tempFile.getPath()); + private void doExpandSettingsTest(String fileText) { + try { + VirtualFile tempFile = PlatformTestCase.createTempFile("kt", null, fileText, Charset.defaultCharset()); + myFixture.testFoldingWithCollapseStatus(tempFile.getPath()); + } + catch (IOException e) { + throw new IllegalStateException(e); + } } @NotNull diff --git a/idea/tests/org/jetbrains/jet/plugin/folding/FoldingAfterOptimizeImportsTest.kt b/idea/tests/org/jetbrains/jet/plugin/folding/FoldingAfterOptimizeImportsTest.kt new file mode 100644 index 00000000000..1c33d0a0a83 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/folding/FoldingAfterOptimizeImportsTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2013 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.folding + +import com.intellij.codeInsight.folding.CodeFoldingManager +import com.intellij.openapi.command.CommandProcessor +import com.intellij.openapi.command.UndoConfirmationPolicy +import com.intellij.openapi.editor.FoldRegion +import org.jetbrains.jet.plugin.PluginTestCaseBase +import org.jetbrains.jet.plugin.editor.importOptimizer.JetImportOptimizer +import java.io.File +import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture +import org.jetbrains.jet.InTextDirectivesUtils +import com.intellij.openapi.editor.Editor +import org.jetbrains.jet.plugin.folding.AbstractKotlinFoldingTest.doTestWithSettings + +class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() { + private val fixture: JavaCodeInsightTestFixture + get() = myFixture!! + + private val editor: Editor + get() = fixture.getEditor()!! + + private val fileText: String + get() = fixture.getFile()!!.getText()!! + + fun testFoldingAfterOptimizeImports() { + doTest() + } + + private fun doTest() { + fixture.configureByFile(getTestName(true) + ".kt") + + doTestWithSettings(fileText) { + fileText -> + CodeFoldingManager.getInstance(fixture.getProject())!!.buildInitialFoldings(editor) + getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION BEFORE: ")) + + CommandProcessor.getInstance()?.executeCommand(fixture.getProject(), + JetImportOptimizer().processFile(fixture.getFile()), + "Optimize Imports", null, + UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION) + getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION AFTER: ")) + null + } + } + + private fun getFoldingRegion(number: Int): FoldRegion { + fixture.doHighlighting() + val model = editor.getFoldingModel() + val foldingRegions = model.getAllFoldRegions() + assert(foldingRegions.size >= number) { "There is no enough folding regions in file: in file - ${foldingRegions.size} , expected = ${number}" } + return foldingRegions[number] + } + + override fun getTestDataPath() = File(PluginTestCaseBase.getTestDataPathBase(), "/folding/afterOptimizeImports/").getPath() + File.separator + + private fun findStringWithPrefixes(prefix: String) = InTextDirectivesUtils.findStringWithPrefixes(fileText, prefix) + ?: throw AssertionError("Couldn't find line with prefix $prefix") + + private fun FoldRegion.getPosition() = "${getStartOffset()}:${getEndOffset()}" + + private fun FoldRegion.checkRegion(isExpanded: Boolean, position: String): Unit { + assert(isValid()) { "Region should be valid: $this" } + assert(isExpanded == isExpanded()) { "isExpanded should be $isExpanded. Actual = ${isExpanded()}" } + assert(position == getPosition()) { "Region position is wrong: expected = $position, actual = ${getPosition()}" } + } + +}