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 extends DaemonAnalyzerTestCase> 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()));