diff --git a/RegExpSupport/RegExpSupport.iml b/RegExpSupport/RegExpSupport.iml index f23b9cfdd71b..b9b3142c9ce2 100644 --- a/RegExpSupport/RegExpSupport.iml +++ b/RegExpSupport/RegExpSupport.iml @@ -10,10 +10,10 @@ - + - + diff --git a/build/lib/gant/lib/jps.jar b/build/lib/gant/lib/jps.jar index 5a618983c636..42b855a2c3bb 100644 Binary files a/build/lib/gant/lib/jps.jar and b/build/lib/gant/lib/jps.jar differ 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(); } } 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; 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 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(); diff --git a/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamer.java b/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamer.java new file mode 100644 index 000000000000..e522deb8a338 --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamer.java @@ -0,0 +1,60 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * User: anna + * Date: 12-Jan-2010 + */ +package com.intellij.refactoring.rename.naming; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; +import com.intellij.psi.search.searches.OverridingMethodsSearch; + +public class AutomaticParametersRenamer extends AutomaticRenamer { + public AutomaticParametersRenamer(PsiParameter param, String newParamName) { + final PsiElement scope = param.getDeclarationScope(); + if (scope instanceof PsiMethod) { + final PsiMethod method = (PsiMethod)scope; + final int parameterIndex = method.getParameterList().getParameterIndex(param); + + for (PsiMethod overrider : OverridingMethodsSearch.search(method)) { + final PsiParameter inheritedParam = overrider.getParameterList().getParameters()[parameterIndex]; + myElements.add(inheritedParam); + suggestAllNames(inheritedParam.getName(), newParamName); + } + } + } + + public String getDialogTitle() { + return "Rename parameters"; + } + + public String getDialogDescription() { + return "Rename parameter in hierarchy to:"; + } + + @Override + public String entityName() { + return "Parameter"; + } + + @Override + public boolean isSelectedByDefault() { + return true; + } +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamerFactory.java b/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamerFactory.java new file mode 100644 index 000000000000..f19839efe192 --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/rename/naming/AutomaticParametersRenamerFactory.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * User: anna + * Date: 12-Jan-2010 + */ +package com.intellij.refactoring.rename.naming; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; +import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.usageView.UsageInfo; + +import java.util.Collection; + +public class AutomaticParametersRenamerFactory implements AutomaticRenamerFactory{ + public boolean isApplicable(PsiElement element) { + return element instanceof PsiParameter && ((PsiParameter)element).getDeclarationScope() instanceof PsiMethod; + } + + public String getOptionName() { + return "Rename parameters in hierarchy"; + } + + public boolean isEnabled() { + return JavaRefactoringSettings.getInstance().isRenameParameterInHierarchy(); + } + + public void setEnabled(boolean enabled) { + JavaRefactoringSettings.getInstance().setRenameParameterInHierarchy(enabled); + } + + public AutomaticRenamer createRenamer(PsiElement element, String newName, Collection 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/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/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/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 { 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() { 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; } 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/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 @@ - + 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); 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 @@ - + 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()); 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) { 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 @@ + 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()));