From ec3f166ab6124c5a9a2e3328c107a5030e911de1 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Thu, 3 Dec 2009 17:23:17 +0300 Subject: [PATCH 01/20] fixed NPE on double-remove of last element --- platform/util/src/com/intellij/openapi/util/MultiValuesMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java b/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java index 03037b290a2b..ee0b7d8a4baa 100644 --- a/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java +++ b/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java @@ -71,7 +71,7 @@ public class MultiValuesMap{ } public void remove(K key, V value) { - if (!myBaseMap.containsKey(key)) return; + if (myBaseMap.get(key) == null) return; final Collection values = myBaseMap.get(key); values.remove(value); if (values.isEmpty()) { From 234cc2f6f711e18060a7d4e93d285c40c13fd58d Mon Sep 17 00:00:00 2001 From: Constantine Plotnikov Date: Mon, 7 Dec 2009 18:11:33 +0300 Subject: [PATCH 02/20] git4idea: IDEADEV-41626: fixed some spelling errors --- .../git4idea/src/git4idea/i18n/GitBundle.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties index da947f056274..030c7b2f735e 100644 --- a/plugins/git4idea/src/git4idea/i18n/GitBundle.properties +++ b/plugins/git4idea/src/git4idea/i18n/GitBundle.properties @@ -71,7 +71,7 @@ common.git.root=Git &Root: common.no.active.branch= computing.annotation=Computing annotation for {0} crlf.convert.convert=Convert Selected -crlf.convert.label=&The following text files have line separator that do not match the project line separator.
Select files you wish to covert to project default line separators before commit. +crlf.convert.label=&The following text files have line separator that do not match the project line separator.
Select files you wish to convert to project default line separators before commit. crlf.convert.leave=Leave Unchanged crlf.convert.none.tooltip=If this option is selected, the file are not attempted to be converted before commit. crlf.convert.none=Do ¬ convert files @@ -125,17 +125,17 @@ getting.history=Getting history for {0} git.default.commit.message=\n# Brief commit description here\n\n# Full commit description here (comment lines starting with '#' will not be included)\n\n git.error.exit=The git process exited with the code {0} git.running=Running: {0} -git.vcs.config.convert.ask.tooltip=If this checkbox is specified, the user will be show a list of file to be converted. +git.vcs.config.convert.ask.tooltip=If this check box is selected, the user will be shown a list of files to be converted git.vcs.config.convert.ask=Ask before con&versions git.vcs.config.convert.crlf=&Convert Text Files: git.vcs.config.convert.do.not.convert=Do not convert git.vcs.config.convert.project=Convert to project's line separators -git.vcs.config.convert.tooltip=Convert text files on commit:
  • Do not convert - do not covert sources
  • Convert to project line separators - the sourcers are converted to line separators that are specified in the project's code style.
+git.vcs.config.convert.tooltip=Convert text files on commit:
  • Do not convert - do not convert sources
  • Convert to project line separators - the sources are converted to line separators that are specified in the project's code style.
git.vcs.config.path.label=Path to &git executable: git.vcs.config.ssh.mode.idea=ssh git.vcs.config.ssh.mode.native=Native -git.vcs.config.ssh.mode.tooltip=Specify which version of SSH to be used with git.
  • Native means that the native ssh will be used.
  • {0} SSH means that the implementation provided by the {0} will be used.
The native implementation might cause hangups on some platforms. In native case, you also might need to configure ssh-askpass for your platform to recieve GUI promopts for passwords. -git.vcs.config.ssh.mode=&SSH executable: +git.vcs.config.ssh.mode.tooltip=Specify which version of SSH to be used with git.
  • Native means that the native ssh will be used.
  • {0} SSH means that the implementation provided by the {0} will be used.
The native implementation might cause hangups on some platforms. In native case, you also might need to configure ssh-askpass for your platform to recieve GUI prompts for passwords. +git.vcs.config.ssh.mode=&SSH Executable: git.vcs.config.test.label=Test git.vcs.config.test=&Test history.copy.revsion.number=Copy Revision Number From 57b9ca5ea586f3b90c6f2af3dbac967262ca94a6 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 7 Dec 2009 19:17:51 +0300 Subject: [PATCH 03/20] logging for "git does not return any changes" --- .../vcs/changes/ChangeListManagerImpl.java | 15 ++++++++++++++- .../src/git4idea/changes/GitChangeProvider.java | 8 +++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 56e32e7d2c36..caaf67221e35 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -310,7 +310,20 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec if (updateUnversionedFiles && !wasEverythingDirty) { composite.cleanScope(adjustedScope); } - actualUpdate(wasEverythingDirty, composite, builder, adjustedScope, vcs, changeListWorker, gate); + + try { + actualUpdate(wasEverythingDirty, composite, builder, adjustedScope, vcs, changeListWorker, gate); + } + catch (Throwable t) { + LOG.info(t); + if (t instanceof Error) { + throw (Error) t; + } else if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new RuntimeException(t); + } + if (myUpdateException != null) break; } diff --git a/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java b/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java index d51ead92934e..5a0aac12497d 100644 --- a/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java +++ b/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java @@ -15,6 +15,7 @@ */ package git4idea.changes; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -35,6 +36,7 @@ import java.util.Set; * Git repository change provider */ public class GitChangeProvider implements ChangeProvider { + private static final Logger LOG = Logger.getInstance("#git4idea.changes.GitChangeProvider"); /** * the project */ @@ -56,7 +58,11 @@ public class GitChangeProvider implements ChangeProvider { final ChangelistBuilder builder, final ProgressIndicator progress, final ChangeListManagerGate addGate) throws VcsException { - Collection roots = GitUtil.gitRootsForPaths(dirtyScope.getAffectedContentRoots()); + final Collection affected = dirtyScope.getAffectedContentRoots(); + Collection roots = GitUtil.gitRootsForPaths(affected); + if (roots.size() != affected.size()) { + LOG.info("affected content roots size: " + affected.size() + " roots size: " + roots.size()); + } final MyNonChangedHolder holder = new MyNonChangedHolder(myProject, dirtyScope.getDirtyFilesNoExpand()); From bc3a6cc14158240b242f2ea422f8ef9ecf0e2470 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 7 Dec 2009 19:31:29 +0300 Subject: [PATCH 04/20] setup java sdk for project from sources (IDEADEV-41843) --- .../util/newProjectWizard/ProjectFromSourcesBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectFromSourcesBuilder.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectFromSourcesBuilder.java index 4d5d89875fa6..22e25276c1ca 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectFromSourcesBuilder.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectFromSourcesBuilder.java @@ -19,14 +19,14 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.util.importProject.LibraryDescriptor; import com.intellij.ide.util.importProject.ModuleDescriptor; import com.intellij.ide.util.importProject.ModuleInsight; +import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ProjectBuilder; import com.intellij.ide.util.projectWizard.SourcePathsBuilder; -import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.*; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.libraries.Library; @@ -307,6 +307,6 @@ public class ProjectFromSourcesBuilder extends ProjectBuilder implements SourceP @Override public boolean isSuitableSdk(final Sdk sdk) { - return sdk.getSdkType() instanceof JavaSdkType; + return sdk.getSdkType() == JavaSdk.getInstance(); } } From 02466f9b14e30db386a6fe0b7daa15177a155753 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 7 Dec 2009 19:40:05 +0300 Subject: [PATCH 05/20] setup editor kit manually (14193) --- .../intellij/featureStatistics/ui/ProgressTipPanel.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/featureStatistics/ui/ProgressTipPanel.java b/platform/platform-impl/src/com/intellij/featureStatistics/ui/ProgressTipPanel.java index 70c7d239e64d..23eccdcf10eb 100644 --- a/platform/platform-impl/src/com/intellij/featureStatistics/ui/ProgressTipPanel.java +++ b/platform/platform-impl/src/com/intellij/featureStatistics/ui/ProgressTipPanel.java @@ -27,11 +27,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.IconLoader; import com.intellij.util.Alarm; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import javax.swing.*; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; +import javax.swing.text.html.HTMLEditorKit; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -62,8 +64,9 @@ public class ProgressTipPanel { myProject = project; myCurrentFeature = 0; - //noinspection HardCodedStringLiteral - myBrowser.setContentType("text/html"); + final HTMLEditorKit editorKit = new HTMLEditorKit(); + myBrowser.setEditorKit(editorKit); + myBrowser.setContentType(UIUtil.HTML_MIME); myScrollPane.setPreferredSize(new Dimension(600, 200)); myBrowser.setEditable(false); From b8550f65110c991a5fa63f581711c12dadc88749 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 7 Dec 2009 19:18:20 +0300 Subject: [PATCH 06/20] reverted incorrect change --- platform/util/src/com/intellij/openapi/util/MultiValuesMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java b/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java index ee0b7d8a4baa..03037b290a2b 100644 --- a/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java +++ b/platform/util/src/com/intellij/openapi/util/MultiValuesMap.java @@ -71,7 +71,7 @@ public class MultiValuesMap{ } public void remove(K key, V value) { - if (myBaseMap.get(key) == null) return; + if (!myBaseMap.containsKey(key)) return; final Collection values = myBaseMap.get(key); values.remove(value); if (values.isEmpty()) { From 9b80dd090fffea8f938b32affe670fae0748ecaf Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 7 Dec 2009 19:58:13 +0300 Subject: [PATCH 07/20] xerces disabled in xhtmls: proper fix --- .../com/intellij/lang/xml/XMLExternalAnnotator.java | 4 +--- .../intellij/xml/impl/ExternalDocumentValidator.java | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java index b50a2e41286f..94dc9395a055 100644 --- a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java +++ b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java @@ -22,7 +22,6 @@ import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.ExternalAnnotator; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; @@ -37,8 +36,7 @@ public class XMLExternalAnnotator implements ExternalAnnotator, Validator.Valida private AnnotationHolder myHolder; public void annotate(PsiFile file, AnnotationHolder holder) { - if (!(file instanceof XmlFile) || file.getViewProvider() instanceof TemplateLanguageFileViewProvider) return; - + if (!(file instanceof XmlFile)) return; myHolder = holder; final XmlDocument document = ((XmlFile)file).getDocument(); if (document == null) return; diff --git a/xml/impl/src/com/intellij/xml/impl/ExternalDocumentValidator.java b/xml/impl/src/com/intellij/xml/impl/ExternalDocumentValidator.java index 3cdfa4eb6d2b..b3f494b3cbf5 100644 --- a/xml/impl/src/com/intellij/xml/impl/ExternalDocumentValidator.java +++ b/xml/impl/src/com/intellij/xml/impl/ExternalDocumentValidator.java @@ -20,12 +20,13 @@ import com.intellij.codeInsight.daemon.Validator; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.InspectionProfile; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; +import com.intellij.ide.highlighter.XHtmlFileType; +import com.intellij.ide.highlighter.XmlFileType; import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; @@ -35,6 +36,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.reference.SoftReference; @@ -42,8 +44,6 @@ import com.intellij.xml.actions.ValidateXmlActionHandler; import com.intellij.xml.util.CheckXmlFileWithXercesValidatorInspection; import com.intellij.xml.util.XmlResourceResolver; import com.intellij.xml.util.XmlUtil; -import com.intellij.ide.highlighter.XmlFileType; -import com.intellij.ide.highlighter.XHtmlFileType; import org.jetbrains.annotations.NonNls; import org.xml.sax.SAXParseException; @@ -337,6 +337,10 @@ public class ExternalDocumentValidator { return; } + if (containingFile.getViewProvider() instanceof TemplateLanguageFileViewProvider) { + return; + } + final FileType fileType = containingFile.getViewProvider().getVirtualFile().getFileType(); if (fileType != XmlFileType.INSTANCE && fileType != XHtmlFileType.INSTANCE) { return; From a87596162e1809a878636c3c91d95d6ddb83d8d2 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 8 Dec 2009 18:22:44 +0300 Subject: [PATCH 08/20] project files skipped --- xml/impl/src/com/intellij/xml/util/XIncludeProvider.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xml/impl/src/com/intellij/xml/util/XIncludeProvider.java b/xml/impl/src/com/intellij/xml/util/XIncludeProvider.java index db5f372f4ccd..66697dc734a9 100644 --- a/xml/impl/src/com/intellij/xml/util/XIncludeProvider.java +++ b/xml/impl/src/com/intellij/xml/util/XIncludeProvider.java @@ -16,6 +16,8 @@ package com.intellij.xml.util; import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.ide.impl.ProjectUtil; +import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.impl.include.FileIncludeInfo; import com.intellij.psi.impl.include.FileIncludeProvider; @@ -38,7 +40,8 @@ public class XIncludeProvider extends FileIncludeProvider { @Override public boolean acceptFile(VirtualFile file) { - return file.getFileType() == XmlFileType.INSTANCE; + FileType fileType = file.getFileType(); + return fileType == XmlFileType.INSTANCE && !ProjectUtil.isProjectOrWorkspaceFile(file, fileType); } @NotNull From 640419e28f3b6c97a4c9772164efe673450564fa Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 12 Jan 2010 20:13:07 +0300 Subject: [PATCH 09/20] advanced IdCache index due to php word scanner change --- .../src/com/intellij/psi/impl/cache/impl/id/IdIndex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndex.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndex.java index 17f221bcf02f..1fe6e28a56f8 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndex.java @@ -84,7 +84,7 @@ public class IdIndex extends FileBasedIndexExtension { }; public int getVersion() { - return 8; + return 9; // TODO: version should enumerate all word scanner versions and build version upon that set } public boolean dependsOnFileContent() { From 3175bb098f9b47c5c90238e3851b17ea24b247b1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 13 Jan 2010 13:37:26 +0300 Subject: [PATCH 10/20] fix artifacts path and library dependency scopes --- platform/lang-impl/lang-impl.iml | 2 +- platform/platform-impl/platform-impl.iml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/lang-impl.iml b/platform/lang-impl/lang-impl.iml index c1022af449fb..5c73b6c6edf3 100644 --- a/platform/lang-impl/lang-impl.iml +++ b/platform/lang-impl/lang-impl.iml @@ -12,7 +12,7 @@ - + diff --git a/platform/platform-impl/platform-impl.iml b/platform/platform-impl/platform-impl.iml index c9fe3c4b0195..ef26efdae698 100644 --- a/platform/platform-impl/platform-impl.iml +++ b/platform/platform-impl/platform-impl.iml @@ -6,7 +6,7 @@ - + From 7188b198d9de1ef9dbb1e053bf989cbd1042ae16 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 13 Jan 2010 14:04:03 +0300 Subject: [PATCH 11/20] fix dependency scopes --- RegExpSupport/RegExpSupport.iml | 2 +- platform/usageView/usageView.iml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/RegExpSupport/RegExpSupport.iml b/RegExpSupport/RegExpSupport.iml index f23b9cfdd71b..f484148c9570 100644 --- a/RegExpSupport/RegExpSupport.iml +++ b/RegExpSupport/RegExpSupport.iml @@ -10,7 +10,7 @@ - + diff --git a/platform/usageView/usageView.iml b/platform/usageView/usageView.iml index 851573b387c6..8c425e159519 100644 --- a/platform/usageView/usageView.iml +++ b/platform/usageView/usageView.iml @@ -9,7 +9,7 @@ - + From 1e1329a076bfe7d978b36a46e4b1cf107445a49c Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 13 Jan 2010 14:50:05 +0300 Subject: [PATCH 12/20] JPS: "provided" depencency scope supported --- build/lib/gant/lib/jps.jar | Bin 1563414 -> 1572135 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/lib/gant/lib/jps.jar b/build/lib/gant/lib/jps.jar index 5a618983c6364840b3eae55cbcd2281eced3b1e4..42b855a2c3bbf427fbf69d2a06aa09a773ca24a4 100644 GIT binary patch delta 39378 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 NT|0=E2p1dp??3db)&2kg From b9fb6c38ae524b68a3fcbd15c5f456756b3a9730 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 13 Jan 2010 14:58:59 +0300 Subject: [PATCH 13/20] IDEADEV-42010 --- .../codeInsight/CodeInsightTestCase.java | 24 +++++++++++--- .../daemon/DaemonAnalyzerTestCase.java | 33 +++++++++++++++---- .../daemon/impl/DaemonListeners.java | 26 ++++++++++++--- 3 files changed, 68 insertions(+), 15 deletions(-) diff --git a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java index c1aa5428a17f..f8b6fcf27453 100644 --- a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java @@ -21,7 +21,9 @@ import com.intellij.injected.editor.EditorWindow; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.command.undo.UndoManager; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; @@ -29,6 +31,8 @@ import com.intellij.openapi.editor.actionSystem.TypedAction; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.fileEditor.TextEditor; +import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.roots.ContentEntry; @@ -112,7 +116,7 @@ public abstract class CodeInsightTestCase extends PsiTestCase { return configureByFiles(projectFile, vFiles); } - protected VirtualFile configureByFile(String filePath, String projectRoot) throws Exception { + protected VirtualFile configureByFile(@NonNls String filePath, String projectRoot) throws Exception { String fullPath = getTestDataPath() + filePath; final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(fullPath.replace(File.separatorChar, '/')); @@ -586,11 +590,21 @@ public abstract class CodeInsightTestCase extends PsiTestCase { } } - protected void backspace() { - EditorActionManager actionManager = EditorActionManager.getInstance(); - EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE); + protected void undo() { + UndoManager undoManager = UndoManager.getInstance(myProject); + TextEditor textEditor = TextEditorProvider.getInstance().getTextEditor(getEditor()); + undoManager.undo(textEditor); + } - actionHandler.execute(getEditor(), DataManager.getInstance().getDataContext()); + protected void backspace() { + CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() { + public void run() { + EditorActionManager actionManager = EditorActionManager.getInstance(); + EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE); + + actionHandler.execute(getEditor(), DataManager.getInstance().getDataContext()); + } + }, "backspace", getEditor().getDocument()); } protected void ctrlShiftF7() { diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index 9d8a94281c48..ea6a40a455e6 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -143,6 +143,8 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { ((StartupManagerImpl)StartupManagerEx.getInstanceEx(getProject())).runStartupActivities(); ((StartupManagerImpl)StartupManagerEx.getInstanceEx(getProject())).runPostStartupActivities(); DaemonCodeAnalyzerSettings.getInstance().setImportHintEnabled(false); + + myRunCommandForTest = wrapInCommand(); } protected void tearDown() throws Exception { @@ -307,17 +309,36 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { public @interface CanChangeDocumentDuringHighlighting {} private boolean canChangeDocumentDuringHighlighting() { + return annotatedWith(CanChangeDocumentDuringHighlighting.class); + } + + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.METHOD, ElementType.TYPE}) + public @interface DoNotWrapInCommand {} + + private boolean wrapInCommand() { + return !annotatedWith(DoNotWrapInCommand.class); + } + + private boolean annotatedWith(Class annotationClass) { String methodName = "test" + getTestName(false); + Class aClass = getClass(); + if (aClass.getAnnotation(annotationClass) != null) return true; Method method = null; - try { - Class aClass = getClass(); - if (aClass.getAnnotation(CanChangeDocumentDuringHighlighting.class) != null) return true; - method = aClass.getDeclaredMethod(methodName); + while (aClass != null) { + try { + method = aClass.getDeclaredMethod(methodName); + break; + } + catch (NoSuchMethodException e) { + aClass = aClass.getSuperclass(); + } } - catch (NoSuchMethodException e) { + if (method == null) { fail(methodName); } - CanChangeDocumentDuringHighlighting annotation = method.getAnnotation(CanChangeDocumentDuringHighlighting.class); + + Object annotation = method.getAnnotation(annotationClass); return annotation != null; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index 012cc01c595c..46fc190dba17 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -29,6 +29,7 @@ import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.command.CommandAdapter; import com.intellij.openapi.command.CommandEvent; import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.command.impl.UndoManagerImpl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.DocCommandGroupId; @@ -269,16 +270,33 @@ public class DaemonListeners implements Disposable { if (file instanceof PsiCodeFragment) return true; Project project = file.getProject(); if (!ModuleUtil.projectContainsFile(project, virtualFile, false)) return false; - if (!FileDocumentManager.getInstance().isFileModified(virtualFile)) return false; + Result vcs = vcsThinksItChanged(virtualFile, project); + if (vcs == Result.CHANGED) return true; + if (vcs == Result.UNCHANGED) return false; + + return canUndo(virtualFile); + } + + private boolean canUndo(VirtualFile virtualFile) { + for (FileEditor editor : FileEditorManager.getInstance(myProject).getEditors(virtualFile)) { + if (UndoManagerImpl.getInstance(myProject).isUndoAvailable(editor)) return true; + } + return false; + } + + private static enum Result { + CHANGED, UNCHANGED, NOT_SURE + } + private Result vcsThinksItChanged(VirtualFile virtualFile, Project project) { FilePath path = new FilePathImpl(virtualFile); boolean vcsIsThinking = !VcsDirtyScopeManager.getInstance(myProject).whatFilesDirty(Arrays.asList(path)).isEmpty(); - if (vcsIsThinking) return false; + if (vcsIsThinking) return Result.UNCHANGED; // do not modify file which is in the process of updating AbstractVcs activeVcs = ProjectLevelVcsManager.getInstance(project).getVcsFor(virtualFile); - if (activeVcs == null) return true; + if (activeVcs == null) return Result.NOT_SURE; FileStatus status = FileStatusManager.getInstance(project).getStatus(virtualFile); - return status == FileStatus.MODIFIED || status == FileStatus.ADDED; + return status == FileStatus.MODIFIED || status == FileStatus.ADDED ? Result.CHANGED : Result.UNCHANGED; } private class MyApplicationListener extends ApplicationAdapter { From 373cd9ecb80facb618c1e787a9ae6b0bc7d22eb8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 13 Jan 2010 15:45:55 +0300 Subject: [PATCH 14/20] dependency scopes corrected --- RegExpSupport/RegExpSupport.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RegExpSupport/RegExpSupport.iml b/RegExpSupport/RegExpSupport.iml index f484148c9570..b9b3142c9ce2 100644 --- a/RegExpSupport/RegExpSupport.iml +++ b/RegExpSupport/RegExpSupport.iml @@ -13,7 +13,7 @@ - + From 2dedf6f40ae1b96406e4eb253ef326448e692169 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 12 Jan 2010 17:59:49 +0300 Subject: [PATCH 15/20] process IOExceptions due to unable to create dir (e.g. com2) --- .../MoveDirectoryWithClassesProcessor.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java index b2cf0d2b546d..097c6777edfe 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java @@ -20,8 +20,10 @@ */ package com.intellij.refactoring.move.moveClassesOrPackages; +import com.intellij.CommonBundle; import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; @@ -150,11 +152,22 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor @Override public void performRefactoring(UsageInfo[] usages) { + //try to create all directories beforehand + for (PsiClass psiClass : myClassesToMove.keySet()) { + try { + myClassesToMove.get(psiClass).findOrCreateTargetDirectory(); + } + catch (IncorrectOperationException e) { + Messages.showErrorDialog(myProject, e.getMessage(), CommonBundle.getErrorTitle()); + return; + } + } final Map oldToNewElementsMapping = new HashMap(); for (PsiClass psiClass : myClassesToMove.keySet()) { ChangeContextUtil.encodeContextInfo(psiClass, true); final RefactoringElementListener listener = getTransaction().getElementListener(psiClass); - final PsiClass newClass = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myClassesToMove.get(psiClass).findOrCreateTargetDirectory()); + final PsiDirectory moveDestination = myClassesToMove.get(psiClass).getTargetDirectory(); + final PsiClass newClass = MoveClassesOrPackagesUtil.doMoveClass(psiClass, moveDestination); oldToNewElementsMapping.put(psiClass, newClass); listener.elementMoved(newClass); } @@ -241,7 +254,7 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor myRelativePath = relativePath; } - public PsiDirectory findOrCreateTargetDirectory() { + public PsiDirectory findOrCreateTargetDirectory() throws IncorrectOperationException{ if (myTargetDirectory == null) { final PsiDirectory root = myParentDirectory.findOrCreateTargetDirectory(); From 2c4a2e887ecb4ee39e7501b4b95534a4f7b94684 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 12 Jan 2010 18:15:09 +0300 Subject: [PATCH 16/20] up/down handling --- .../refactoring/rename/RenameHandlerRegistry.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameHandlerRegistry.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameHandlerRegistry.java index 84081b98783a..9d3994f7bcad 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameHandlerRegistry.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameHandlerRegistry.java @@ -25,6 +25,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.text.StringUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.lang.TitledHandler; +import com.intellij.refactoring.util.RadioUpDownListener; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.Nullable; @@ -101,10 +102,12 @@ public class RenameHandlerRegistry { private static class HandlersChooser extends DialogWrapper { private final String[] myRenamers; private String mySelection; + private JRadioButton[] myRButtons; protected HandlersChooser(Project project, String [] renamers) { super(project); myRenamers = renamers; + myRButtons = new JRadioButton[myRenamers.length]; mySelection = renamers[0]; setTitle(RefactoringBundle.message("select.refactoring.title")); init(); @@ -119,8 +122,10 @@ public class RenameHandlerRegistry { radioPanel.add(descriptionLabel); final ButtonGroup bg = new ButtonGroup(); boolean selected = true; + int rIdx = 0; for (final String renamer : myRenamers) { final JRadioButton rb = new JRadioButton(renamer, selected); + myRButtons[rIdx++] = rb; final ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (rb.isSelected()) { @@ -133,9 +138,15 @@ public class RenameHandlerRegistry { bg.add(rb); radioPanel.add(rb); } + new RadioUpDownListener(myRButtons); return radioPanel; } + @Override + public JComponent getPreferredFocusedComponent() { + return myRButtons[0]; + } + public String getSelection() { return mySelection; } From 8ea7076910dd615f581cad8149e4663e9a1176b7 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 12 Jan 2010 22:18:57 +0300 Subject: [PATCH 17/20] automatic renamer for params in hierarchy (IDEADEV-20861) --- .../refactoring/JavaRefactoringSettings.java | 9 +++ .../naming/AutomaticParametersRenamer.java | 60 +++++++++++++++++++ .../AutomaticParametersRenamerFactory.java | 51 ++++++++++++++++ ...PlaceParamInOverriderAutomaticRenamer.java | 12 ++++ ...aramInOverriderAutomaticRenamer_after.java | 12 ++++ .../intellij/refactoring/RenameLocalTest.java | 6 ++ .../refactoring/rename/RenameProcessor.java | 2 +- .../refactoring/rename/RenameUtil.java | 7 ++- .../inplace/VariableInplaceRenamer.java | 60 ++++++++++++++++++- resources/src/META-INF/IdeaPlugin.xml | 1 + 10 files changed, 214 insertions(+), 6 deletions(-) create mode 100644 java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamer.java create mode 100644 java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamerFactory.java create mode 100644 java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer.java create mode 100644 java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/JavaRefactoringSettings.java b/java/java-impl/src/com/intellij/refactoring/JavaRefactoringSettings.java index 36f6b166b1db..8257f97a4bc2 100644 --- a/java/java-impl/src/com/intellij/refactoring/JavaRefactoringSettings.java +++ b/java/java-impl/src/com/intellij/refactoring/JavaRefactoringSettings.java @@ -95,6 +95,7 @@ public class JavaRefactoringSettings implements PersistentStateComponent usages) { + return new AutomaticParametersRenamer((PsiParameter)element, newName); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer.java b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer.java new file mode 100644 index 000000000000..1638431fba42 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer.java @@ -0,0 +1,12 @@ +public class Test { + int myI; + void foo(int i){ + myI = i; + } +} + +class TestImpl extends Test { + void foo(int i){ + super.foo(i); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer_after.java b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer_after.java new file mode 100644 index 000000000000..a40f1bee5c95 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceParamInOverriderAutomaticRenamer_after.java @@ -0,0 +1,12 @@ +public class Test { + int myI; + void foo(int i){ + myI = i; + } +} + +class TestImpl extends Test { + void foo(int pp){ + super.foo(pp); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java index 250940681e51..5002c9e9754a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java @@ -51,6 +51,10 @@ public class RenameLocalTest extends LightCodeInsightTestCase { doTestInplaceRenameCollisionsResolved("myI"); } + public void testRenameInPlaceParamInOverriderAutomaticRenamer() throws Exception { + doTestInplaceRenameCollisionsResolved("pp"); + } + //reference itself won't be renamed private void doTestInplaceRenameCollisionsResolved(String newName) throws Exception { configureByFile(BASE_PATH + "/" + getTestName(false) + ".java"); @@ -64,6 +68,7 @@ public class RenameLocalTest extends LightCodeInsightTestCase { final ResolveSnapshotProvider.ResolveSnapshot snapshot = resolveSnapshotProvider.createSnapshot(methodScope); assertNotNull(snapshot); + final int offset = element.getTextOffset(); VariableInplaceRenamer renamer = new VariableInplaceRenamer((PsiNameIdentifierOwner)element, getEditor()); ((TemplateManagerImpl)TemplateManager.getInstance(getProject())).setTemplateTesting(true); try { @@ -74,6 +79,7 @@ public class RenameLocalTest extends LightCodeInsightTestCase { snapshot.apply(newName); TemplateManagerImpl.getTemplateState(myEditor).gotoEnd(); + renamer.performAutomaticRename(newName, PsiTreeUtil.getParentOfType(myFile.findElementAt(offset), PsiNameIdentifierOwner.class)); ((TestLookupManager)LookupManager.getInstance(getProject())).clearLookup(); ((TemplateManagerImpl)TemplateManager.getInstance(getProject())).setTemplateTesting(false); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java index 007be49443b0..d200e174bbe0 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java @@ -303,7 +303,7 @@ public class RenameProcessor extends BaseRefactoringProcessor { return myCommandName; } - private static UsageInfo[] extractUsagesForElement(PsiElement element, UsageInfo[] usages) { + public static UsageInfo[] extractUsagesForElement(PsiElement element, UsageInfo[] usages) { final ArrayList extractedUsages = new ArrayList(usages.length); for (UsageInfo usage : usages) { LOG.assertTrue(usage instanceof MoveRenameUsageInfo); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java index 9de2b4f22cf2..495b1c1535ce 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java @@ -42,6 +42,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -182,7 +183,7 @@ public class RenameUtil { } public static void doRenameGenericNamedElement(PsiElement namedElement, String newName, UsageInfo[] usages, - RefactoringElementListener listener) throws IncorrectOperationException { + @Nullable RefactoringElementListener listener) throws IncorrectOperationException { PsiWritableMetaData writableMetaData = null; if (namedElement instanceof PsiMetaOwner) { final PsiMetaData metaData = ((PsiMetaOwner)namedElement).getMetaData(); @@ -224,7 +225,9 @@ public class RenameUtil { } } } - listener.elementRenamed(namedElement); + if (listener != null) { + listener.elementRenamed(namedElement); + } } public static void rename(UsageInfo info, String newName) throws IncorrectOperationException { diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java index 7e4a0e219d04..267ea63d1a31 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java @@ -35,6 +35,7 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; @@ -46,9 +47,15 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.rename.AutomaticRenamingDialog; import com.intellij.refactoring.rename.NameSuggestionProvider; +import com.intellij.refactoring.rename.RenameProcessor; +import com.intellij.refactoring.rename.RenameUtil; +import com.intellij.refactoring.rename.naming.AutomaticRenamer; +import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.TextOccurrencesUtil; +import com.intellij.usageView.UsageInfo; import com.intellij.util.PairProcessor; import com.intellij.util.containers.Stack; import gnu.trove.THashMap; @@ -161,6 +168,7 @@ public class VariableInplaceRenamer { } final PsiElement scope1 = scope; + final int renameOffset = myElementToRename.getTextOffset(); CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @@ -174,17 +182,18 @@ public class VariableInplaceRenamer { Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor); topLevelEditor.getCaretModel().moveToOffset(range.getStartOffset()); TemplateManager.getInstance(myProject).startTemplate(topLevelEditor, template, new TemplateEditingAdapter() { + private String myNewName = null; public void beforeTemplateFinished(final TemplateState templateState, Template template) { finish(); if (snapshot != null) { TextResult value = templateState.getVariableValue(PRIMARY_VARIABLE_NAME); if (value != null) { - final String newName = value.toString(); - if (LanguageNamesValidation.INSTANCE.forLanguage(scope1.getLanguage()).isIdentifier(newName, myProject)) { + myNewName = value.toString(); + if (LanguageNamesValidation.INSTANCE.forLanguage(scope1.getLanguage()).isIdentifier(myNewName, myProject)) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { - snapshot.apply(newName); + snapshot.apply(myNewName); } }); } @@ -192,6 +201,14 @@ public class VariableInplaceRenamer { } } + @Override + public void templateFinished(Template template) { + super.templateFinished(template); + if (myNewName != null) { + performAutomaticRename(myNewName, PsiTreeUtil.getParentOfType(containingFile.findElementAt(renameOffset), PsiNameIdentifierOwner.class)); + } + } + public void templateCancelled(Template template) { finish(); } @@ -218,6 +235,43 @@ public class VariableInplaceRenamer { return true; } + public void performAutomaticRename(final String newName, final PsiElement elementToRename) { + for (AutomaticRenamerFactory renamerFactory : Extensions.getExtensions(AutomaticRenamerFactory.EP_NAME)) { + if (renamerFactory.isApplicable(elementToRename)) { + final List usages = new ArrayList(); + final AutomaticRenamer renamer = + renamerFactory.createRenamer(elementToRename, newName, new ArrayList()); + if (renamer.hasAnythingToRename()) { + if (!ApplicationManager.getApplication().isUnitTestMode()) { + final AutomaticRenamingDialog renamingDialog = new AutomaticRenamingDialog(myProject, renamer); + renamingDialog.show(); + if (!renamingDialog.isOK()) return; + } + + final Runnable runnable = new Runnable() { + public void run() { + renamer.findUsages(usages, false, false); + } + }; + + if (!ProgressManager.getInstance() + .runProcessWithProgressSynchronously(runnable, RefactoringBundle.message("searching.for.variables"), true, myProject)) { + return; + } + + final UsageInfo[] usageInfos = usages.toArray(new UsageInfo[usages.size()]); + for (final PsiNamedElement element : renamer.getRenames().keySet()) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + RenameUtil.doRenameGenericNamedElement(element, renamer.getRenames().get(element), RenameProcessor.extractUsagesForElement(element, usageInfos), null); + } + }); + } + } + } + } + } + private static VirtualFile getTopLevelVirtualFile(final FileViewProvider fileViewProvider) { VirtualFile file = fileViewProvider.getVirtualFile(); if (file instanceof VirtualFileWindow) file = ((VirtualFileWindow)file).getDelegate(); diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index d4bd8dc21166..6b063f5b79fb 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -999,6 +999,7 @@ + From e73eb4f48c2b707b26d0fcbdcea079f1998fe2e6 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 13 Jan 2010 14:34:58 +0300 Subject: [PATCH 18/20] deadlock (IDEADEV-42164) --- .../codeInsight/javadoc/JavaDocExternalFilter.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java index 803735a2e869..1c1462b662be 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java @@ -208,11 +208,12 @@ public class JavaDocExternalFilter { final boolean[] fail = new boolean[1]; final Exception [] ex = new Exception[1]; + final HttpConfigurable httpConfigurable = HttpConfigurable.getInstance(); ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { public void run() { Reader stream = null; try { - stream = getReaderByUrl(url, ProgressManager.getInstance().getProgressIndicator()); + stream = getReaderByUrl(url, httpConfigurable, ProgressManager.getInstance().getProgressIndicator()); } catch (IOException e) { ex[0] = e; @@ -283,7 +284,7 @@ public class JavaDocExternalFilter { @Nullable - private static Reader getReaderByUrl(final String surl, final ProgressIndicator pi) throws IOException { + private static Reader getReaderByUrl(final String surl, final HttpConfigurable httpConfigurable, final ProgressIndicator pi) throws IOException { if (surl.startsWith(JAR_PROTOCOL)) { VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(BrowserUtil.getDocURL(surl)); @@ -295,7 +296,7 @@ public class JavaDocExternalFilter { } URL url = BrowserUtil.getURL(surl); - HttpConfigurable.getInstance().prepareURL(url.toString()); + httpConfigurable.prepareURL(url.toString()); final URLConnection urlConnection = url.openConnection(); final String contentEncoding = urlConnection.getContentEncoding(); final InputStream inputStream = @@ -434,11 +435,13 @@ public class JavaDocExternalFilter { private final String surl; private final MyDocBuilder myBuilder; private final Exception [] myExceptions = new Exception[1]; + private final HttpConfigurable myHttpConfigurable; public MyJavadocFetcher(final String surl, MyDocBuilder builder) { this.surl = surl; myBuilder = builder; ourFree = false; + myHttpConfigurable = HttpConfigurable.getInstance(); } public static boolean isFree() { @@ -457,7 +460,7 @@ public class JavaDocExternalFilter { Reader stream = null; try { - stream = getReaderByUrl(surl, new ProgressIndicatorBase()); + stream = getReaderByUrl(surl, myHttpConfigurable, new ProgressIndicatorBase()); } catch (ProcessCanceledException e) { return; From 783875989201dccd5e72dcc6e84330b0d4626143 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 13 Jan 2010 16:12:13 +0300 Subject: [PATCH 19/20] 1.3 junit compatibility (IDEA-27198) --- .../com/intellij/junit3/TestResultsSender.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit3/TestResultsSender.java b/plugins/junit_rt/src/com/intellij/junit3/TestResultsSender.java index 3eed7b4689a8..da85d0d8ddc5 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/TestResultsSender.java +++ b/plugins/junit_rt/src/com/intellij/junit3/TestResultsSender.java @@ -37,13 +37,17 @@ public class TestResultsSender implements TestListener { } public synchronized void addError(Test test, Throwable throwable) { - if (throwable instanceof AssertionError) { - doAddFailure(test, (Error)throwable); - } - else { - stopMeter(test); - prepareDefectPacket(test, throwable).send(); + try { + final Class aClass = Class.forName("java.lang.AssertionError"); + if (aClass.isInstance(throwable)) { + doAddFailure(test, (Error)throwable); + return; + } } + catch (ClassNotFoundException ignored) {} + + stopMeter(test); + prepareDefectPacket(test, throwable).send(); } public synchronized void addFailure(Test test, AssertionFailedError assertion) { From cfe9a968881b8b84e2b2354ed16d1eb37f4b07e5 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 13 Jan 2010 16:38:39 +0300 Subject: [PATCH 20/20] namespace resolving fixed: do not remove elements from returned sets --- xml/impl/src/com/intellij/xml/DefaultXmlExtension.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index 6ff7f6e00816..26f740e8618b 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -124,8 +124,9 @@ public class DefaultXmlExtension extends XmlExtension { final String name = tag.getLocalName(); final Set byTagName = getNamespacesByTagName(name, file); if (!byTagName.isEmpty()) { - byTagName.removeAll(Arrays.asList(tag.knownNamespaces())); - return byTagName; + Set filtered = new HashSet(byTagName); + filtered.removeAll(Arrays.asList(tag.knownNamespaces())); + return filtered; } final Set set = guessNamespace(file, name); set.removeAll(Arrays.asList(tag.knownNamespaces()));