diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_after.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_after.java new file mode 100644 index 000000000000..e33d32fd1c1b --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_after.java @@ -0,0 +1,10 @@ +public class Main { + + + public int a = 3; + protected Object obj = null; + private long e = 4; + + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_before.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_before.java new file mode 100644 index 000000000000..c65c426808e3 --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_before.java @@ -0,0 +1,17 @@ +import java.lang.Object; +import java.util.LinkedHashSet; +import java.util.Set; + +public class Main { + + + + public int a = 3; +private long e = 4; + + + protected Object obj = null; + + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_revision.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_revision.java new file mode 100644 index 000000000000..c922c3a0fff4 --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeRearrangeVcsChanges_revision.java @@ -0,0 +1,10 @@ +import java.util.LinkedHashSet; +import java.util.Set; + +public class Main { + + + + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_after.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_after.java new file mode 100644 index 000000000000..d8b472a1ec80 --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_after.java @@ -0,0 +1,23 @@ +import java.util.LinkedHashSet; +import java.util.Set; + +public class Main { + + + public static void main(String[] args) { + Runnable runnable = new Runnable() { + @Override + public void run() { + Set test = new LinkedHashSet(); + if (test.contains("AA")) { + if (test.contains("AS")) { + System.out.println("AAAA!"); + } + } + } + }; + + runnable.run(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_before.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_before.java new file mode 100644 index 000000000000..8d972e12b704 --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_before.java @@ -0,0 +1,27 @@ +import java.lang.Override; +import java.lang.Runnable; +import java.lang.String; +import java.util.Set; +import java.util.HashSet; +import java.util.LinkedHashSet; + +public class Main { + + + public static void main(String[] args) { + Runnable runnable = new Runnable() { + @Override + public void run() { + Set test = new LinkedHashSet(); + if (test.contains("AA")) { + if (test.contains("AS")) { + System.out.println("AAAA!"); + } + } + } + }; + + runnable.run(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_revision.java b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_revision.java new file mode 100644 index 000000000000..0818983f8e7d --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatOptimizeVcsChanges_revision.java @@ -0,0 +1,23 @@ +import com.intellij.util.containers.HashSet; + +import java.util.Set; +import java.util.HashSet; + +public class Main { + + + public static void main(String[] args) { + Runnable runnable = new Runnable() { + @Override + public void run() { + Set test = new HashSet(); + if (test.contains("AA")) { + System.out.println("AAAA!"); + } + } + }; + + runnable.run(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_after.java b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_after.java new file mode 100644 index 000000000000..17cc8ec1273f --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_after.java @@ -0,0 +1,13 @@ +public class Test { + +public void run() { + + int a = 3; + int b = 12; + +} + + public void test() { + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_before.java b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_before.java new file mode 100644 index 000000000000..5a92198fefee --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_before.java @@ -0,0 +1,13 @@ +public class Test { + +public void run() { + +int a = 3; +int b = 12; + +} + +public void test() { +} + +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_revision.java b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_revision.java new file mode 100644 index 000000000000..c7c76f24f5a0 --- /dev/null +++ b/java/java-tests/testData/actions/reformatFileInEditor/formatVcsChanges_revision.java @@ -0,0 +1,10 @@ +public class Test { + +public void run() { + + int a = 3; + +} + + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionInEditorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionInEditorTest.java index 184405d8ddf3..286de18ffd6d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionInEditorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionInEditorTest.java @@ -17,8 +17,15 @@ package com.intellij.codeInsight.actions; import com.intellij.JavaTestUtil; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.ContentRevision; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; +import com.intellij.psi.PsiFile; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -33,8 +40,21 @@ public class ReformatCodeActionInEditorTest extends LightCodeInsightFixtureTestC public void doTest(@NotNull ReformatFilesOptions options) { setOptions(options); + + String before = null; + if (options.isProcessOnlyChangedText()) { + myFixture.configureByFile(getTestDataPath() + getTestName(true) + "_revision.java"); + PsiFile file = myFixture.getFile(); + Document document = myFixture.getDocument(file); + before = document.getText(); + } + myFixture.configureByFile(getTestDataPath() + getTestName(true) + "_before.java"); + if (before != null) { + myFixture.getFile().putUserData(FormatChangedTextUtil.TEST_REVISION_CONTENT, before); + } + final String actionId = IdeActions.ACTION_EDITOR_REFORMAT; AnAction action = ActionManager.getInstance().getAction(actionId); @@ -44,6 +64,12 @@ public class ReformatCodeActionInEditorTest extends LightCodeInsightFixtureTestC myFixture.checkResultByFile(getTestName(true) + "_after.java"); } + @Override + public void tearDown() throws Exception { + myFixture.getFile().putUserData(FormatChangedTextUtil.TEST_REVISION_CONTENT, null); + super.tearDown(); + } + protected AnActionEvent createEventFor(@NotNull AnAction action, @NotNull final Project project, @NotNull final Editor editor) { return new AnActionEvent(null, new DataContext() { @Nullable @@ -80,7 +106,16 @@ public class ReformatCodeActionInEditorTest extends LightCodeInsightFixtureTestC doTest(new MockReformatFileSettings().setProcessWholeFile(false).setRearrange(true)); } + public void testFormatVcsChanges() { + doTest(new MockReformatFileSettings().setProcessOnlyChangedText(true)); + } - //todo add tests on vcs changes + public void testFormatOptimizeVcsChanges() { + doTest(new MockReformatFileSettings().setProcessOnlyChangedText(true).setOptimizeImports(true)); + } + + public void testFormatOptimizeRearrangeVcsChanges() { + doTest(new MockReformatFileSettings().setProcessOnlyChangedText(true).setOptimizeImports(true).setRearrange(true)); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java index 45effe8e781e..03691d0749e0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.actions; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.Result; import com.intellij.openapi.diagnostic.Logger; @@ -27,6 +28,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.Change; @@ -52,8 +54,9 @@ import org.jetbrains.annotations.Nullable; import java.util.*; public class FormatChangedTextUtil { + public static final Key TEST_REVISION_CONTENT = Key.create("test.revision.content"); private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.actions.FormatChangedTextUtil"); - + private FormatChangedTextUtil() { } @@ -251,6 +254,13 @@ public class FormatChangedTextUtil { return cachedChangedLines; } + if (ApplicationManager.getApplication().isUnitTestMode()) { + String testContent = file.getUserData(TEST_REVISION_CONTENT); + if (testContent != null) { + return calculateChangedTextRanges(file.getProject(), file, testContent); + } + } + Change change = ChangeListManager.getInstance(project).getChange(file.getVirtualFile()); if (change == null) { return ContainerUtilRt.emptyList();