From 6552978f446152e2485ccf76a77d55cd85f236dd Mon Sep 17 00:00:00 2001 From: Elizaveta Shashkova Date: Mon, 15 Jun 2015 20:02:38 +0300 Subject: [PATCH 1/5] Fix exception with dictionary keys with tab symbols (PY-16188) Replace tabs in keys with special symbols for sending to debugger --- python/helpers/pydev/pydevd_vars.py | 3 +++ .../jetbrains/python/debugger/pydev/GetVariableCommand.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/python/helpers/pydev/pydevd_vars.py b/python/helpers/pydev/pydevd_vars.py index 178b11c25674..ecc0ae1e4608 100644 --- a/python/helpers/pydev/pydevd_vars.py +++ b/python/helpers/pydev/pydevd_vars.py @@ -200,6 +200,9 @@ def getVariable(thread_id, frame_id, scope, attrs): else: attrList = [] + for attr in attrList: + attr.replace("@_@TAB_CHAR@_@", '\t') + if scope == 'EXPRESSION': for count in xrange(len(attrList)): if count == 0: diff --git a/python/pydevSrc/com/jetbrains/python/debugger/pydev/GetVariableCommand.java b/python/pydevSrc/com/jetbrains/python/debugger/pydev/GetVariableCommand.java index 8eeb4a87e968..466780066f77 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/pydev/GetVariableCommand.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/pydev/GetVariableCommand.java @@ -26,7 +26,7 @@ public class GetVariableCommand extends GetFrameCommand { sb.insert(0, BY_ID).insert(0, '\t').insert(0, p.getId()); break; } else { - sb.insert(0, p.getTempName()); + sb.insert(0, p.getTempName().replaceAll("\t", TAB_CHAR)); } p = p.getParent(); } From 45f6afd77103b1b3a84b110b4327533e1e3825e0 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 15 Jun 2015 21:03:23 +0300 Subject: [PATCH 2/5] IDEA-131134 Support multiple breakpoints within on single line - highlight variants in the editor --- .../xdebugger/impl/XDebuggerUtilImpl.java | 76 ++++++++++++++++--- .../impl/breakpoints/XBreakpointUtil.java | 8 +- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java index bc5288599510..4c1e8db900c6 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java @@ -24,15 +24,22 @@ import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.markup.HighlighterTargetArea; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.AsyncResult; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; @@ -57,13 +64,17 @@ import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointVariantsProvider; import com.intellij.xdebugger.impl.breakpoints.ui.grouping.XBreakpointFileGroupingRule; import com.intellij.xdebugger.impl.evaluate.quick.common.ValueLookupManager; import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager; +import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase; import com.intellij.xdebugger.settings.XDebuggerSettings; +import com.intellij.xdebugger.ui.DebuggerColors; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import java.util.*; /** @@ -71,7 +82,7 @@ import java.util.*; */ public class XDebuggerUtilImpl extends XDebuggerUtil { private XLineBreakpointType[] myLineBreakpointTypes; - private Map, XBreakpointType> myBreakpointTypeByClass; + private Map, XBreakpointType> myBreakpointTypeByClass; @Override public XLineBreakpointType[] getLineBreakpointTypes() { @@ -125,10 +136,10 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { @NotNull public static

AsyncResult toggleAndReturnLineBreakpoint(@NotNull final Project project, - @NotNull final XLineBreakpointType

type, - @NotNull final XSourcePosition position, - final boolean temporary, - final RelativePoint relativePoint) { + @NotNull final XLineBreakpointType

type, + @NotNull final XSourcePosition position, + final boolean temporary, + @Nullable final Editor editor) { return new WriteAction>() { @Override protected void run(@NotNull Result> result) throws Throwable { @@ -144,10 +155,47 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { final XLineBreakpointVariantsProvider provider = (XLineBreakpointVariantsProvider)type; List variants = provider.computeLineBreakpointVariants(project, position); - if (!variants.isEmpty()) { + if (!variants.isEmpty() && editor != null) { + RelativePoint relativePoint = DebuggerUIUtil.calcPopupLocation(editor, line); if (variants.size() > 1 && relativePoint != null) { final AsyncResult res = new AsyncResult(); - JBPopupFactory.getInstance().createListPopup( + class MySelectionListener implements ListSelectionListener { + RangeHighlighter myHighlighter = null; + + @Override + public void valueChanged(ListSelectionEvent e) { + if (!e.getValueIsAdjusting()) { + clearHighlighter(); + Object value = ((JList)e.getSource()).getSelectedValue(); + if (value instanceof XLineBreakpointVariant) { + TextRange range = ((XLineBreakpointVariant)value).getHighlightRange(); + TextRange lineRange = + TextRange.create(editor.getDocument().getLineStartOffset(line), editor.getDocument().getLineEndOffset(line)); + if (range != null) { + range = range.intersection(lineRange); + } + else { + range = lineRange; + } + if (range != null && !range.isEmpty()) { + EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); + TextAttributes attributes = scheme.getAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES); + myHighlighter = editor.getMarkupModel().addRangeHighlighter( + range.getStartOffset(), range.getEndOffset(), DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes, + HighlighterTargetArea.EXACT_RANGE); + } + } + } + } + + private void clearHighlighter() { + if (myHighlighter != null) { + myHighlighter.dispose(); + } + } + } + final MySelectionListener selectionListener = new MySelectionListener(); + ListPopup popup = JBPopupFactory.getInstance().createListPopup( new BaseListPopupStep("Create breakpoint for", variants) { @NotNull @Override @@ -160,8 +208,14 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { return value.getIcon(); } + @Override + public void canceled() { + selectionListener.clearHighlighter(); + } + @Override public PopupStep onChosen(final XLineBreakpointVariant selectedValue, boolean finalChoice) { + selectionListener.clearHighlighter(); ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { @@ -171,7 +225,9 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { }); return FINAL_CHOICE; } - }).show(relativePoint); + }); + popup.addListSelectionListener(selectionListener); + popup.show(relativePoint); result.setResult(res); return; } @@ -206,7 +262,7 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { @Override public > XBreakpointType findBreakpointType(@NotNull Class> typeClass) { if (myBreakpointTypeByClass == null) { - myBreakpointTypeByClass = new THashMap, XBreakpointType>(); + myBreakpointTypeByClass = new THashMap, XBreakpointType>(); for (XBreakpointType breakpointType : XBreakpointUtil.getBreakpointTypes()) { myBreakpointTypeByClass.put(breakpointType.getClass(), breakpointType); } @@ -275,7 +331,7 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { @Nullable private static Editor getEditor(@NotNull Project project, DataContext context) { Editor editor = CommonDataKeys.EDITOR.getData(context); - if(editor == null) { + if (editor == null) { return FileEditorManager.getInstance(project).getSelectedTextEditor(); } return editor; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointUtil.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointUtil.java index 09f936bdad72..7b49b34dc05f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointUtil.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointUtil.java @@ -26,7 +26,6 @@ import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.ui.awt.RelativePoint; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XDebuggerUtil; import com.intellij.xdebugger.XSourcePosition; @@ -36,7 +35,6 @@ import com.intellij.xdebugger.impl.XDebuggerUtilImpl; import com.intellij.xdebugger.impl.XSourcePositionImpl; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; -import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,8 +121,9 @@ public class XBreakpointUtil { List items = new ArrayList(); for (DebuggerSupport support : debuggerSupports) { support.getBreakpointPanelProvider().provideBreakpointItems(project, items); - if (items.contains(breakpointItem)) + if (items.contains(breakpointItem)) { return support; + } items.clear(); } return null; @@ -180,9 +179,8 @@ public class XBreakpointUtil { if (typeWinner != null) { XSourcePosition winPosition = (lineStart == lineWinner) ? position : XSourcePositionImpl.create(file, lineWinner); if (winPosition != null) { - RelativePoint point = editor != null ? DebuggerUIUtil.calcPopupLocation(editor, lineWinner) : null; AsyncResult res = - XDebuggerUtilImpl.toggleAndReturnLineBreakpoint(project, typeWinner, winPosition, temporary, point); + XDebuggerUtilImpl.toggleAndReturnLineBreakpoint(project, typeWinner, winPosition, temporary, editor); if (editor != null && lineStart != lineWinner) { int offset = editor.getDocument().getLineStartOffset(lineWinner); From 0cdacad72ff33ce3ee3961a50c516102ab70bf98 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Jun 2015 17:16:35 +0300 Subject: [PATCH 3/5] restore backward dependencies for library classes (IDEA-141154) --- .../BackwardDependenciesBuilder.java | 47 ++++++++++++------- .../ForwardDependenciesBuilder.java | 3 +- .../FindDependencyUtil.java | 6 +++ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java b/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java index b48cd3a6d092..828096c4930f 100644 --- a/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java +++ b/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java @@ -24,11 +24,14 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiRecursiveElementVisitor; +import com.intellij.util.Processor; import org.jetbrains.annotations.Nullable; import java.util.HashSet; @@ -85,35 +88,45 @@ public class BackwardDependenciesBuilder extends DependenciesBuilder { psiManager.startBatchFilesProcessingMode(); try { final int fileCount = getScope().getFileCount(); - getScope().accept(new PsiRecursiveElementVisitor() { - @Override public void visitFile(final PsiFile file) { + final boolean includeTestSource = getScope().isIncludeTestSource(); + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(getProject()).getFileIndex(); + getScope().accept(new Processor() { + @Override + public boolean process(final VirtualFile virtualFile) { + if (!includeTestSource && fileIndex.isInTestSourceContent(virtualFile)) { + return true; + } ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { if (indicator.isCanceled()) { throw new ProcessCanceledException(); } indicator.setText(AnalysisScopeBundle.message("package.dependencies.progress.text")); - final VirtualFile virtualFile = file.getVirtualFile(); - if (virtualFile != null) { - indicator.setText2(getRelativeToProjectPath(virtualFile)); - } + indicator.setText2(getRelativeToProjectPath(virtualFile)); if (fileCount > 0) { indicator.setFraction(((double)++myFileCount) / myTotalFileCount); } } - final Map> dependencies = builder.getDependencies(); - for (final PsiFile psiFile : dependencies.keySet()) { - if (dependencies.get(psiFile).contains(file)) { - Set fileDeps = getDependencies().get(file); - if (fileDeps == null) { - fileDeps = new HashSet(); - getDependencies().put(file, fileDeps); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final PsiFile file = psiManager.findFile(virtualFile); + if (file != null) { + final Map> dependencies = builder.getDependencies(); + for (final PsiFile psiFile : dependencies.keySet()) { + if (dependencies.get(psiFile).contains(file)) { + Set fileDeps = getDependencies().get(file); + if (fileDeps == null) { + fileDeps = new HashSet(); + getDependencies().put(file, fileDeps); + } + fileDeps.add(psiFile); + } + } + psiManager.dropResolveCaches(); } - fileDeps.add(psiFile); } - } - psiManager.dropResolveCaches(); - InjectedLanguageManager.getInstance(file.getProject()).dropFileCaches(file); + }); + return true; } }); } diff --git a/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java b/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java index dd0dbac4ff14..f4078c1a2829 100644 --- a/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java +++ b/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java @@ -138,7 +138,8 @@ public class ForwardDependenciesBuilder extends DependenciesBuilder { (fileIndex.isInContent(virtualFile) || fileIndex.isInLibraryClasses(virtualFile) || fileIndex.isInLibrarySource(virtualFile))) { - found.add(dependencyFile); + final PsiElement navigationElement = dependencyFile.getNavigationElement(); + found.add(navigationElement instanceof PsiFile ? (PsiFile)navigationElement : dependencyFile); } } } diff --git a/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java b/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java index 606754643019..b4f0234c4bca 100644 --- a/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java +++ b/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java @@ -99,6 +99,12 @@ public class FindDependencyUtil { @Override public void process(PsiElement place, PsiElement dependency) { PsiFile dependencyFile = dependency.getContainingFile(); + if (dependencyFile != null) { + final PsiElement navigationElement = dependencyFile.getNavigationElement(); + if (navigationElement instanceof PsiFile) { + dependencyFile = (PsiFile)navigationElement; + } + } if (searchFor.contains(dependencyFile)) { usages.add(new UsageInfo(place)); } From 5b8dabb8e1facb89399aa8bc0eec2fa07d95c4f1 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Jun 2015 18:20:51 +0300 Subject: [PATCH 4/5] darcula red for tests --- .../com/intellij/openapi/progress/util/ColorProgressBar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ColorProgressBar.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ColorProgressBar.java index ca6a973668b4..b307177e154b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ColorProgressBar.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ColorProgressBar.java @@ -37,7 +37,7 @@ public class ColorProgressBar extends JComponent { private static final Dimension PREFERRED_SIZE = new Dimension(146, 17); public static final Color GREEN = new JBColor(new Color(0x6cad74), new Color(0x4a8c53)); - public static final Color RED = new JBColor(new Color(0xd67b76), new Color(0xb25050)); + public static final Color RED = new JBColor(new Color(0xd67b76), new Color(0xe55757)); public static final Color BLUE = new JBColor(new Color(1, 68, 208), JBColor.blue); public static final Color YELLOW = new JBColor(new Color(0xa67a21), new Color(0x91703a)); private static final Color SHADOW1 = new JBColor(Gray._190, UIUtil.getBorderColor()) ; From aba01014f77feb97acd266c53ad919e6c0f22161 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Jun 2015 19:51:33 +0300 Subject: [PATCH 5/5] diff from console: use original component from relative point available when constructed from MouseEvent only (IDEA-140347) --- .../execution/impl/EditorHyperlinkSupport.java | 5 +++-- .../testframework/stacktrace/DiffHyperlink.java | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java index 36da53448c7b..00aba68c73db 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java @@ -135,8 +135,9 @@ public class EditorHyperlinkSupport { @Override public void run() { if (hyperlinkInfo instanceof HyperlinkInfoBase) { - RelativePoint point = new RelativePoint(myEditor.getContentComponent(), myEditor.logicalPositionToXY(logical)); - ((HyperlinkInfoBase)hyperlinkInfo).navigate(myProject, point); + final Point point = myEditor.logicalPositionToXY(logical); + final MouseEvent event = new MouseEvent(myEditor.getContentComponent(), 0, 0, 0, point.x, point.y, 1, false); + ((HyperlinkInfoBase)hyperlinkInfo).navigate(myProject, new RelativePoint(event)); } else { hyperlinkInfo.navigate(myProject); diff --git a/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java b/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java index 8e9de796ed4a..8fb1c8c75faa 100644 --- a/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java +++ b/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java @@ -22,6 +22,7 @@ package com.intellij.execution.testframework.stacktrace; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.filters.HyperlinkInfo; +import com.intellij.execution.filters.HyperlinkInfoBase; import com.intellij.execution.testframework.AbstractTestProxy; import com.intellij.execution.testframework.Printable; import com.intellij.execution.testframework.Printer; @@ -31,6 +32,9 @@ import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.ui.awt.RelativePoint; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; @@ -135,9 +139,13 @@ public class DiffHyperlink implements Printable { return result; } - public class DiffHyperlinkInfo implements HyperlinkInfo { - public void navigate(final Project project) { - ViewAssertEqualsDiffAction.openDiff(DataManager.getInstance().getDataContext(), DiffHyperlink.this); + public class DiffHyperlinkInfo extends HyperlinkInfoBase { + @Override + public void navigate(@NotNull Project project, @Nullable RelativePoint hyperlinkLocationPoint) { + final DataManager dataManager = DataManager.getInstance(); + final DataContext dataContext = hyperlinkLocationPoint != null ? + dataManager.getDataContext(hyperlinkLocationPoint.getOriginalComponent()) : dataManager.getDataContext(); + ViewAssertEqualsDiffAction.openDiff(dataContext, DiffHyperlink.this); } public DiffHyperlink getPrintable() {