diff --git a/build.xml b/build.xml
index 0ee6355da613..fa2c7bd0ee23 100644
--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,7 @@
+
@@ -9,6 +10,7 @@
+
@@ -17,6 +19,8 @@
+
+
@@ -37,5 +41,9 @@
+
+
+
+
diff --git a/java/compiler/impl/src/com/intellij/compiler/make/Cache.java b/java/compiler/impl/src/com/intellij/compiler/make/Cache.java
index 1a008839dc86..2e3d5543214b 100644
--- a/java/compiler/impl/src/com/intellij/compiler/make/Cache.java
+++ b/java/compiler/impl/src/com/intellij/compiler/make/Cache.java
@@ -203,9 +203,9 @@ public class Cache {
}
}
- public int[] getReferencedClasses(int classId) throws CacheCorruptedException {
+ public int[] getReferencedClasses(int qName) throws CacheCorruptedException {
try {
- return myQNameToReferencedClassesMap.getValues(classId);
+ return myQNameToReferencedClassesMap.getValues(qName);
}
catch (Throwable e) {
throw new CacheCorruptedException(e);
diff --git a/java/compiler/impl/src/com/intellij/compiler/make/JavaDependencyProcessor.java b/java/compiler/impl/src/com/intellij/compiler/make/JavaDependencyProcessor.java
index b3566a473091..51283d0bc615 100644
--- a/java/compiler/impl/src/com/intellij/compiler/make/JavaDependencyProcessor.java
+++ b/java/compiler/impl/src/com/intellij/compiler/make/JavaDependencyProcessor.java
@@ -31,10 +31,7 @@ import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.cls.ClsUtil;
-import gnu.trove.TIntHashSet;
-import gnu.trove.TIntObjectHashMap;
-import gnu.trove.TIntObjectIterator;
-import gnu.trove.TIntObjectProcedure;
+import gnu.trove.*;
import org.jetbrains.annotations.NonNls;
import java.util.*;
@@ -304,11 +301,13 @@ class JavaDependencyProcessor {
extractMethods(myAddedMembers, methodsToCheck, false);
if (!MakeUtil.isAnonymous(myDependencyCache.resolve(myQName))) {
- // these checks make no sence for anonymous classes
+ // these checks make no sense for anonymous classes
+
final TIntHashSet fieldNames = new TIntHashSet();
extractFieldNames(myAddedMembers, fieldNames);
int addedFieldsCount = fieldNames.size();
extractFieldNames(myRemovedMembers, fieldNames);
+
if (!fieldNames.isEmpty()) {
cacheNavigator.walkSuperClasses(myQName, new ClassInfoProcessor() {
public boolean process(final int classQName) throws CacheCorruptedException {
@@ -317,6 +316,7 @@ class JavaDependencyProcessor {
}
});
}
+
if (addedFieldsCount > 0 && MakeUtil.isInterface(oldCache.getFlags(myQName))) {
final TIntHashSet visitedClasses = new TIntHashSet();
visitedClasses.add(myQName);
@@ -354,8 +354,60 @@ class JavaDependencyProcessor {
}
});
}
+ // check referencing members in subclasses
+
+ final TIntHashSet addedOrRemovedFields = new TIntHashSet();
+ final TIntHashSet addedOrRemovedMethods = new TIntHashSet();
+ for (Set infos : Arrays.asList(myAddedMembers, myRemovedMembers)) {
+ for (MemberInfo member : infos) {
+ if (!member.isPrivate()) {
+ if (member instanceof FieldInfo) {
+ addedOrRemovedFields.add(member.getName());
+ }
+ else if (member instanceof MethodInfo){
+ addedOrRemovedMethods.add(member.getName());
+ }
+ }
+ }
+
+ }
+ if (!addedOrRemovedFields.isEmpty() || !addedOrRemovedMethods.isEmpty()) {
+ cacheNavigator.walkSubClasses(myQName, new ClassInfoProcessor() {
+ public boolean process(final int subclassQName) throws CacheCorruptedException {
+ if (!myDependencyCache.isClassInfoMarked(subclassQName)) {
+ if (referencesMembersWithNames(oldCache, subclassQName, addedOrRemovedFields, addedOrRemovedMethods)) {
+ final boolean marked = myDependencyCache.markClass(subclassQName);
+ if (marked && LOG.isDebugEnabled()) {
+ LOG.debug("Mark dependent class " + myDependencyCache.resolve(subclassQName) + "; Reason: members were added/removed in superclass with names, that may clash with the names of members of another classes that this class references");
+ }
+ }
+ }
+ return true;
+ }
+ });
+ }
}
}
+
+ private static boolean referencesMembersWithNames(Cache cache, final int qName, TIntHashSet fieldNames, TIntHashSet methodNames) throws CacheCorruptedException {
+ for (final int referencedClass : cache.getReferencedClasses(qName)) {
+ for (Dependency dependency : cache.getBackDependencies(referencedClass)) {
+ if (dependency.getClassQualifiedName() == qName) {
+ for (Dependency.FieldRef ref : dependency.getFieldRefs()) {
+ if (fieldNames.contains(ref.name)) {
+ return true;
+ }
+ }
+ for (Dependency.MethodRef ref : dependency.getMethodRefs()) {
+ if (methodNames.contains(ref.name)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
private void markAnnotationDependenciesRecursively(final Dependency[] dependencies, final @NonNls String reason, final TIntHashSet visitedAnnotations)
throws CacheCorruptedException {
@@ -585,7 +637,9 @@ class JavaDependencyProcessor {
private void markUseDependenciesOnEquivalentMethods(final int checkedInfoQName, Set methodsToCheck, int methodsClassName) throws CacheCorruptedException {
final Dependency[] backDependencies = myDependencyCache.getCache().getBackDependencies(checkedInfoQName);
for (Dependency dependency : backDependencies) {
- if (myDependencyCache.isTargetClassInfoMarked(dependency)) continue;
+ if (myDependencyCache.isTargetClassInfoMarked(dependency)) {
+ continue;
+ }
if (isDependentOnEquivalentMethods(dependency.getMethodRefs(), methodsToCheck)) {
if (myDependencyCache.markTargetClassInfo(dependency)) {
if (LOG.isDebugEnabled()) {
@@ -600,8 +654,7 @@ class JavaDependencyProcessor {
private void markUseDependenciesOnFields(final int classQName, TIntHashSet fieldNames) throws CacheCorruptedException {
final Cache oldCache = myDependencyCache.getCache();
- final Dependency[] backDependencies = oldCache.getBackDependencies(classQName);
- for (Dependency useDependency : backDependencies) {
+ for (Dependency useDependency : oldCache.getBackDependencies(classQName)) {
if (!myDependencyCache.isTargetClassInfoMarked(useDependency)) {
for (Dependency.FieldRef field : useDependency.getFieldRefs()) {
if (fieldNames.contains(field.name)) {
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/DebuggerActions.java b/java/debugger/impl/src/com/intellij/debugger/actions/DebuggerActions.java
index 6b5eadf8ff34..ca323d4ad528 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/DebuggerActions.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/DebuggerActions.java
@@ -37,7 +37,6 @@ public interface DebuggerActions extends XDebuggerActions {
@NonNls String REMOVE_WATCH = "Debugger.RemoveWatch";
@NonNls String NEW_WATCH = "Debugger.NewWatch";
@NonNls String EDIT_WATCH = "Debugger.EditWatch";
- @NonNls String MARK_OBJECT = "Debugger.MarkObject";
@NonNls String COPY_VALUE = "Debugger.CopyValue";
@NonNls String SET_VALUE = "Debugger.SetValue";
@NonNls String EDIT_FRAME_SOURCE = "Debugger.EditFrameSource";
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/MarkObjectAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/JavaMarkObjectActionHandler.java
similarity index 86%
rename from java/debugger/impl/src/com/intellij/debugger/actions/MarkObjectAction.java
rename to java/debugger/impl/src/com/intellij/debugger/actions/JavaMarkObjectActionHandler.java
index 37b129cd385f..18e54211dc45 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/MarkObjectAction.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/JavaMarkObjectActionHandler.java
@@ -16,6 +16,7 @@
package com.intellij.debugger.actions;
import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
+import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
@@ -26,17 +27,18 @@ import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl;
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
import com.intellij.debugger.ui.tree.ValueDescriptor;
-import com.intellij.xdebugger.impl.ui.tree.ValueMarkup;
-import com.intellij.idea.ActionsBundle;
import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.util.containers.HashMap;
+import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler;
+import com.intellij.xdebugger.impl.ui.tree.ValueMarkup;
import com.sun.jdi.*;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -51,14 +53,13 @@ import java.util.Map;
* Class SetValueAction
* @author Jeka
*/
-public class MarkObjectAction extends DebuggerAction {
- private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.actions.MarkObjectAction");
+public class JavaMarkObjectActionHandler extends MarkObjectActionHandler {
+ private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.actions.JavaMarkObjectActionHandler");
public static final long AUTO_MARKUP_REFERRING_OBJECTS_LIMIT = 100L; // todo: some reasonable limit
- private final String MARK_TEXT = ActionsBundle.message("action.Debugger.MarkObject.text");
- private final String UNMARK_TEXT = ActionsBundle.message("action.Debugger.MarkObject.unmark.text");
- public void actionPerformed(final AnActionEvent event) {
- final DebuggerTreeNodeImpl node = getSelectedNode(event.getDataContext());
+ @Override
+ public void perform(@NotNull Project project, AnActionEvent event) {
+ final DebuggerTreeNodeImpl node = DebuggerAction.getSelectedNode(event.getDataContext());
if (node == null) {
return;
}
@@ -233,24 +234,27 @@ public class MarkObjectAction extends DebuggerAction {
return builder.append("
").append(refType.name()).append(".").append(fieldName).append("").toString();
}
+ @Override
+ public boolean isEnabled(@NotNull Project project, AnActionEvent event) {
+ final DebuggerTreeNodeImpl node = DebuggerAction.getSelectedNode(event.getDataContext());
+ return node != null && node.getDescriptor() instanceof ValueDescriptor;
+ }
- public void update(AnActionEvent e) {
- boolean enable = false;
- String text = MARK_TEXT;
- final DebuggerTreeNodeImpl node = getSelectedNode(e.getDataContext());
- if (node != null) {
- final NodeDescriptorImpl descriptor = node.getDescriptor();
- enable = (descriptor instanceof ValueDescriptor);
- if (enable) {
- final ValueMarkup markup = ((ValueDescriptor)descriptor).getMarkup(node.getTree().getDebuggerContext().getDebugProcess());
- if (markup != null) { // already exists
- text = UNMARK_TEXT;
- }
- }
- }
- final Presentation presentation = e.getPresentation();
- presentation.setVisible(enable);
- presentation.setText(text);
+ @Override
+ public boolean isHidden(@NotNull Project project, AnActionEvent event) {
+ return DebuggerAction.getSelectedNode(event.getDataContext()) == null;
+ }
+
+ @Override
+ public boolean isMarked(@NotNull Project project, @NotNull AnActionEvent event) {
+ final DebuggerTreeNodeImpl node = DebuggerAction.getSelectedNode(event.getDataContext());
+ if (node == null) return false;
+
+ final NodeDescriptorImpl descriptor = node.getDescriptor();
+ if (!(descriptor instanceof ValueDescriptor)) return false;
+
+ DebugProcess debugProcess = node.getTree().getDebuggerContext().getDebugProcess();
+ return ((ValueDescriptor)descriptor).getMarkup(debugProcess) != null;
}
public static Color getAutoMarkupColor() {
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ObjectMarkupPropertiesDialog.java b/java/debugger/impl/src/com/intellij/debugger/actions/ObjectMarkupPropertiesDialog.java
index 15ef421bdea1..fe2ac9ee5bf5 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/ObjectMarkupPropertiesDialog.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/ObjectMarkupPropertiesDialog.java
@@ -17,7 +17,7 @@ package com.intellij.debugger.actions;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.ui.ex.MultiLineLabel;
-import com.intellij.xdebugger.impl.ui.tree.ValueMarkerPresentationDialog;
+import com.intellij.xdebugger.impl.ui.tree.ValueMarkerPresentationDialogBase;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -28,7 +28,7 @@ import java.awt.*;
* @author Eugene Zhuravlev
* Date: Feb 4, 2007
*/
-public class ObjectMarkupPropertiesDialog extends ValueMarkerPresentationDialog {
+public class ObjectMarkupPropertiesDialog extends ValueMarkerPresentationDialogBase {
@NonNls private static final String MARK_ALL_REFERENCED_VALUES_KEY = "debugger.mark.all.referenced.values";
private JCheckBox myCbMarkAdditionalFields;
private final boolean mySuggestAdditionalMarkup;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
index 76d5a6985672..71646e033b74 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
@@ -29,8 +29,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.xdebugger.AbstractDebuggerSession;
import com.intellij.xdebugger.impl.DebuggerSupport;
-import com.intellij.xdebugger.impl.actions.DebuggerActionHandler;
-import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler;
+import com.intellij.xdebugger.impl.actions.*;
+import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler;
import com.intellij.xdebugger.impl.breakpoints.ui.AbstractBreakpointPanel;
import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider;
import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler;
@@ -63,6 +63,7 @@ public class JavaDebuggerSupport extends DebuggerSupport {
private final MuteBreakpointsActionHandler myMuteBreakpointsHandler = new MuteBreakpointsActionHandler();
private final DebuggerActionHandler mySmartStepIntoHandler = new SmartStepIntoActionHandler();
private final DebuggerActionHandler myAddToWatchedActionHandler = new AddToWatchActionHandler();
+ private JavaMarkObjectActionHandler myMarkObjectActionHandler = new JavaMarkObjectActionHandler();
@NotNull
public BreakpointPanelProvider> getBreakpointPanelProvider() {
@@ -150,6 +151,12 @@ public class JavaDebuggerSupport extends DebuggerSupport {
return myMuteBreakpointsHandler;
}
+ @NotNull
+ @Override
+ public MarkObjectActionHandler getMarkObjectHandler() {
+ return myMarkObjectActionHandler;
+ }
+
@Override
public AbstractDebuggerSession getCurrentSession(@NotNull Project project) {
final DebuggerContextImpl context = (DebuggerManagerEx.getInstanceEx(project)).getContext();
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java
index fbbcad3b909c..7dd324df7cfa 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java
@@ -19,7 +19,6 @@
*/
package com.intellij.debugger.ui.impl;
-import com.intellij.debugger.actions.DebuggerActions;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.DebuggerStateManager;
import com.intellij.debugger.ui.impl.watch.DebuggerTree;
@@ -30,6 +29,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
import com.intellij.ui.PopupHandler;
+import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import javax.swing.*;
import java.awt.*;
@@ -68,7 +68,7 @@ public abstract class DebuggerTreePanel extends UpdatableDebuggerView implements
final Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts("ToggleBookmark");
final CustomShortcutSet shortcutSet = shortcuts.length > 0? new CustomShortcutSet(shortcuts) : new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0));
- overrideShortcut(myTree, DebuggerActions.MARK_OBJECT, shortcutSet);
+ overrideShortcut(myTree, XDebuggerActions.MARK_OBJECT, shortcutSet);
}
protected abstract DebuggerTree createTreeView();
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
index c1f9de00e9e8..b4e46edf150b 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
@@ -48,6 +48,8 @@ import com.intellij.refactoring.ui.TypeSelectorManagerImpl;
import com.intellij.refactoring.util.occurences.OccurenceManager;
import com.intellij.ui.StateRestoringCheckBox;
import com.intellij.ui.TitlePanel;
+import com.intellij.util.ArrayUtil;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
@@ -261,14 +263,24 @@ public class InplaceIntroduceConstantPopup {
}
public void performInplaceIntroduce() {
- startIntroduceTemplate(false);
+ startIntroduceTemplate(false, null);
}
- private void startIntroduceTemplate(final boolean replaceAllOccurrences) {
+ private void startIntroduceTemplate(final boolean replaceAllOccurrences, @Nullable final PsiType fieldDefaultType) {
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
public void run() {
myTypeSelectorManager.setAllOccurences(replaceAllOccurrences);
- final PsiType defaultType = myTypeSelectorManager.getTypeSelector().getSelectedType();
+ PsiType defaultType = myTypeSelectorManager.getTypeSelector().getSelectedType();
+ if (fieldDefaultType != null) {
+ if (replaceAllOccurrences) {
+ if (ArrayUtil.find(myTypeSelectorManager.getTypesForAll(), fieldDefaultType) != -1) {
+ defaultType = fieldDefaultType;
+ }
+ }
+ else if (ArrayUtil.find(myTypeSelectorManager.getTypesForOne(), fieldDefaultType) != -1) {
+ defaultType = fieldDefaultType;
+ }
+ }
final String propName = myLocalVariable != null ? JavaCodeStyleManager
.getInstance(myProject).variableNameToPropertyName(myLocalVariable.getName(), VariableKind.LOCAL_VARIABLE) : null;
final String[] names = IntroduceConstantDialog.createNameSuggestionGenerator(propName, myExpr, JavaCodeStyleManager.getInstance(myProject))
@@ -337,7 +349,7 @@ public class InplaceIntroduceConstantPopup {
private SmartTypePointer myFieldTypePointer;
public FieldInplaceIntroducer(PsiField field) {
- super(myProject, new TypeExpression(myProject, myTypeSelectorManager.getTypesForAll()),
+ super(myProject, new TypeExpression(myProject, myReplaceAllCb.isSelected() ? myTypeSelectorManager.getTypesForAll() : myTypeSelectorManager.getTypesForOne()),
myEditor, field, false,
myTypeSelectorManager.getTypesForAll().length > 1,
myExpr != null && myExpr.isPhysical() ? myEditor.getDocument().createRangeMarker(myExpr.getTextRange()) : null, InplaceIntroduceConstantPopup.this.getOccurrenceMarkers(),
@@ -456,8 +468,8 @@ public class InplaceIntroduceConstantPopup {
final TemplateState templateState = TemplateManagerImpl.getTemplateState(myEditor);
if (templateState != null) {
templateState.gotoEnd(true);
- myTypeSelectorManager = new TypeSelectorManagerImpl(myProject, myFieldTypePointer.getType(), null, myExpr, myOccurrences);
- startIntroduceTemplate(isReplaceAllOccurrences());
+ myTypeSelectorManager = new TypeSelectorManagerImpl(myProject, myDefaultParameterTypePointer.getType(), null, myExpr, myOccurrences);
+ startIntroduceTemplate(isReplaceAllOccurrences(), myFieldTypePointer.getType());
}
}
});
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
index 1322abf9aa6d..39b4b3df62bc 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
@@ -35,6 +35,8 @@ import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer;
import com.intellij.refactoring.ui.TypeSelectorManagerImpl;
import com.intellij.refactoring.util.occurences.OccurenceManager;
import com.intellij.ui.TitlePanel;
+import com.intellij.util.ArrayUtil;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
@@ -151,15 +153,24 @@ public class InplaceIntroduceFieldPopup {
}
public void startTemplate() {
- startTemplate(false);
+ startTemplate(false, null);
}
- public void startTemplate(final boolean replaceAllOccurrences) {
+ public void startTemplate(final boolean replaceAllOccurrences, @Nullable final PsiType fieldDefaultType) {
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
public void run() {
myTypeSelectorManager.setAllOccurences(replaceAllOccurrences);
- final PsiType defaultType = myTypeSelectorManager.getTypeSelector().getSelectedType();
+ PsiType defaultType = myTypeSelectorManager.getTypeSelector().getSelectedType();
+ if (fieldDefaultType != null) {
+ if (replaceAllOccurrences) {
+ if (ArrayUtil.find(myTypeSelectorManager.getTypesForAll(), fieldDefaultType) != -1) {
+ defaultType = fieldDefaultType;
+ }
+ } else if (ArrayUtil.find(myTypeSelectorManager.getTypesForOne(), fieldDefaultType) != -1){
+ defaultType = fieldDefaultType;
+ }
+ }
final SuggestedNameInfo suggestedNameInfo =
IntroduceFieldDialog.createGenerator(myStatic, myLocalVariable, myInitializerExpression, myLocalVariable != null)
@@ -227,7 +238,7 @@ public class InplaceIntroduceFieldPopup {
private SmartTypePointer myFieldTypePointer;
public FieldInplaceIntroducer(PsiVariable psiVariable) {
- super(myProject, new TypeExpression(myProject, myTypeSelectorManager.getTypesForAll()),
+ super(myProject, new TypeExpression(myProject, myIntroduceFieldPanel.isReplaceAllOccurrences() ? myTypeSelectorManager.getTypesForAll() : myTypeSelectorManager.getTypesForOne()),
myEditor, psiVariable, false,
myTypeSelectorManager.getTypesForAll().length > 1,
myInitializerExpression != null && myInitializerExpression.isPhysical() ? myEditor.getDocument().createRangeMarker(myInitializerExpression.getTextRange()) : null, InplaceIntroduceFieldPopup.this.getOccurrenceMarkers(),
@@ -296,8 +307,8 @@ public class InplaceIntroduceFieldPopup {
final TemplateState templateState = TemplateManagerImpl.getTemplateState(myEditor);
if (templateState != null) {
templateState.gotoEnd(true);
- myTypeSelectorManager = new TypeSelectorManagerImpl(myProject, myFieldTypePointer.getType(), null, myInitializerExpression, myOccurrences);
- startTemplate(myIntroduceFieldPanel.isReplaceAllOccurrences());
+ myTypeSelectorManager = new TypeSelectorManagerImpl(myProject, myDefaultParameterTypePointer.getType(), null, myInitializerExpression, myOccurrences);
+ startTemplate(myIntroduceFieldPanel.isReplaceAllOccurrences(), myFieldTypePointer.getType());
}
}
});
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java
index 63c3e400c22a..708f256124e3 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java
@@ -116,7 +116,9 @@ public abstract class IntroduceFieldCentralPanel {
if (myCbReplaceAll != null && myAllowInitInMethod) {
updateInitializerSelection();
}
- updateTypeSelector();
+ if (shouldUpdateTypeSelector()) {
+ updateTypeSelector();
+ }
}
};
ItemListener finalUpdater = new ItemListener() {
@@ -137,6 +139,10 @@ public abstract class IntroduceFieldCentralPanel {
protected void updateInitializerSelection() {
}
+ protected boolean shouldUpdateTypeSelector() {
+ return true;
+ }
+
private JPanel appendCheckboxes(ItemListener itemListener) {
GridBagConstraints gbConstraints = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0);
JPanel panel = new JPanel(new GridBagLayout());
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java
index 7459de29e621..18d512e77e47 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java
@@ -232,6 +232,11 @@ public class IntroduceFieldPopupPanel extends IntroduceFieldCentralPanel {
return allowFinal;
}
+ @Override
+ protected boolean shouldUpdateTypeSelector() {
+ return false;
+ }
+
protected JPanel composeWholePanel(JComponent initializerPlacePanel, JPanel checkboxPanel) {
final JPanel panel = new JPanel(new GridBagLayout());
final GridBagConstraints constraints =
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
index 01c6be53da7d..26e83f1db733 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
@@ -456,8 +456,9 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase impleme
final IntroduceVariableSettings settings =
getSettings(project, editor, expr, occurrences, typeSelectorManager, inFinalContext, hasWriteAccess, validator, choice);
if (!settings.isOK()) return;
- typeSelectorManager.setAllOccurences(choice != OccurrencesChooser.ReplaceChoice.NO);
- final TypeExpression expression = new TypeExpression(project, typeSelectorManager.getTypesForAll());
+ final boolean allOccurences = choice != OccurrencesChooser.ReplaceChoice.NO;
+ typeSelectorManager.setAllOccurences(allOccurences);
+ final TypeExpression expression = new TypeExpression(project, allOccurences ? typeSelectorManager.getTypesForAll() : typeSelectorManager.getTypesForOne());
final RangeMarker exprMarker = editor.getDocument().createRangeMarker(expr.getTextRange());
final SuggestedNameInfo suggestedName = getSuggestedName(settings.getSelectedType(), expr);
final List occurrenceMarkers = new ArrayList();
diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java
index 79f624db5293..e1d2f4a31f95 100644
--- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java
+++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java
@@ -179,10 +179,12 @@ public class PullUpConflictsUtil {
}
});
if (abstractMethod.hasModifierProperty(PsiModifier.PACKAGE_LOCAL) && toDifferentPackage) {
- String message = "Can't make " + RefactoringUIUtil.getDescription(abstractMethod, false) +
- " abstract as it won't be accessible from the subclass.";
- message = CommonRefactoringUtil.capitalize(message);
- conflicts.putValue(abstractMethod, message);
+ if (!isInterfaceTarget) {
+ String message = "Can't make " + RefactoringUIUtil.getDescription(abstractMethod, false) +
+ " abstract as it won't be accessible from the subclass.";
+ message = CommonRefactoringUtil.capitalize(message);
+ conflicts.putValue(abstractMethod, message);
+ }
}
}
return conflicts;
diff --git a/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java b/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java
index a4ae0cdf045b..cb7e3f16398b 100644
--- a/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java
+++ b/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java
@@ -133,6 +133,10 @@ public class TypeSelectorManagerImpl implements TypeSelectorManager {
return myTypesForAll;
}
+ public PsiType[] getTypesForOne() {
+ return myTypesForMain;
+ }
+
public PsiType getDefaultType() {
if (myDefaultType.isValid()) {
return myDefaultType;
diff --git a/java/openapi/src/com/intellij/util/xml/converters/AbstractMemberResolveConverter.java b/java/openapi/src/com/intellij/util/xml/converters/AbstractMemberResolveConverter.java
index 2a47dfa735e6..740dbb9e58d3 100644
--- a/java/openapi/src/com/intellij/util/xml/converters/AbstractMemberResolveConverter.java
+++ b/java/openapi/src/com/intellij/util/xml/converters/AbstractMemberResolveConverter.java
@@ -51,15 +51,14 @@ public abstract class AbstractMemberResolveConverter extends ResolvingConverter<
return true;
}
- protected boolean isPropertyNameUsed() {
- return true;
+ protected String getPropertyName(final String s, final ConvertContext context) {
+ return s;
}
public PsiMember fromString(final String s, final ConvertContext context) {
if (s == null) return null;
final PsiClass psiClass = getTargetClass(context);
if (psiClass == null) return null;
- final String propertyName = isPropertyNameUsed() ? s : PropertyUtil.getPropertyName(s);
for (PropertyMemberType type : getMemberTypes(context)) {
switch (type) {
case FIELD:
@@ -67,11 +66,11 @@ public abstract class AbstractMemberResolveConverter extends ResolvingConverter<
if (field != null) return field;
break;
case GETTER:
- final PsiMethod getter = PropertyUtil.findPropertyGetter(psiClass, propertyName, false, isLookDeep());
+ final PsiMethod getter = PropertyUtil.findPropertyGetter(psiClass, getPropertyName(s, context), false, isLookDeep());
if (getter != null) return getter;
break;
case SETTER:
- final PsiMethod setter = PropertyUtil.findPropertySetter(psiClass, propertyName, false, isLookDeep());
+ final PsiMethod setter = PropertyUtil.findPropertySetter(psiClass, getPropertyName(s, context), false, isLookDeep());
if (setter != null) return setter;
break;
}
@@ -80,9 +79,8 @@ public abstract class AbstractMemberResolveConverter extends ResolvingConverter<
}
-
public String toString(final PsiMember t, final ConvertContext context) {
- return t == null? null : isPropertyNameUsed()? PropertyUtil.getPropertyName(t) : t.getName();
+ return t == null? null : getPropertyName(t.getName(), context);
}
public String getErrorMessage(final String s, final ConvertContext context) {
@@ -131,13 +129,13 @@ public abstract class AbstractMemberResolveConverter extends ResolvingConverter<
}
public void handleElementRename(final GenericDomValue genericValue, final ConvertContext context, final String newElementName) {
- super.handleElementRename(genericValue, context, isPropertyNameUsed()? PropertyUtil.getPropertyName(newElementName) : newElementName);
+ super.handleElementRename(genericValue, context, getPropertyName(newElementName, context));
}
public void bindReference(final GenericDomValue genericValue, final ConvertContext context, final PsiElement newTarget) {
if (newTarget instanceof PsiMember) {
final String elementName = ((PsiMember)newTarget).getName();
- genericValue.setStringValue(isPropertyNameUsed() ? PropertyUtil.getPropertyName(elementName) : elementName);
+ genericValue.setStringValue(getPropertyName(elementName, context));
}
}
}
\ No newline at end of file
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
index 0caed03d9f5c..e1100feb35fe 100644
--- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
@@ -40,6 +40,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.util.containers.HashMap;
+import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -281,17 +282,22 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
return myCurrentInfo;
}
+ private final @NonNls String PASTE_COMMAND_NAME = EditorBundle.message("paste.command.name");
+ private final @NonNls String TYPING_COMMAND_NAME = EditorBundle.message("typing.in.editor.command.name");
+
@Override
public void beforeDocumentChange(DocumentEvent e) {
if (myDeaf) return;
if (myInitialText == null) {
final Document document = e.getDocument();
final PsiDocumentManager documentManager = myPsiDocumentManager;
+
if (!documentManager.isUncommited(document)) {
final CommandProcessor processor = CommandProcessor.getInstance();
final String currentCommandName = processor.getCurrentCommandName();
- if (!Comparing.strEqual(EditorBundle.message("typing.in.editor.command.name"), currentCommandName) &&
- !Comparing.strEqual(EditorBundle.message("paste.command.name"), currentCommandName) &&
+
+ if (!Comparing.strEqual(TYPING_COMMAND_NAME, currentCommandName) &&
+ !Comparing.strEqual(PASTE_COMMAND_NAME, currentCommandName) &&
!Comparing.strEqual("Cut", currentCommandName) &&
!Comparing.strEqual(LanguageChangeSignatureDetector.MOVE_PARAMETER, currentCommandName) &&
!Comparing.equal(EditorActionUtil.DELETE_COMMAND_GROUP, processor.getCurrentCommandGroupId())) {
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 509b6dee0a40..a1a4ea9afca6 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
@@ -413,9 +413,11 @@ public class VariableInplaceRenamer {
ourRenamersStack.pop();
}
if (myHighlighters != null) {
- final HighlightManager highlightManager = HighlightManager.getInstance(myProject);
- for (RangeHighlighter highlighter : myHighlighters) {
- highlightManager.removeSegmentHighlighter(myEditor, highlighter);
+ if (!myProject.isDisposed()) {
+ final HighlightManager highlightManager = HighlightManager.getInstance(myProject);
+ for (RangeHighlighter highlighter : myHighlighters) {
+ highlightManager.removeSegmentHighlighter(myEditor, highlighter);
+ }
}
myHighlighters = null;
diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml
index f2e736bea908..78e3728bee67 100644
--- a/platform/platform-resources/src/idea/LangActions.xml
+++ b/platform/platform-resources/src/idea/LangActions.xml
@@ -672,6 +672,7 @@
icon="/debugger/muteBreakpoints.png"/>
+
@@ -699,12 +700,14 @@
+
@@ -717,6 +720,7 @@
+
@@ -727,6 +731,7 @@