From 93755124cfd76ce89171c5bdcdb9d88c1782a6bc Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Tue, 17 Apr 2012 12:09:45 +0400 Subject: [PATCH 01/45] miglayout license --- license/miglayout_swing_license.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 license/miglayout_swing_license.txt diff --git a/license/miglayout_swing_license.txt b/license/miglayout_swing_license.txt new file mode 100644 index 000000000000..7a28881c8add --- /dev/null +++ b/license/miglayout_swing_license.txt @@ -0,0 +1,28 @@ +Copyright (c) 2011 MiG InfoCom AB +All rights reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 2105f3ea41c7b57806b09939d0227e9a7fda882c Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 17 Apr 2012 10:13:03 +0200 Subject: [PATCH 02/45] eclipse: collapse link libraries in .classpath --- .../conversion/EclipseClasspathWriter.java | 12 +++++++- .../test/.classpath | 5 ++++ .../resolvedVarsInLibImlCheck1/test/.project | 30 +++++++++++++++++++ .../variableidea/project1/subdir/empty.jar | 0 .../eclipse/EclipseLinkedResourcesTest.java | 4 +++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.classpath create mode 100644 plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.project create mode 100644 plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/variableidea/project1/subdir/empty.jar diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java index cb6c69f8f5c5..7e7559287839 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java @@ -129,14 +129,21 @@ public class EclipseClasspathWriter { } else { boolean newVarLibrary = false; + + boolean link = false; String eclipseVariablePath = eclipseModuleManager.getEclipseVariablePath(files[0]); + if (eclipseVariablePath == null) { + eclipseVariablePath = eclipseModuleManager.getEclipseLinkedVarPath(files[0]); + link = eclipseVariablePath != null; + } + if (eclipseVariablePath == null && !eclipseModuleManager.isEclipseLibUrl(files[0])) { //new library was added newVarLibrary = true; eclipseVariablePath = EPathUtil.collapse2EclipseVariabledPath(libraryOrderEntry, OrderRootType.CLASSES); } Element orderEntry; if (eclipseVariablePath != null) { - orderEntry = addOrderEntry(EclipseXml.VAR_KIND, eclipseVariablePath, classpathRoot); + orderEntry = addOrderEntry(link ? EclipseXml.LIB_KIND : EclipseXml.VAR_KIND, eclipseVariablePath, classpathRoot); } else { LOG.assertTrue(!StringUtil.isEmptyOrSpaces(files[0]), "Library: " + libraryName); @@ -156,6 +163,9 @@ public class EclipseClasspathWriter { srcRelativePath = EPathUtil.collapse2EclipsePath(srcFile, myModel); if (eclipseVariablePath != null) { eclipseSrcVariablePath = eclipseModuleManager.getEclipseSrcVariablePath(srcFile); + if (eclipseSrcVariablePath == null) { + eclipseSrcVariablePath = eclipseModuleManager.getEclipseLinkedSrcVariablePath(srcFile); + } if (eclipseSrcVariablePath == null) { eclipseSrcVariablePath = EPathUtil.collapse2EclipseVariabledPath(libraryOrderEntry, OrderRootType.SOURCES); if (eclipseSrcVariablePath != null) { diff --git a/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.classpath b/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.classpath new file mode 100644 index 000000000000..f116e23ea584 --- /dev/null +++ b/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.project b/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.project new file mode 100644 index 000000000000..af1e53c8465b --- /dev/null +++ b/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/test/.project @@ -0,0 +1,30 @@ + + + eclipse_project + + + + + + org.eclipse.jdt.core.javabuilder + + + + + net.sf.eclipsensis.installoptions.InstallOptionsBuilder + + + + + + org.eclipse.jdt.core.javanature + net.sf.eclipsensis.installoptions.InstallOptionsNature + + + + 3rdParty + 2 + variable/project1 + + + diff --git a/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/variableidea/project1/subdir/empty.jar b/plugins/eclipse/testData/linked/resolvedVarsInLibImlCheck1/variableidea/project1/subdir/empty.jar new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLinkedResourcesTest.java b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLinkedResourcesTest.java index c9851214e3a6..e2dd0a76365b 100644 --- a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLinkedResourcesTest.java +++ b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLinkedResourcesTest.java @@ -45,4 +45,8 @@ public class EclipseLinkedResourcesTest extends EclipseVarsTest{ public void testResolvedVarsInLibImlCheck() throws Exception { EclipseImlTest.doTest("/test", getProject()); } + + public void testResolvedVarsInLibImlCheck1() throws Exception { + EclipseClasspathTest.doTest("/test", getProject()); + } } From 6285647dc8f54e39f6f4aa4356f5c9ce142e78d3 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Tue, 17 Apr 2012 12:36:37 +0400 Subject: [PATCH 03/45] miglayout license --- build/scripts/libLicenses.gant | 1 + 1 file changed, 1 insertion(+) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index d03bc5586bc6..d0fa5bde641c 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -206,6 +206,7 @@ libraryLicense(name: "Maven3", libraryNames: ["Maven3", "maven-dependency-tree-1 libraryLicense(name: "markdownj", attachedTo: "tasks-core", version: "", license: "BSD", url: "http://markdownj.org/", licenseUrl: "http://www.opensource.org/licenses/bsd-license.php") libraryLicense(name: "mercurial_prompthooks", attachedTo: "hg4idea", version: "", license: "GPLv2 (used as hg extension called from hg executable)", url: "https://github.com/willemv/mercurial_prompthooks", licenseUrl: "https://github.com/willemv/mercurial_prompthooks/blob/master/LICENSE.txt") libraryLicense(name: "Microba", libraryName: "microba", version: "0.4.2", license: "BSD", url: "http://microba.sourceforge.net/", licenseUrl: "http://microba.sourceforge.net/license.txt") +libraryLicense(name: "MigLayout", libraryName: "miglayout-swing.jar", version: "3.7.1", license: "BSD", url: "http://www.miglayout.com/", licenseUrl: "http://www.miglayout.com/mavensite/license.html") libraryLicense(name: "NanoXML", version: "2.2.3", license: "zlib/libpng", url: "http://nanoxml.cyberelf.be/", licenseUrl: "http://devkix.com/nanoxml.php") libraryLicense(name: "nekohtml", libraryName: "nekohtml", version: "1.9.14", license: "Apache 2.0", url: "http://nekohtml.sourceforge.net/", licenseUrl: "http://apache.org/licenses/LICENSE-2.0.txt") libraryLicense(name: "Eclipse JDT Core", libraryName: "Eclipse", version: "3.3", license: "CPL 1.0", url: "http://www.eclipse.org/jdt/core/index.php") From bf9fc2a70ee28efaa572c67bb6c6a527dcfc0640 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 16 Apr 2012 15:14:16 +0400 Subject: [PATCH 04/45] cleanup --- .../application/impl/ApplicationImpl.java | 84 +++++++++++++++++-- .../openapi/util/ShutDownTracker.java | 34 ++++---- 2 files changed, 95 insertions(+), 23 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 8e178949308d..a9a028b012ba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -130,9 +130,11 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application new SynchronousQueue(), new ThreadFactory() { int i; + @Override public Thread newThread(Runnable r) { final int count = myAliveThreads.incrementAndGet(); final Thread thread = new Thread(r, "ApplicationImpl pooled thread "+i++) { + @Override public void interrupt() { if (LOG.isDebugEnabled()) { LOG.debug("Interrupted worker, will remove from pool"); @@ -140,6 +142,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application super.interrupt(); } + @Override public void run() { try { super.run(); @@ -166,18 +169,20 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application private Boolean myActive; private static final ThreadLocal ourEdtSafe = new ThreadLocal(); - private static final ModalityState ANY = new ModalityState() { + @NonNls private static final ModalityState ANY = new ModalityState() { @Override public boolean dominates(@NotNull ModalityState anotherState) { return false; } + @NonNls @Override public String toString() { return "ANY"; } }; + @Override protected void bootstrapPicoContainer() { super.bootstrapPicoContainer(); getPicoContainer().registerComponentImplementation(IComponentStore.class, StoresFactory.getApplicationStoreClass()); @@ -260,7 +265,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application registerFont("/fonts/Inconsolata.ttf"); } - private void registerFont(String name) { + private void registerFont(@NonNls String name) { if (isHeadlessEnvironment()) return; InputStream is = null; @@ -271,7 +276,8 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } catch (Exception e) { LOG.info(e); - } finally { + } + finally { if (is != null) { try { is.close(); @@ -287,11 +293,13 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application ShutDownTracker.getInstance(); // Necessary to avoid creating an instance while already shutting down. ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { + @Override public void run() { if (isDisposed() || isDisposeInProgress()) { return; } ShutDownTracker.invokeAndWait(isUnitTestMode(), true, new Runnable() { + @Override public void run() { if (ApplicationManager.getApplication() != ApplicationImpl.this) return; try { @@ -299,7 +307,9 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application saveAll(); } finally { - disposeSelf(true); + if (!disposeSelf(true)) { + myDisposeInProgress = false; + } } } }); @@ -313,6 +323,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application for (final Project project : ProjectManagerEx.getInstanceEx().getOpenProjects()) { try { commandProcessor.executeCommand(project, new Runnable() { + @Override public void run() { final ProjectManagerImpl manager = (ProjectManagerImpl)ProjectManagerEx.getInstanceEx(); if (!manager.closeProject(project, true, true, checkCanCloseProject)) { @@ -325,7 +336,6 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application LOG.error(e); } if (!canClose.get()) { - myDisposeInProgress = false; return false; } } @@ -335,11 +345,13 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return true; } + @Override @NotNull public String getName() { return myName; } + @Override public boolean holdsReadLock() { return myActionsLock.isReadLockAcquired(); } @@ -406,14 +418,17 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return component; } + @Override protected MutablePicoContainer createPicoContainer() { return Extensions.getRootArea().getPicoContainer(); } + @Override public boolean isInternal() { return myIsInternal; } + @Override public boolean isUnitTestMode() { return myTestModeFlag; } @@ -422,16 +437,20 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application myTestModeFlag = testModeFlag; } + @Override public boolean isHeadlessEnvironment() { return myHeadlessMode; } + @Override public boolean isCommandLine() { return myCommandLineMode; } + @Override public Future executeOnPooledThread(@NotNull final Runnable action) { return ourThreadExecutorsService.submit(new Runnable() { + @Override public void run() { try { action.run(); @@ -453,6 +472,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application @Override public Future executeOnPooledThread(@NotNull final Callable action) { return ourThreadExecutorsService.submit(new Callable() { + @Override public T call() { try { return action.call(); @@ -474,32 +494,39 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application private static Thread ourDispatchThread = null; + @Override public boolean isDispatchThread() { return EventQueue.isDispatchThread(); } + @Override @NotNull public ModalityInvokator getInvokator() { return myInvokator; } + @Override public void invokeLater(@NotNull final Runnable runnable) { myInvokator.invokeLater(runnable); } + @Override public void invokeLater(@NotNull final Runnable runnable, @NotNull final Condition expired) { myInvokator.invokeLater(runnable, expired); } + @Override public void invokeLater(@NotNull final Runnable runnable, @NotNull final ModalityState state) { myInvokator.invokeLater(runnable, state); } + @Override public void invokeLater(@NotNull final Runnable runnable, @NotNull final ModalityState state, @NotNull final Condition expired) { myInvokator.invokeLater(runnable, state, expired); } + @Override public void load(String path) throws IOException, InvalidDataException { getStateStore().setOptionsPath(path); getStateStore().setConfigPath(PathManager.getConfigPath()); @@ -564,6 +591,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } + @Override public void dispose() { fireApplicationExiting(); @@ -584,6 +612,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public boolean runProcessWithProgressSynchronously(@NotNull final Runnable process, @NotNull String progressTitle, boolean canBeCanceled, @@ -591,6 +620,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return runProcessWithProgressSynchronously(process, progressTitle, canBeCanceled, project, null); } + @Override public boolean runProcessWithProgressSynchronously(@NotNull final Runnable process, @NotNull final String progressTitle, final boolean canBeCanceled, @@ -599,6 +629,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return runProcessWithProgressSynchronously(process, progressTitle, canBeCanceled, project, parentComponent, null); } + @Override public boolean runProcessWithProgressSynchronously(@NotNull final Runnable process, @NotNull final String progressTitle, final boolean canBeCanceled, @@ -627,12 +658,14 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application myExceptionalThreadWithReadAccessRunnable = process; final boolean[] threadStarted = {false}; SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { if (myExceptionalThreadWithReadAccessRunnable != process) { LOG.error("myExceptionalThreadWithReadAccessRunnable != process, process = " + myExceptionalThreadWithReadAccessRunnable); } executeOnPooledThread(new Runnable() { + @Override public void run() { if (myExceptionalThreadWithReadAccessRunnable != process) { LOG.error("myExceptionalThreadWithReadAccessRunnable != process, process = " + myExceptionalThreadWithReadAccessRunnable); @@ -674,6 +707,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return !progress.isCanceled(); } + @Override public boolean isInModalProgressThread() { if (myExceptionalThreadWithReadAccessRunnable == null || !isExceptionalThreadWithReadAccess()) { return false; @@ -682,6 +716,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return progressIndicator.isModal() && ((ProgressIndicatorEx)progressIndicator).isModalityEntered(); } + @Override public void invokeAndWait(@NotNull Runnable runnable, @NotNull ModalityState modalityState) { if (isDispatchThread()) { LOG.error("invokeAndWait must not be called from event queue thread"); @@ -701,12 +736,14 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application LaterInvocator.invokeAndWait(runnable, modalityState); } + @Override @NotNull public ModalityState getCurrentModalityState() { Object[] entities = LaterInvocator.getCurrentModalEntities(); return entities.length > 0 ? new ModalityStateEx(entities) : getNoneModalityState(); } + @Override @NotNull public ModalityState getModalityStateForComponent(@NotNull Component c) { Window window = c instanceof Window ? (Window)c : SwingUtilities.windowForComponent(c); @@ -719,6 +756,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return ANY; } + @Override @NotNull public ModalityState getDefaultModalityState() { if (EventQueue.isDispatchThread()) { @@ -730,23 +768,28 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override @NotNull public ModalityState getNoneModalityState() { return MODALITY_STATE_NONE; } + @Override public long getStartTime() { return myStartTime; } + @Override public long getIdleTime() { return IdeEventQueue.getInstance().getIdleTime(); } + @Override public void exit() { exit(false); } + @Override public void exit(final boolean force) { exit(force, true); } @@ -757,6 +800,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } Runnable runnable = new Runnable() { + @Override public void run() { if (!force && !showConfirmation()) { saveAll(); @@ -859,6 +903,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return true; } + @Override public void runReadAction(@NotNull final Runnable action) { final AccessToken token = acquireReadActionLockImpl(false); @@ -887,6 +932,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return old; } + @Override public T runReadAction(@NotNull final Computable computation) { final AccessToken token = acquireReadActionLockImpl(false); @@ -898,6 +944,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public void runWriteAction(@NotNull final Runnable action) { final AccessToken token = acquireWriteActionLock(action.getClass()); try { @@ -908,6 +955,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public T runWriteAction(@NotNull final Computable computation) { final AccessToken token = acquireWriteActionLock(computation.getClass()); try { @@ -918,16 +966,18 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public boolean hasWriteAction(@Nullable Class actionClass) { assertCanRunWriteAction(); for (int i = myWriteActionsStack.size() - 1; i >= 0; i--) { Class action = myWriteActionsStack.get(i); - if (actionClass == action || action != null && ReflectionCache.isAssignable(actionClass, action)) return true; + if (actionClass == action || action != null && actionClass != null && ReflectionCache.isAssignable(actionClass, action)) return true; } return false; } + @Override public void assertReadAccessAllowed() { if (myHeadlessMode) return; if (!isReadAccessAllowed()) { @@ -958,6 +1008,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return null; } + @Override public boolean isReadAccessAllowed() { Thread currentThread = Thread.currentThread(); return ourDispatchThread == currentThread || @@ -971,6 +1022,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application assertIsDispatchThread("Write access is allowed from event dispatch thread only"); } + @Override public void assertIsDispatchThread() { assertIsDispatchThread("Access is allowed from event dispatch thread only."); } @@ -994,6 +1046,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application "SystemEventQueueThread: " + describe(getEventQueueThread())); } + @Override public void runEdtSafeAction(@NotNull Runnable runnable) { Integer value = ourEdtSafe.get(); if (value == null) { @@ -1011,6 +1064,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public void assertIsDispatchThread(@Nullable final JComponent component) { if (component == null) return; @@ -1031,11 +1085,13 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public void assertTimeConsuming() { if (myTestModeFlag || myHeadlessMode || ShutDownTracker.isShutdownHookRunning()) return; LOG.assertTrue(!isDispatchThread(), "This operation is time consuming and must not be called on EDT"); } + @Override public boolean tryRunReadAction(@NotNull Runnable action) { /** if we are inside read action, do not try to acquire read lock again since it will deadlock if there is a pending writeAction * see {@link com.intellij.util.concurrency.ReentrantWriterPreferenceReadWriteLock#allowReader()} */ @@ -1084,6 +1140,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return false; } + @Override public boolean isActive() { if (isUnitTestMode()) return true; @@ -1195,11 +1252,13 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public void assertWriteAccessAllowed() { LOG.assertTrue(isWriteAccessAllowed(), "Write access is allowed inside write-action only (see com.intellij.openapi.application.Application.runWriteAction())"); } + @Override public boolean isWriteAccessAllowed() { return myActionsLock.isWriteLockAcquired(Thread.currentThread()); } @@ -1213,14 +1272,17 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application LOG.assertTrue(myInEditorPaintCounter >= 0); } + @Override public void addApplicationListener(@NotNull ApplicationListener l) { myDispatcher.addListener(l); } + @Override public void addApplicationListener(@NotNull ApplicationListener l, @NotNull Disposable parent) { myDispatcher.addListener(l, parent); } + @Override public void removeApplicationListener(@NotNull ApplicationListener l) { myDispatcher.removeListener(l); } @@ -1254,6 +1316,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application else { LOG.info("Saving application settings failed", ex); invokeLater(new Runnable() { + @Override public void run() { if (ex instanceof PluginException) { final PluginException pluginException = (PluginException)ex; @@ -1279,11 +1342,13 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + @Override public void saveSettings() { if (myDoNotSave) return; _saveSettings(); } + @Override public void saveAll() { if (myDoNotSave) return; @@ -1298,30 +1363,37 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application saveSettings(); } + @Override public void doNotSave() { doNotSave(true); } + @Override public void doNotSave(boolean value) { myDoNotSave = value; } + @Override public boolean isDoNotSave() { return myDoNotSave; } + @Override public T[] getExtensions(final ExtensionPointName extensionPointName) { return Extensions.getRootArea().getExtensionPoint(extensionPointName).getExtensions(); } + @Override public boolean isDisposeInProgress() { return myDisposeInProgress || ShutDownTracker.isShutdownHookRunning(); } + @Override public boolean isRestartCapable() { return Restarter.isSupported() || myRestartCode > 0; } + @Override public void restart() { boolean restarted = false; try { diff --git a/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java b/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java index 8cee75fb6bc2..5cddf3912004 100644 --- a/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java +++ b/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java @@ -18,7 +18,6 @@ package com.intellij.openapi.util; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.concurrency.Semaphore; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; @@ -41,6 +40,7 @@ public class ShutDownTracker implements Runnable { private static final ShutDownTracker ourInstance = new ShutDownTracker(); } + @NotNull public static ShutDownTracker getInstance() { return ShutDownTrackerHolder.ourInstance; } @@ -49,6 +49,7 @@ public class ShutDownTracker implements Runnable { return getInstance().myIsShutdownHookRunning; } + @Override public void run() { myIsShutdownHookRunning = true; @@ -128,28 +129,27 @@ public class ShutDownTracker implements Runnable { myShutdownTasks.remove(task); } - @Nullable - private synchronized T removeLast(LinkedList list) { + private synchronized T removeLast(@NotNull LinkedList list) { return list.isEmpty()? null : list.removeLast(); } - public static void invokeAndWait(boolean timed, boolean edt, final Runnable runnable) { + public static void invokeAndWait(boolean timed, boolean edt, @NotNull final Runnable runnable) { if (!edt) { - if (!timed) { + if (timed) { + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + new Thread(new Runnable() { + @Override + public void run() { + runnable.run(); + semaphore.up(); + } + }).start(); + semaphore.waitFor(1000); + } + else { runnable.run(); } - - final Semaphore semaphore = new Semaphore(); - semaphore.down(); - new Thread(new Runnable() { - @Override - public void run() { - runnable.run(); - semaphore.up(); - } - }).start(); - semaphore.waitFor(1000); - return; } From 3463d6961d97ab67ff27a36b6f8e68e218383f3b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 16 Apr 2012 15:32:38 +0400 Subject: [PATCH 05/45] NPE --- .../src/com/intellij/ide/bookmarks/actions/BookmarksAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java index d5e7b3be28d6..53c9d8c4e43a 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java @@ -468,7 +468,7 @@ public class BookmarksAction extends AnAction implements DumbAware { myFile = PlatformDataKeys.VIRTUAL_FILE.getData(myDataContext); myLine = -1; - if (myBookmarkAtPlace == null) { + if (myBookmarkAtPlace == null && myFile != null) { myBookmarkAtPlace = bookmarkManager.findFileBookmark(myFile); } } From e9289e19dbcedc93c022ab4fd7cc8904cffe6e59 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 17 Apr 2012 11:04:39 +0200 Subject: [PATCH 06/45] render multiple paragraph inspection description using one font size in tooltip --- platform/util/src/com/intellij/util/ui/UIUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 2736edbb4e0e..255ba36442ad 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -1399,7 +1399,7 @@ public class UIUtil { @NonNls String fontFamilyAndSize = "font-family:" + font.getFamily() + "; font-size:" + font.getSize() + ";"; @NonNls @Language("HTML") - String body = "body, div, td {" + fontFamilyAndSize + " " + (fgColor != null ? "color:" + ColorUtil.toHex(fgColor) : "") + "}"; + String body = "body, div, td, p {" + fontFamilyAndSize + " " + (fgColor != null ? "color:" + ColorUtil.toHex(fgColor) : "") + "}"; if (resource != null) { body += "ul {list-style-image: " + resource.toExternalForm() +"}"; } From aa243c49bc2786f01e63337f8a35b2b6127f053f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 17 Apr 2012 11:37:41 +0200 Subject: [PATCH 07/45] include library classes under content into project scope --- .../com/intellij/find/FindManagerTest.java | 17 ++++++++--------- .../intellij/psi/search/ProjectScopeImpl.java | 2 -- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index 660ba9dcfe0c..a2dd05bde64c 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -379,20 +379,19 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { findModel.setWholeWordsOnly(false); assertSize(2, findUsages(findModel)); - /* todo findModel.setWholeWordsOnly(true); assertSize(2, findUsages(findModel)); - */ } - public void testLocalScopeSearchPerformance() throws Exception { - final int count = 3000; + public void testLocalScopeSearchPerformance() throws Throwable { + final int fileCount = 3000; + final int lineCount = 500; TempDirTestFixture fixture = new LightTempDirTestFixtureImpl(); fixture.setUp(); try { - String sampleText = StringUtil.repeat("zoo TargetWord foo bar goo\n", count); - for (int i = 0; i < count; i++) { + String sampleText = StringUtil.repeat("zoo TargetWord foo bar goo\n", lineCount); + for (int i = 0; i < fileCount; i++) { fixture.createFile("a" + i + ".txt", sampleText); } PsiTestUtil.addSourceContentToRoots(myModule, fixture.getFile("")); @@ -409,15 +408,15 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { ThrowableRunnable test = new ThrowableRunnable() { @Override public void run() throws Throwable { - assertSize(count, findUsages(findModel)); + assertSize(lineCount, findUsages(findModel)); } }; findModel.setCustomScope(GlobalSearchScope.fileScope(psiFile)); - PlatformTestUtil.startPerformanceTest("slow", 500, test).attempts(1).cpuBound().usesAllCPUCores().assertTiming(); + PlatformTestUtil.startPerformanceTest("slow", 400, test).attempts(2).cpuBound().usesAllCPUCores().assertTiming(); findModel.setCustomScope(new LocalSearchScope(psiFile)); - PlatformTestUtil.startPerformanceTest("slow", 500, test).attempts(1).cpuBound().usesAllCPUCores().assertTiming(); + PlatformTestUtil.startPerformanceTest("slow", 400, test).attempts(2).cpuBound().usesAllCPUCores().assertTiming(); } finally { fixture.tearDown(); diff --git a/platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java b/platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java index 1b45424b150e..684136c1b0e8 100644 --- a/platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java +++ b/platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java @@ -35,8 +35,6 @@ public class ProjectScopeImpl extends GlobalSearchScope { public boolean contains(VirtualFile file) { if (file instanceof VirtualFileWindow) return true; - if (myFileIndex.isInLibraryClasses(file) && !myFileIndex.isInSourceContent(file)) return false; - return myFileIndex.isInContent(file); } From 6536aa5d0fdfc49e6b8be33cc383fac12dd4e1f1 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Tue, 17 Apr 2012 13:54:47 +0400 Subject: [PATCH 08/45] Implement automating compacting on key removal. Failure to do say leads to linear access times with some usage patterns. See benchmark.Main updated. --- lib/src/trove4j_changes.txt | 10 ++++ lib/src/trove4j_src.jar | Bin 394358 -> 403296 bytes lib/trove4j.jar | Bin 415503 -> 418068 bytes .../openapi/util/objectTree/ObjectTree.java | 46 ++++-------------- 4 files changed, 20 insertions(+), 36 deletions(-) diff --git a/lib/src/trove4j_changes.txt b/lib/src/trove4j_changes.txt index 4d8619f3cdfb..e52489551ccf 100644 --- a/lib/src/trove4j_changes.txt +++ b/lib/src/trove4j_changes.txt @@ -1,3 +1,13 @@ +Date: 16 Apr 2012 + Changed classes: + gnu.trove.THash + gnu.trove.TPrimitiveHash + gnu.trove.TObjectHash + gnu.trove.TIterator + gnu.trove.benchmark.Main + and many others + - implement autocompact on removing keys. Failure to do so leads to linear access time + Date: 15 Jan 2008 Changed classes: gnu.trove.THashMap - fixed bug in put() method for null value diff --git a/lib/src/trove4j_src.jar b/lib/src/trove4j_src.jar index 8f333ba3f843871e320f27b523abc1e5eff38f5a..408696db4c66c3d2b27347f789e6c59ac0a2b095 100644 GIT binary patch delta 198986 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