From 9e97765f2828047eaf1777be4b3ba4863d699d6c Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 15 Apr 2011 15:30:42 +0200 Subject: [PATCH 01/14] EA-26942 - assert: ComponentManagerImpl.getComponent (on close project with active inplace rename) --- .../rename/inplace/VariableInplaceRenamer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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; From 87ba84e74e0f6163494c0e49b8aa2322a5ae89e0 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 15 Apr 2011 15:56:58 +0200 Subject: [PATCH 02/14] push package local method up to interface: make method public without any warning --- .../refactoring/memberPullUp/PullUpConflictsUtil.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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; From 54213ca6343916fcd54d773f2e80e5cdda78e62d Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 15 Apr 2011 18:29:42 +0400 Subject: [PATCH 03/14] 'Mark Object' action in xdebugger --- .../debugger/actions/DebuggerActions.java | 1 - ....java => JavaMarkObjectActionHandler.java} | 56 ++++++----- .../actions/ObjectMarkupPropertiesDialog.java | 4 +- .../debugger/ui/JavaDebuggerSupport.java | 11 ++- .../debugger/ui/impl/DebuggerTreePanel.java | 4 +- .../src/idea/LangActions.xml | 5 + .../com/intellij/xdebugger/XDebugProcess.java | 10 ++ .../evaluation/XDebuggerEvaluator.java | 1 - .../xdebugger/frame/XValueMarkerProvider.java | 68 +++++++++++++ .../xdebugger/impl/DebuggerSupport.java | 7 +- .../xdebugger/impl/XDebugSessionImpl.java | 15 +++ .../xdebugger/impl/XDebuggerSupport.java | 9 ++ .../impl/actions/MarkObjectAction.java | 64 ++++++++++++ .../impl/actions/MarkObjectActionHandler.java | 27 ++++++ .../impl/actions/XDebuggerActions.java | 1 + .../handlers/XMarkObjectActionHandler.java | 90 +++++++++++++++++ .../xdebugger/impl/frame/XValueMarkers.java | 77 +++++++++++++++ .../tree/ValueMarkerPresentationDialog.java | 77 +-------------- ...=> ValueMarkerPresentationDialogBase.form} | 2 +- .../ValueMarkerPresentationDialogBase.java | 97 +++++++++++++++++++ .../xdebugger/impl/ui/tree/XDebuggerTree.java | 3 + .../impl/ui/tree/XInspectDialog.java | 3 +- .../tree/actions/XDebuggerTreeActionBase.java | 2 +- .../impl/ui/tree/nodes/XStackFrameNode.java | 3 +- .../ui/tree/nodes/XValueContainerNode.java | 3 +- .../impl/ui/tree/nodes/XValueNodeImpl.java | 12 ++- resources/src/idea/IdeaActions.xml | 1 - 27 files changed, 538 insertions(+), 115 deletions(-) rename java/debugger/impl/src/com/intellij/debugger/actions/{MarkObjectAction.java => JavaMarkObjectActionHandler.java} (86%) create mode 100644 platform/xdebugger-api/src/com/intellij/xdebugger/frame/XValueMarkerProvider.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectAction.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectActionHandler.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XValueMarkers.java rename platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/{ValueMarkerPresentationDialog.form => ValueMarkerPresentationDialogBase.form} (99%) create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java 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/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 @@ + diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugProcess.java b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugProcess.java index 9a2079acb9b4..f40c0b90db7f 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugProcess.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugProcess.java @@ -24,6 +24,7 @@ import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.xdebugger.breakpoints.XBreakpointHandler; import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider; +import com.intellij.xdebugger.frame.XValueMarkerProvider; import com.intellij.xdebugger.stepping.XSmartStepIntoHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -161,6 +162,15 @@ public abstract class XDebugProcess { return consoleBuilder.getConsole(); } + /** + * Override this method to enable 'Mark Object' action + * @return new instance of {@link XValueMarkerProvider}'s implementation or {@code null} if 'Mark Object' feature isn't supported + */ + @Nullable + public XValueMarkerProvider createValueMarkerProvider() { + return null; + } + /** * Override this method to provide additional tabs for 'Debug' tool window */ diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/evaluation/XDebuggerEvaluator.java b/platform/xdebugger-api/src/com/intellij/xdebugger/evaluation/XDebuggerEvaluator.java index b7723c2874d6..2278aa06af48 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/evaluation/XDebuggerEvaluator.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/evaluation/XDebuggerEvaluator.java @@ -116,7 +116,6 @@ public abstract class XDebuggerEvaluator { * Override this method to format selected text before it is shown in 'Evaluate' dialog */ @NotNull - @SuppressWarnings({"MethodMayBeStatic"}) public String formatTextForEvaluation(@NotNull String text) { return text; } diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XValueMarkerProvider.java b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XValueMarkerProvider.java new file mode 100644 index 000000000000..07aa065b02e5 --- /dev/null +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/frame/XValueMarkerProvider.java @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.frame; + +import org.jetbrains.annotations.NotNull; + +/** + * Provides implementation of 'Mark Object' feature.

+ * + * If debugger values have unique ids just return these ids from {@link #getMarker(XValue)} method. + * Alternatively implement {@link #markValue(XValue)} to store a value in some registry and implement {@link #unmarkValue(XValue, Object)} + * to remote it from the registry. In such a case the {@link #getMarker(XValue)} method can return {@code null} if the {@code value} isn't marked. + * + * @author nik + */ +public abstract class XValueMarkerProvider { + private final Class myValueClass; + + protected XValueMarkerProvider(Class valueClass) { + myValueClass = valueClass; + } + + /** + * @return {@code true} if 'Mark Object' action should be enabled for {@code value} + */ + public abstract boolean canMark(@NotNull V value); + + /** + * This method is used to determine whether the {@code value} was marked or not. The returned object is compared using {@link Object#equals(Object)} + * method with markers returned by {@link #markValue(XValue)} methods.

+ * This method may return {@code null} if the {@code value} wasn't marked by {@link #markValue(XValue)} method. + * @return a marker for {@code value} + */ + public abstract M getMarker(@NotNull V value); + + /** + * This method is called when 'Mark Object' action is invoked. Return an unique marker for {@code value} and store it in some registry + * if necessary. + * @return a marker for {@code value} + */ + @NotNull + public M markValue(@NotNull V value) { + return getMarker(value); + } + + /** + * This method is called when 'Unmark Object' action is invoked. + */ + public void unmarkValue(@NotNull V value, @NotNull M marker) { + } + + public final Class getValueClass() { + return myValueClass; + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java index 5b3394d8fa4a..9dc881326df8 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.xdebugger.AbstractDebuggerSession; import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler; +import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider; @@ -33,7 +34,7 @@ import org.jetbrains.annotations.Nullable; public abstract class DebuggerSupport { private static final ExtensionPointName EXTENSION_POINT = ExtensionPointName.create("com.intellij.xdebugger.debuggerSupport"); - @NotNull + @NotNull public static DebuggerSupport[] getDebuggerSupports() { return Extensions.getExtensions(EXTENSION_POINT); } @@ -96,6 +97,10 @@ public abstract class DebuggerSupport { @NotNull public abstract DebuggerToggleActionHandler getMuteBreakpointsHandler(); + @NotNull + public abstract MarkObjectActionHandler getMarkObjectHandler(); + + @Nullable public abstract AbstractDebuggerSession getCurrentSession(@NotNull Project project); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java index ea8d0cfa129f..22affa7ee12c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java @@ -29,6 +29,7 @@ import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunnerLayoutUi; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.Result; import com.intellij.openapi.diagnostic.Logger; @@ -46,8 +47,10 @@ import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; import com.intellij.xdebugger.frame.XExecutionStack; import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.frame.XSuspendContext; +import com.intellij.xdebugger.frame.XValueMarkerProvider; import com.intellij.xdebugger.impl.breakpoints.*; import com.intellij.xdebugger.impl.evaluate.quick.common.ValueLookupManager; +import com.intellij.xdebugger.impl.frame.XValueMarkers; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import com.intellij.xdebugger.impl.ui.XDebugSessionData; import com.intellij.xdebugger.impl.ui.XDebugSessionTab; @@ -78,6 +81,7 @@ public class XDebugSessionImpl implements XDebugSession { private XSourcePosition myCurrentPosition; private boolean myPaused; private MyDependentBreakpointListener myDependentBreakpointListener; + private XValueMarkers myValueMarkers; private String mySessionName; private XDebugSessionTab mySessionTab; private XDebugSessionData mySessionData; @@ -255,6 +259,17 @@ public class XDebugSessionImpl implements XDebugSession { ExecutionManager.getInstance(getProject()).getContentManager().showRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), descriptor); } + public XValueMarkers getValueMarkers() { + ApplicationManager.getApplication().assertIsDispatchThread(); + if (myValueMarkers == null) { + XValueMarkerProvider provider = myDebugProcess.createValueMarkerProvider(); + if (provider != null) { + myValueMarkers = XValueMarkers.createValueMarkers(provider); + } + } + return myValueMarkers; + } + private static > XBreakpointType getBreakpointTypeClass(final XBreakpointHandler handler) { return XDebuggerUtil.getInstance().findBreakpointType(handler.getBreakpointTypeClass()); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerSupport.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerSupport.java index f1a33999d901..4a5858d3c598 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerSupport.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerSupport.java @@ -22,6 +22,7 @@ import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler; +import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; import com.intellij.xdebugger.impl.actions.XDebuggerSuspendedActionHandler; import com.intellij.xdebugger.impl.actions.handlers.*; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; @@ -54,6 +55,7 @@ public class XDebuggerSupport extends DebuggerSupport { private final XAddToWatchesFromEditorActionHandler myAddToWatchesActionHandler; private final DebuggerToggleActionHandler myMuteBreakpointsHandler; private final DebuggerActionHandler mySmartStepIntoHandler; + private final XMarkObjectActionHandler myMarkObjectActionHandler; public XDebuggerSupport() { myBreakpointPanelProvider = new XBreakpointPanelProvider(); @@ -106,6 +108,7 @@ public class XDebuggerSupport extends DebuggerSupport { myEvaluateHandler = new XDebuggerEvaluateActionHandler(); myQuickEvaluateHandler = new XQuickEvaluateHandler(); mySettingsPanelProvider = new XDebuggerSettingsPanelProviderImpl(); + myMarkObjectActionHandler = new XMarkObjectActionHandler(); } @NotNull @@ -194,6 +197,12 @@ public class XDebuggerSupport extends DebuggerSupport { return myMuteBreakpointsHandler; } + @NotNull + @Override + public MarkObjectActionHandler getMarkObjectHandler() { + return myMarkObjectActionHandler; + } + @Override public AbstractDebuggerSession getCurrentSession(@NotNull Project project) { return XDebuggerManager.getInstance(project).getCurrentSession(); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectAction.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectAction.java new file mode 100644 index 000000000000..a4d08501bb3e --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectAction.java @@ -0,0 +1,64 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.impl.actions; + +import com.intellij.idea.ActionsBundle; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.project.Project; +import com.intellij.xdebugger.impl.DebuggerSupport; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class MarkObjectAction extends XDebuggerActionBase { + @Override + public void update(AnActionEvent event) { + Project project = event.getData(PlatformDataKeys.PROJECT); + boolean enabled = false; + Presentation presentation = event.getPresentation(); + boolean hidden = true; + if (project != null) { + for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { + MarkObjectActionHandler handler = support.getMarkObjectHandler(); + hidden &= handler.isHidden(project, event); + if (handler.isEnabled(project, event)) { + enabled = true; + String text; + if (handler.isMarked(project, event)) { + text = ActionsBundle.message("action.Debugger.MarkObject.unmark.text"); + } + else { + text = ActionsBundle.message("action.Debugger.MarkObject.text"); + } + presentation.setText(text); + break; + } + } + } + presentation.setVisible(!hidden && (!ActionPlaces.isPopupPlace(event.getPlace()) || enabled)); + presentation.setEnabled(enabled); + } + + @NotNull + @Override + protected DebuggerActionHandler getHandler(@NotNull DebuggerSupport debuggerSupport) { + return debuggerSupport.getMarkObjectHandler(); + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectActionHandler.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectActionHandler.java new file mode 100644 index 000000000000..e5a965ab37dc --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/MarkObjectActionHandler.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.impl.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class MarkObjectActionHandler extends DebuggerActionHandler { + public abstract boolean isMarked(@NotNull Project project, @NotNull AnActionEvent event); +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/XDebuggerActions.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/XDebuggerActions.java index 4819bbe1574d..5e3de16c1ebd 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/XDebuggerActions.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/XDebuggerActions.java @@ -62,4 +62,5 @@ public interface XDebuggerActions { @NonNls String TOGGLE_SORT_VALUES = "XDebugger.ToggleSortValues"; @NonNls String AUTO_TOOLTIP = "XDebugger.AutoTooltip"; + @NonNls String MARK_OBJECT = "Debugger.MarkObject"; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java new file mode 100644 index 000000000000..c3a9b9842661 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java @@ -0,0 +1,90 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.impl.actions.handlers; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.intellij.xdebugger.XDebugSession; +import com.intellij.xdebugger.XDebuggerManager; +import com.intellij.xdebugger.frame.XValue; +import com.intellij.xdebugger.impl.XDebugSessionImpl; +import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; +import com.intellij.xdebugger.impl.frame.XValueMarkers; +import com.intellij.xdebugger.impl.ui.tree.ValueMarkerPresentationDialog; +import com.intellij.xdebugger.impl.ui.tree.ValueMarkup; +import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase; +import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author nik + */ +public class XMarkObjectActionHandler extends MarkObjectActionHandler { + @Override + public void perform(@NotNull Project project, AnActionEvent event) { + XDebugSession session = XDebuggerManager.getInstance(project).getCurrentSession(); + if (session == null) return; + + XValueMarkers markers = ((XDebugSessionImpl)session).getValueMarkers(); + XValueNodeImpl node = XDebuggerTreeActionBase.getSelectedNode(event.getDataContext()); + if (markers == null || node == null) return; + XValue value = node.getValueContainer(); + + ValueMarkup existing = markers.getMarkup(value); + if (existing != null) { + markers.unmarkValue(value); + } + else { + ValueMarkerPresentationDialog dialog = new ValueMarkerPresentationDialog(node.getName()); + dialog.show(); + ValueMarkup markup = dialog.getConfiguredMarkup(); + if (dialog.isOK() && markup != null) { + markers.markValue(value, markup); + } + } + session.rebuildViews(); + } + + @Override + public boolean isEnabled(@NotNull Project project, AnActionEvent event) { + XValueMarkers markers = getValueMarkers(project); + if (markers == null) return false; + + XValue value = XDebuggerTreeActionBase.getSelectedValue(event.getDataContext()); + return value != null && markers.canMarkValue(value); + } + + @Override + public boolean isMarked(@NotNull Project project, @NotNull AnActionEvent event) { + XValueMarkers markers = getValueMarkers(project); + if (markers == null) return false; + + XValue value = XDebuggerTreeActionBase.getSelectedValue(event.getDataContext()); + return value != null && markers.getMarkup(value) != null; + } + + @Override + public boolean isHidden(@NotNull Project project, AnActionEvent event) { + return getValueMarkers(project) == null; + } + + @Nullable + private static XValueMarkers getValueMarkers(@NotNull Project project) { + XDebugSession session = XDebuggerManager.getInstance(project).getCurrentSession(); + return session != null ? ((XDebugSessionImpl)session).getValueMarkers() : null; + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XValueMarkers.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XValueMarkers.java new file mode 100644 index 000000000000..56d34dafd6fa --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XValueMarkers.java @@ -0,0 +1,77 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.impl.frame; + +import com.intellij.xdebugger.frame.XValue; +import com.intellij.xdebugger.frame.XValueMarkerProvider; +import com.intellij.xdebugger.impl.ui.tree.ValueMarkup; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author nik + */ +public class XValueMarkers { + private final XValueMarkerProvider myProvider; + private final Map myMarkers; + + private XValueMarkers(@NotNull XValueMarkerProvider provider) { + myProvider = provider; + myMarkers = new HashMap(); + } + + public static XValueMarkers createValueMarkers(@NotNull XValueMarkerProvider provider) { + return new XValueMarkers(provider); + } + + @Nullable + public ValueMarkup getMarkup(@NotNull XValue value) { + Class valueClass = myProvider.getValueClass(); + if (!valueClass.isInstance(value)) return null; + + V v = valueClass.cast(value); + if (!myProvider.canMark(v)) return null; + + M m = myProvider.getMarker(v); + if (m == null) return null; + + return myMarkers.get(m); + } + + public boolean canMarkValue(@NotNull XValue value) { + Class valueClass = myProvider.getValueClass(); + if (!valueClass.isInstance(value)) return false; + + return myProvider.canMark(valueClass.cast(value)); + } + + public void markValue(@NotNull XValue value, @NotNull ValueMarkup markup) { + //noinspection unchecked + M m = myProvider.markValue((V)value); + myMarkers.put(m, markup); + } + + public void unmarkValue(@NotNull XValue value) { + //noinspection unchecked + M m = myProvider.getMarker((V)value); + if (m != null) { + myMarkers.remove(m); + } + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java index 57164045b3d8..4e164cc7fd15 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java @@ -15,83 +15,14 @@ */ package com.intellij.xdebugger.impl.ui.tree; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.ui.FixedSizeButton; -import com.intellij.ui.ColorChooser; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.SimpleColoredComponent; -import com.intellij.ui.SimpleTextAttributes; import org.jetbrains.annotations.Nullable; -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - /** * @author nik */ -public abstract class ValueMarkerPresentationDialog extends DialogWrapper { - private static final Color DEFAULT_COLOR = Color.RED; - private SimpleColoredComponent myColorSample; - private Color myColor; - private JPanel myMainPanel; - private JTextField myLabelField; - private FixedSizeButton myChooseColorButton; - private JPanel mySamplePanel; - - public ValueMarkerPresentationDialog(final @Nullable String defaultText) { - super(true); - setTitle("Select Object Label"); - setModal(true); - myLabelField.getDocument().addDocumentListener(new DocumentAdapter() { - protected void textChanged(final DocumentEvent e) { - updateLabelSample(); - } - }); - myChooseColorButton.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent e) { - final Color color = ColorChooser.chooseColor(myColorSample, "Choose Label Color", myColor); - if (color != null) { - myColor = color; - updateLabelSample(); - } - } - }); - myColor = DEFAULT_COLOR; - if (defaultText != null) { - myLabelField.setText(defaultText.trim()); - updateLabelSample(); - } - } - - public JComponent getPreferredFocusedComponent() { - return myLabelField; - } - - @Override - protected JComponent createCenterPanel() { - return myMainPanel; - } - - private void updateLabelSample() { - myColorSample.clear(); - SimpleTextAttributes attributes = new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, myColor); - myColorSample.append(myLabelField.getText().trim(), attributes); - } - - @Nullable - public ValueMarkup getConfiguredMarkup() { - final String text = myLabelField.getText().trim(); - return text.isEmpty() ? null : new ValueMarkup(text, myColor, null); - } - - private void createUIComponents() { - myColorSample = new SimpleColoredComponent(); - mySamplePanel = new JPanel(new BorderLayout()); - mySamplePanel.setBorder(BorderFactory.createEtchedBorder()); - mySamplePanel.add(BorderLayout.CENTER, myColorSample); - myChooseColorButton = new FixedSizeButton(mySamplePanel); +public class ValueMarkerPresentationDialog extends ValueMarkerPresentationDialogBase { + public ValueMarkerPresentationDialog(@Nullable String defaultText) { + super(defaultText); + init(); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.form b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.form similarity index 99% rename from platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.form rename to platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.form index 1a09d3670a7a..ed01c69a295b 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.form +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.form @@ -1,5 +1,5 @@ -

+ diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java new file mode 100644 index 000000000000..3633c553e57e --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java @@ -0,0 +1,97 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.xdebugger.impl.ui.tree; + +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.FixedSizeButton; +import com.intellij.ui.ColorChooser; +import com.intellij.ui.DocumentAdapter; +import com.intellij.ui.SimpleColoredComponent; +import com.intellij.ui.SimpleTextAttributes; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * @author nik + */ +public abstract class ValueMarkerPresentationDialogBase extends DialogWrapper { + private static final Color DEFAULT_COLOR = Color.RED; + private SimpleColoredComponent myColorSample; + private Color myColor; + private JPanel myMainPanel; + private JTextField myLabelField; + private FixedSizeButton myChooseColorButton; + private JPanel mySamplePanel; + + public ValueMarkerPresentationDialogBase(final @Nullable String defaultText) { + super(true); + setTitle("Select Object Label"); + setModal(true); + myLabelField.getDocument().addDocumentListener(new DocumentAdapter() { + protected void textChanged(final DocumentEvent e) { + updateLabelSample(); + } + }); + myChooseColorButton.addActionListener(new ActionListener() { + public void actionPerformed(final ActionEvent e) { + final Color color = ColorChooser.chooseColor(myColorSample, "Choose Label Color", myColor); + if (color != null) { + myColor = color; + updateLabelSample(); + } + } + }); + myColor = DEFAULT_COLOR; + if (defaultText != null) { + myLabelField.setText(defaultText.trim()); + updateLabelSample(); + } + } + + public JComponent getPreferredFocusedComponent() { + return myLabelField; + } + + @Override + protected JComponent createCenterPanel() { + return myMainPanel; + } + + private void updateLabelSample() { + myColorSample.clear(); + SimpleTextAttributes attributes = new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, myColor); + myColorSample.append(myLabelField.getText().trim(), attributes); + } + + @Nullable + public ValueMarkup getConfiguredMarkup() { + final String text = myLabelField.getText().trim(); + return text.isEmpty() ? null : new ValueMarkup(text, myColor, null); + } + + private void createUIComponents() { + myColorSample = new SimpleColoredComponent(); + mySamplePanel = new JPanel(new BorderLayout()); + mySamplePanel.setBorder(BorderFactory.createEtchedBorder()); + mySamplePanel.add(BorderLayout.CENTER, myColorSample); + myChooseColorButton = new FixedSizeButton(mySamplePanel); + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java index 14db80c9e617..64483c7ab66e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java @@ -18,6 +18,7 @@ package com.intellij.xdebugger.impl.ui.tree; import com.intellij.ide.dnd.aware.DnDAwareTree; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.changes.issueLinks.TreeLinkMouseListener; import com.intellij.ui.PopupHandler; @@ -210,6 +211,7 @@ public class XDebuggerTree extends DnDAwareTree implements DataProvider, Disposa actionManager.getAction(XDebuggerActions.SET_VALUE).unregisterCustomShortcutSet(this); actionManager.getAction(XDebuggerActions.COPY_VALUE).unregisterCustomShortcutSet(this); actionManager.getAction(XDebuggerActions.JUMP_TO_SOURCE).unregisterCustomShortcutSet(this); + actionManager.getAction(XDebuggerActions.MARK_OBJECT).unregisterCustomShortcutSet(this); } private void registerShortcuts() { @@ -217,6 +219,7 @@ public class XDebuggerTree extends DnDAwareTree implements DataProvider, Disposa actionManager.getAction(XDebuggerActions.SET_VALUE).registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0)), this); actionManager.getAction(XDebuggerActions.COPY_VALUE).registerCustomShortcutSet(CommonShortcuts.getCopy(), this); actionManager.getAction(XDebuggerActions.JUMP_TO_SOURCE).registerCustomShortcutSet(CommonShortcuts.getEditSource(), this); + actionManager.getAction(XDebuggerActions.MARK_OBJECT).registerCustomShortcutSet(new CustomShortcutSet( KeymapManager.getInstance().getActiveKeymap().getShortcuts("ToggleBookmark")), this); } private static void markNodesObsolete(final XValueContainerNode node) { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XInspectDialog.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XInspectDialog.java index d67dbe636b9a..25205fa1da98 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XInspectDialog.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XInspectDialog.java @@ -24,6 +24,7 @@ import com.intellij.xdebugger.frame.XValue; import com.intellij.xdebugger.impl.actions.XDebuggerActions; import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -34,7 +35,7 @@ import javax.swing.*; public class XInspectDialog extends DialogWrapper { private final XDebuggerTreePanel myTreePanel; - public XInspectDialog(final XDebugSession session, XDebuggerEditorsProvider editorsProvider, XSourcePosition sourcePosition, String nodeName, XValue value) { + public XInspectDialog(final XDebugSession session, XDebuggerEditorsProvider editorsProvider, XSourcePosition sourcePosition, @NotNull String nodeName, @NotNull XValue value) { super(session.getProject(), false); setTitle(XDebuggerBundle.message("inspect.value.dialog.title", nodeName)); setModal(false); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XDebuggerTreeActionBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XDebuggerTreeActionBase.java index 120916b82546..367061ff369e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XDebuggerTreeActionBase.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XDebuggerTreeActionBase.java @@ -53,7 +53,7 @@ public abstract class XDebuggerTreeActionBase extends AnAction { } @Nullable - protected static XValueNodeImpl getSelectedNode(final DataContext dataContext) { + public static XValueNodeImpl getSelectedNode(final DataContext dataContext) { XDebuggerTree tree = XDebuggerTree.getTree(dataContext); if (tree == null) return null; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java index 590bce5318d8..fa32ebcc4d75 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java @@ -17,12 +17,13 @@ package com.intellij.xdebugger.impl.ui.tree.nodes; import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree; +import org.jetbrains.annotations.NotNull; /** * @author nik */ public class XStackFrameNode extends XValueContainerNode { - public XStackFrameNode(final XDebuggerTree tree, final XStackFrame xStackFrame) { + public XStackFrameNode(final @NotNull XDebuggerTree tree, final @NotNull XStackFrame xStackFrame) { super(tree, null, xStackFrame); setLeaf(false); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java index 237ef6b99e71..4053b2b877b1 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java @@ -39,7 +39,7 @@ public abstract class XValueContainerNode implements XValu private String mySeparator; private boolean myChanged; - public XValueNodeImpl(XDebuggerTree tree, final XDebuggerTreeNode parent, String name, final XValue value) { + public XValueNodeImpl(XDebuggerTree tree, final XDebuggerTreeNode parent, String name, final @NotNull XValue value) { super(tree, parent, value); myName = name; if (myName != null) { @@ -106,6 +109,13 @@ public class XValueNodeImpl extends XValueContainerNode implements XValu private void updateText() { myText.clear(); + XValueMarkers markers = ((XDebugSessionImpl)myTree.getSession()).getValueMarkers(); + if (markers != null) { + ValueMarkup markup = markers.getMarkup(myValueContainer); + if (markup != null) { + myText.append("[" + markup.getText() + "] ", new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, markup.getColor())); + } + } myText.append(myName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES); myText.append(mySeparator, SimpleTextAttributes.REGULAR_ATTRIBUTES); if (myType != null) { diff --git a/resources/src/idea/IdeaActions.xml b/resources/src/idea/IdeaActions.xml index c7146a82f873..5d07dcd316b7 100644 --- a/resources/src/idea/IdeaActions.xml +++ b/resources/src/idea/IdeaActions.xml @@ -299,7 +299,6 @@ - From 258c859f6c7f80f4edbf3a8c4c22836d260ed964 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 15 Apr 2011 19:04:00 +0400 Subject: [PATCH 04/14] IDEA-68119 show "please specify sdk" dialog only when user opened a logcat; check version name --- .../AndroidLogcatToolWindowFactory.java | 31 +++++++++++-------- .../org/jetbrains/android/sdk/AndroidSdk.java | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/logcat/AndroidLogcatToolWindowFactory.java b/plugins/android/src/org/jetbrains/android/logcat/AndroidLogcatToolWindowFactory.java index 178158f8fa21..035050e55351 100644 --- a/plugins/android/src/org/jetbrains/android/logcat/AndroidLogcatToolWindowFactory.java +++ b/plugins/android/src/org/jetbrains/android/logcat/AndroidLogcatToolWindowFactory.java @@ -49,24 +49,12 @@ import java.util.List; public class AndroidLogcatToolWindowFactory implements ToolWindowFactory, Condition { public static final String TOOL_WINDOW_ID = AndroidBundle.message("android.logcat.title"); - public void createToolWindowContent(Project project, final ToolWindow toolWindow) { + public void createToolWindowContent(final Project project, final ToolWindow toolWindow) { toolWindow.setIcon(AndroidUtils.ANDROID_ICON); toolWindow.setAvailable(true, null); toolWindow.setToHideOnEmptyContent(true); toolWindow.setTitle(TOOL_WINDOW_ID); - List facets = ProjectFacetManager.getInstance(project).getFacets(AndroidFacet.ID); - if (facets.size() == 0) { - Messages.showErrorDialog(project, AndroidBundle.message("android.logcat.no.android.facets.error"), CommonBundle.getErrorTitle()); - return; - } - AndroidFacet facet = facets.get(0); - AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); - if (platform == null) { - Messages.showErrorDialog(project, AndroidBundle.message("specify.platform.error"), CommonBundle.getErrorTitle()); - return; - } - final AndroidLogcatToolWindowView view = new AndroidLogcatToolWindowView(project) { @Override protected boolean isActive() { @@ -85,6 +73,9 @@ public class AndroidLogcatToolWindowFactory implements ToolWindowFactory, Condit if (visible != myToolWindowVisible) { myToolWindowVisible = visible; view.activate(); + if (visible) { + checkFacetAndSdk(project); + } } } } @@ -104,6 +95,20 @@ public class AndroidLogcatToolWindowFactory implements ToolWindowFactory, Condit }); } + private static void checkFacetAndSdk(Project project) { + List facets = ProjectFacetManager.getInstance(project).getFacets(AndroidFacet.ID); + if (facets.size() == 0) { + Messages.showErrorDialog(project, AndroidBundle.message("android.logcat.no.android.facets.error"), CommonBundle.getErrorTitle()); + return; + } + + AndroidFacet facet = facets.get(0); + AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); + if (platform == null) { + Messages.showErrorDialog(project, AndroidBundle.message("specify.platform.error"), CommonBundle.getErrorTitle()); + } + } + public boolean value(Project project) { ModuleManager manager = ModuleManager.getInstance(project); for (Module module : manager.getModules()) { diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java index e3210b165e3d..12f0fa3661c4 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java @@ -81,7 +81,7 @@ public abstract class AndroidSdk { public IAndroidTarget findTargetByApiLevel(@NotNull String apiLevel) { IAndroidTarget candidate = null; for (IAndroidTarget target : getTargets()) { - if (apiLevel.equals(target.getVersion().getApiString())) { + if (apiLevel.equals(target.getVersion().getApiString()) || apiLevel.equals(target.getVersionName())) { if (target.isPlatform()) { return target; } From 1efbfd7547e0629a7f33491fa962f8a3f39fcb87 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 15 Apr 2011 19:04:45 +0400 Subject: [PATCH 05/14] improve detecting of android home --- .../android/maven/AndroidFacetImporter.java | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporter.java b/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporter.java index 7a85ef242625..d9a9d1a2a730 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporter.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporter.java @@ -17,19 +17,15 @@ package org.jetbrains.android.maven; import com.android.sdklib.IAndroidTarget; import com.intellij.facet.FacetType; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.libraries.LibraryTable; -import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.HashSet; import org.jdom.Element; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidFacetConfiguration; @@ -48,10 +44,7 @@ import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.project.*; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -100,20 +93,13 @@ public class AndroidFacetImporter extends FacetImporter mavenProjectToModuleName, List postTasks) { configurePaths(facet, mavenProject); - configureAndroidPlatform(facet, mavenProject); + configureAndroidPlatform(facet, mavenProject, modelsProvider); } - private void configureAndroidPlatform(AndroidFacet facet, MavenProject project) { + private void configureAndroidPlatform(AndroidFacet facet, MavenProject project, MavenModifiableModelsProvider modelsProvider) { Sdk platformLib = findOrCreateAndroidPlatform(project); if (platformLib != null) { - final ModifiableRootModel model = ModuleRootManager.getInstance(facet.getModule()).getModifiableModel(); - model.setSdk(platformLib); - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - model.commit(); - } - }); + modelsProvider.getRootModel(facet.getModule()).setSdk(platformLib); } //facet.getConfiguration().ADD_ANDROID_LIBRARY = false; } @@ -123,11 +109,27 @@ public class AndroidFacetImporter extends FacetImporter candidates = suggestAndroidSdkPaths(); + LOG.info("suggested sdks: " + candidates); + + for (String candidate : candidates) { + final Sdk sdk = findOrCreateAndroidPlatform(project, candidate); + if (sdk != null) { + return sdk; + } + } + return null; + } + + @Nullable + private Sdk findOrCreateAndroidPlatform(MavenProject project, String sdkPath) { String apiLevel = null; if (sdkPath != null) { Element sdkRoot = getConfig(project, "sdk"); @@ -148,13 +150,7 @@ public class AndroidFacetImporter extends FacetImporter suggestAndroidSdkPaths() { final List androidSdks = ProjectJdkTable.getInstance().getSdksOfType(AndroidSdkType.getInstance()); + final Set result = new HashSet(androidSdks.size()); + for (Sdk androidSdk : androidSdks) { final VirtualFile sdkHome = androidSdk.getHomeDirectory(); if (sdkHome != null && sdkHome.exists() && sdkHome.isValid() && sdkHome.isDirectory()) { - return sdkHome.getPath(); + final String path = sdkHome.getPath(); + if (path != null) { + result.add(path); + } } } - return null; + return result; } private void configurePaths(AndroidFacet facet, MavenProject project) { From e6406c050164ab7e8c5bbfc32f99b6a9b6cfbad1 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 15 Apr 2011 17:42:14 +0400 Subject: [PATCH 06/14] no need to use bundle so often --- .../ChangeSignatureGestureDetector.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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())) { From d9b02d2db2b55f3728ecdd8506a9523728afbd96 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 15 Apr 2011 16:59:39 +0200 Subject: [PATCH 07/14] allow running CE tests with 'ant test' --- build.xml | 8 ++++++++ 1 file changed, 8 insertions(+) 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 @@ + + + + From c901950c1d4c59002987b1cfbd5378162046b0cc Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 15 Apr 2011 17:28:16 +0200 Subject: [PATCH 08/14] inplace introduce: correct types when replace all occurrences/not all occurrences (EA-20168 - assert: PsiJavaCodeReferenceElementImpl.multiResolve) --- .../InplaceIntroduceConstantPopup.java | 24 ++++++++++++++----- .../InplaceIntroduceFieldPopup.java | 23 +++++++++++++----- .../IntroduceFieldCentralPanel.java | 8 ++++++- .../IntroduceFieldPopupPanel.java | 5 ++++ .../IntroduceVariableBase.java | 5 ++-- .../ui/TypeSelectorManagerImpl.java | 4 ++++ 6 files changed, 54 insertions(+), 15 deletions(-) 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/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; From be27ada9e0938b4cd3ffb746ca09f5c8d17a5a66 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 15 Apr 2011 19:34:14 +0400 Subject: [PATCH 09/14] IDEA-65955 pass full help-ref to html descriptor --- .../xml/util/documentation/HtmlDescriptorsTable.java | 6 ++---- .../util/documentation/HtmlDocumentationProvider.java | 11 +---------- .../util/documentation/XmlDocumentationProvider.java | 2 +- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDescriptorsTable.java b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDescriptorsTable.java index 28df74159275..2a888cb95cba 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDescriptorsTable.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDescriptorsTable.java @@ -92,9 +92,7 @@ public class HtmlDescriptorsTable { private static void loadHtmlElements(final String resourceName, List htmlTagNames) throws JDOMException, IOException { final Document document = JDOMUtil.loadDocument(HtmlDescriptorsTable.class.getResourceAsStream(resourceName)); final List elements = document.getRootElement().getChildren(TAG_ELEMENT_NAME); - HtmlDocumentationProvider.setBaseHtmlExtDocUrl( - document.getRootElement().getAttribute(BASE_HELP_REF_ATTR).getValue() - ); + final String baseHtmlExtDocUrl = document.getRootElement().getAttribute(BASE_HELP_REF_ATTR).getValue(); for (Object object : elements) { final Element element = (Element)object; @@ -103,7 +101,7 @@ public class HtmlDescriptorsTable { HtmlTagDescriptor value = new HtmlTagDescriptor(); ourTagTable.put(htmlTagName, value); - value.setHelpRef(element.getAttributeValue(HELPREF_ATTR)); + value.setHelpRef(baseHtmlExtDocUrl + element.getAttributeValue(HELPREF_ATTR)); value.setDescription(element.getAttributeValue(DESCRIPTION_ATTR)); value.setName(htmlTagName); diff --git a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java index cdda68377097..1fbe416d72bf 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java @@ -41,7 +41,6 @@ import java.util.List; * @author maxim */ public class HtmlDocumentationProvider implements DocumentationProvider { - private static String ourBaseHtmlExtDocUrl; private static DocumentationProvider ourStyleProvider; private static DocumentationProvider ourScriptProvider; @@ -75,7 +74,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { final EntityDescriptor descriptor = findDocumentationDescriptor(element, context); if (descriptor!=null) { - return ourBaseHtmlExtDocUrl + descriptor.getHelpRef(); + return descriptor.getHelpRef(); } else { return null; } @@ -311,14 +310,6 @@ public class HtmlDocumentationProvider implements DocumentationProvider { return PsiTreeUtil.getParentOfType(context,XmlTag.class,false); } - public static void setBaseHtmlExtDocUrl(String baseHtmlExtDocUrl) { - ourBaseHtmlExtDocUrl = baseHtmlExtDocUrl; - } - - static String getBaseHtmlExtDocUrl() { - return ourBaseHtmlExtDocUrl; - } - public static void registerScriptDocumentationProvider(final DocumentationProvider provider) { ourScriptProvider = provider; } diff --git a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java index 0b5a7f28c5b2..5f886696b3e6 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java @@ -228,7 +228,7 @@ public class XmlDocumentationProvider implements DocumentationProvider { if (descriptor != null && append) { buf.append("
"); buf.append(XmlBundle.message("html.quickdoc.additional.template", - HtmlDocumentationProvider.getBaseHtmlExtDocUrl() + descriptor.getHelpRef(), + descriptor.getHelpRef(), BASE_SITEPOINT_URL + tag.getName())); } } From 0818c415a90b41b73807e0fb8ec1462d4fed89a4 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 15 Apr 2011 19:26:10 +0400 Subject: [PATCH 10/14] Simplification of NotNullLazyValue. --- .../src/com/intellij/openapi/util/NotNullLazyValue.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java index 1b82d50fdd18..9c9390371f87 100644 --- a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java @@ -23,17 +23,15 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class NotNullLazyValue { - private boolean myComputed; - @NotNull private T myValue; + private T myValue; @NotNull protected abstract T compute(); @NotNull public T getValue() { - if (!myComputed) { + if (myValue == null) { myValue = compute(); - myComputed = true; } return myValue; } From db029dafacee4934de0034d3f23afb916abdf858 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 15 Apr 2011 20:07:04 +0400 Subject: [PATCH 11/14] WI-5479 WI-5656 WI-5682 support for wbr and s tags; role attribute --- .../resources/standardSchemas/html5/xhtml5.xsd | 15 +++++++++++++++ xml/impl/src/com/intellij/xml/util/HtmlUtil.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/xml/impl/resources/standardSchemas/html5/xhtml5.xsd b/xml/impl/resources/standardSchemas/html5/xhtml5.xsd index 05f119bd295d..eaf61c52fd8c 100644 --- a/xml/impl/resources/standardSchemas/html5/xhtml5.xsd +++ b/xml/impl/resources/standardSchemas/html5/xhtml5.xsd @@ -83,6 +83,8 @@ + + @@ -200,6 +202,7 @@ + @@ -1167,6 +1170,18 @@ + + + + + + + + + + + + diff --git a/xml/impl/src/com/intellij/xml/util/HtmlUtil.java b/xml/impl/src/com/intellij/xml/util/HtmlUtil.java index 807e44d51f47..55b5e409a39d 100644 --- a/xml/impl/src/com/intellij/xml/util/HtmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/HtmlUtil.java @@ -89,7 +89,7 @@ public class HtmlUtil { private HtmlUtil() {} @NonNls private static final String[] EMPTY_TAGS = { - "base","hr","meta","link","frame","br","basefont","param","img","area","input","isindex","col", /*html 5*/ "source" + "base","hr","meta","link","frame","br","basefont","param","img","area","input","isindex","col", /*html 5*/ "source","wbr" }; private static final Set EMPTY_TAGS_MAP = new THashSet(); @NonNls private static final String[] OPTIONAL_END_TAGS = { From 8ed477c3110e0d0dc3a059018e1d62b8f0977238 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 15 Apr 2011 18:52:54 +0200 Subject: [PATCH 12/14] new rule for the make: handle cases when added/removed members in a superclass hide members that its subclasses reference --- .../src/com/intellij/compiler/make/Cache.java | 4 +- .../make/JavaDependencyProcessor.java | 69 ++++++++++++++++--- 2 files changed, 63 insertions(+), 10 deletions(-) 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)) { From cbfb86b406bc1ae6164c54aedf24ae3e47ba6dbe Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 15 Apr 2011 18:48:31 +0400 Subject: [PATCH 13/14] IDEA-68138 query parameter not recognized in assembled string --- .../plugins/intelliLang/util/ContextComputationProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java index b37a8e7e361e..b44d61877ca7 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java @@ -95,7 +95,8 @@ public class ContextComputationProcessor { else if (expression instanceof PsiExpression) { final SmartList uncomputables = new SmartList(); final Object o = myEvaluationHelper.computeExpression((PsiExpression)expression, uncomputables); - addStringFragment(String.valueOf(o), result); + // in many languages 'null' is a reserved word + addStringFragment(o == null? "missingValue" : String.valueOf(o), result); if (uncomputables.size() > 0) { unparsable.set(Boolean.TRUE); } From 728ae46a2716bcf4a5002e4fea7ff1a688ce05de Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 15 Apr 2011 20:50:46 +0400 Subject: [PATCH 14/14] IDEA-62808 IntelliJ does not support property name starting with upper case for class mapping. --- .../AbstractMemberResolveConverter.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) 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