From 14762e62af92228bd1f1a489c21efb8035b941f8 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 26 Apr 2013 11:55:39 +0400 Subject: [PATCH] navigation to class fixed if file not opened (IDEADEV-41617 re-fixed): test --- .../intellij/navigation/GotoClassTest.java | 55 +++++++++++++++++++ .../components/impl/ComponentManagerImpl.java | 9 ++- .../fileEditor/impl/EditorHistoryManager.java | 9 +-- .../fileEditor/FileEditorManagerTest.java | 22 +------- .../fileEditor/FileEditorManagerTestCase.java | 34 ++++++++++++ .../testFramework/PlatformLiteFixture.java | 10 +++- 6 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 java/java-tests/testSrc/com/intellij/navigation/GotoClassTest.java create mode 100644 platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTestCase.java diff --git a/java/java-tests/testSrc/com/intellij/navigation/GotoClassTest.java b/java/java-tests/testSrc/com/intellij/navigation/GotoClassTest.java new file mode 100644 index 000000000000..9735dc4865f8 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/navigation/GotoClassTest.java @@ -0,0 +1,55 @@ +package com.intellij.navigation; + +import com.intellij.codeInsight.navigation.NavigationUtil; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManagerTestCase; +import com.intellij.openapi.fileEditor.TextEditor; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiJavaFile; + +/** + * @author Dmitry Avdeev + * Date: 4/25/13 + */ +public class GotoClassTest extends FileEditorManagerTestCase { + + public void testGotoClass() throws Exception { + PsiJavaFile file = (PsiJavaFile)myFixture.configureByText("Foo.java", "public class Foo {\n" + + "}\n" + + "\n" + + "class Bar {}\n"); + + VirtualFile virtualFile = file.getVirtualFile(); + assertNotNull(virtualFile); + myManager.openFile(virtualFile, true); + assertEquals(0, getOffset(virtualFile)); + myManager.closeAllFiles(); + + PsiClass psiClass = file.getClasses()[1]; + int identifierOffset = psiClass.getNameIdentifier().getTextOffset(); + NavigationUtil.activateFileWithPsiElement(psiClass); + assertEquals(identifierOffset, getOffset(virtualFile)); + + getEditor(virtualFile).getCaretModel().moveToOffset(identifierOffset + 3); // it's still inside the class, so keep it + + NavigationUtil.activateFileWithPsiElement(psiClass); + assertEquals(identifierOffset + 3, getOffset(virtualFile)); + + getEditor(virtualFile).getCaretModel().moveToOffset(0); + NavigationUtil.activateFileWithPsiElement(psiClass); + assertEquals(identifierOffset, getOffset(virtualFile)); + + } + + private int getOffset(VirtualFile virtualFile) { + Editor editor = getEditor(virtualFile); + return editor.getCaretModel().getOffset(); + } + + private Editor getEditor(VirtualFile virtualFile) { + FileEditor[] editors = myManager.getEditors(virtualFile); + return ((TextEditor)editors[0]).getEditor(); + } +} diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index 1e9100b99cfe..8bf6e2830c2b 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -41,8 +41,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.picocontainer.*; -import org.picocontainer.defaults.*; import org.picocontainer.defaults.CachingComponentAdapter; +import org.picocontainer.defaults.ConstructorInjectionComponentAdapter; import java.lang.reflect.Array; import java.util.ArrayList; @@ -264,6 +264,13 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements myInitializedComponents.remove(componentKey); } + @TestOnly + public synchronized T registerComponentInstance(Class componentKey, T componentImplementation) { + getPicoContainer().unregisterComponent(componentKey.getName()); + getPicoContainer().registerComponentInstance(componentKey.getName(), componentImplementation); + return (T)myInitializedComponents.remove(componentKey); + } + @Override public synchronized boolean hasComponent(@NotNull Class interfaceClass) { return myComponentsRegistry.containsInterface(interfaceClass); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java index d3a77a64b758..6db24120f77b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java @@ -54,20 +54,17 @@ public final class EditorHistoryManager extends AbstractProjectComponent impleme private final ArrayList myEntriesList; /** Invoked by reflection */ - EditorHistoryManager(final Project project, FileEditorManager fileEditorManager, final UISettings uiSettings){ + EditorHistoryManager(final Project project, final UISettings uiSettings){ super(project); myEntriesList = new ArrayList(); - MyEditorManagerListener editorManagerListener = new MyEditorManagerListener(); /** * Updates history length */ - final MyUISettingsListener myUISettingsListener = new MyUISettingsListener(); - - fileEditorManager.addFileEditorManagerListener(editorManagerListener, project); + project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new MyEditorManagerListener()); project.getMessageBus().connect().subscribe(FileEditorManagerListener.Before.FILE_EDITOR_MANAGER, new MyEditorManagerBeforeListener()); - uiSettings.addUISettingsListener(myUISettingsListener, project); + uiSettings.addUISettingsListener(new MyUISettingsListener(), project); } public void projectOpened(){ diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java index 58e489d06e44..ff16f92bad5d 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java @@ -20,14 +20,11 @@ import com.intellij.mock.Mock; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite; -import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; -import com.intellij.ui.docking.DockManager; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jdom.Document; @@ -48,9 +45,8 @@ import java.util.concurrent.Future; * @author Dmitry Avdeev * Date: 4/16/13 */ -public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCase { +public class FileEditorManagerTest extends FileEditorManagerTestCase { - private FileEditorManagerImpl myManager; @SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors") public FileEditorManagerTest() { PlatformTestCase.initPlatformLangPrefix(); @@ -164,27 +160,11 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa future.get(); } - public void setUp() throws Exception { - super.setUp(); - myManager = new FileEditorManagerImpl(getProject(), DockManager.getInstance(getProject())); - } - - @Override - protected void tearDown() throws Exception { - myManager.closeAllFiles(); - super.tearDown(); - } - @Override protected String getTestDataPath() { return PlatformTestUtil.getCommunityPath().replace(File.separatorChar, '/') + "/platform/platform-tests/testData/fileEditorManager"; } - @Override - protected boolean isWriteActionRequired() { - return false; - } - private static class MyFileEditorProvider implements FileEditorProvider { @NotNull @Override diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTestCase.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTestCase.java new file mode 100644 index 000000000000..3ce272f4416f --- /dev/null +++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTestCase.java @@ -0,0 +1,34 @@ +package com.intellij.openapi.fileEditor; + +import com.intellij.openapi.components.impl.ComponentManagerImpl; +import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl; +import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; +import com.intellij.ui.docking.DockManager; + +/** + * @author Dmitry Avdeev + * Date: 4/25/13 + */ +public abstract class FileEditorManagerTestCase extends LightPlatformCodeInsightFixtureTestCase { + + protected FileEditorManagerImpl myManager; + private FileEditorManager myOldManager; + + public void setUp() throws Exception { + super.setUp(); + myManager = new FileEditorManagerImpl(getProject(), DockManager.getInstance(getProject())); + myOldManager = ((ComponentManagerImpl)getProject()).registerComponentInstance(FileEditorManager.class, myManager); + } + + @Override + protected void tearDown() throws Exception { + ((ComponentManagerImpl)getProject()).registerComponentInstance(FileEditorManager.class, myOldManager); + myManager.closeAllFiles(); + super.tearDown(); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } +} diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformLiteFixture.java b/platform/testFramework/src/com/intellij/testFramework/PlatformLiteFixture.java index 6bc3a55b966c..3535334b9c7b 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformLiteFixture.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformLiteFixture.java @@ -18,6 +18,7 @@ package com.intellij.testFramework; import com.intellij.mock.MockApplicationEx; import com.intellij.mock.MockProjectEx; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.ComponentManager; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; @@ -105,8 +106,15 @@ public abstract class PlatformLiteFixture extends UsefulTestCase { container.registerComponentImplementation(key, implementation); } - protected void registerComponentInstance(final MutablePicoContainer container, final Class key, final T implementation) { + public static T registerComponentInstance(final MutablePicoContainer container, final Class key, final T implementation) { + Object old = container.getComponentInstance(key); container.unregisterComponent(key); container.registerComponentInstance(key, implementation); + return (T)old; } + + public static T registerComponentInstance(final ComponentManager container, final Class key, final T implementation) { + return registerComponentInstance((MutablePicoContainer)container.getPicoContainer(), key, implementation); + } + }