From 8eed0c7c4121a3a7189ffcdcbc60acf8eee54a31 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 11 Nov 2016 12:59:32 +0100 Subject: [PATCH] Debug hover should use scope information fixes #15172 --- src/vs/workbench/parts/debug/common/debug.ts | 3 ++- src/vs/workbench/parts/debug/common/debugModel.ts | 8 ++++++-- .../workbench/parts/debug/electron-browser/debugHover.ts | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index a607ff7506033..b829070e8d714 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Event from 'vs/base/common/event'; import severity from 'vs/base/common/severity'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IModel as EditorIModel, IEditorContribution } from 'vs/editor/common/editorCommon'; +import { IModel as EditorIModel, IEditorContribution, IRange } from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { ISuggestion } from 'vs/editor/common/modes'; import { Source } from 'vs/workbench/parts/debug/common/debugSource'; @@ -157,6 +157,7 @@ export interface IThread extends ITreeElement { export interface IScope extends IExpressionContainer { name: string; expensive: boolean; + range?: IRange; } export interface IStackFrame extends ITreeElement { diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index ca72e5bd7980a..0d01631bac832 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -13,6 +13,8 @@ import { clone } from 'vs/base/common/objects'; import severity from 'vs/base/common/severity'; import { isObject, isString } from 'vs/base/common/types'; import { distinct } from 'vs/base/common/arrays'; +import { IRange } from 'vs/editor/common/editorCommon'; +import { Range } from 'vs/editor/common/core/range'; import { ISuggestion } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import * as debug from 'vs/workbench/parts/debug/common/debug'; @@ -305,7 +307,8 @@ export class Scope extends ExpressionContainer implements debug.IScope { reference: number, public expensive: boolean, namedVariables: number, - indexedVariables: number + indexedVariables: number, + public range?: IRange ) { super(stackFrame, reference, `scope:${stackFrame.getId()}:${name}:${reference}`, namedVariables, indexedVariables); } @@ -334,7 +337,8 @@ export class StackFrame implements debug.IStackFrame { if (!this.scopes) { this.scopes = this.thread.process.session.scopes({ frameId: this.frameId }).then(response => { return response && response.body && response.body.scopes ? - response.body.scopes.map(rs => new Scope(this, rs.name, rs.variablesReference, rs.expensive, rs.namedVariables, rs.indexedVariables)) : []; + response.body.scopes.map(rs => new Scope(this, rs.name, rs.variablesReference, rs.expensive, rs.namedVariables, rs.indexedVariables, + rs.line && rs.column && rs.endLine && rs.endColumn ? new Range(rs.line, rs.column, rs.endLine, rs.endColumn) : null)) : []; }, err => []); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index 6c670c0f96f10..97e2bd4d1358c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -169,7 +169,7 @@ export class DebugHoverWidget implements IContentWidget { const result = new Expression(matchingExpression); promise = result.evaluate(process, focusedStackFrame, 'hover').then(() => result); } else { - promise = this.findExpressionInStackFrame(matchingExpression.split('.').map(word => word.trim()).filter(word => !!word)); + promise = this.findExpressionInStackFrame(matchingExpression.split('.').map(word => word.trim()).filter(word => !!word), expressionRange); } return promise.then(expression => { @@ -206,10 +206,10 @@ export class DebugHoverWidget implements IContentWidget { }); } - private findExpressionInStackFrame(namesToFind: string[]): TPromise { + private findExpressionInStackFrame(namesToFind: string[], expressionRange: Range): TPromise { return this.debugService.getViewModel().focusedStackFrame.getScopes() - // no expensive scopes - .then(scopes => scopes.filter(scope => !scope.expensive)) + // no expensive scopes and if a range of scope is defined it needs to contain the variable + .then(scopes => scopes.filter(scope => !scope.expensive && (!scope.range || Range.containsRange(scope.range, expressionRange)))) .then(scopes => TPromise.join(scopes.map(scope => this.doFindExpression(scope, namesToFind)))) .then(expressions => expressions.filter(exp => !!exp)) // only show if all expressions found have the same value