mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Merge from vscode cfc1ab4c5f816765b91fb7ead3c3427a7c8581a3
This commit is contained in:
@@ -15,7 +15,7 @@ import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget';
|
||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IDebugService, IBreakpoint, BreakpointWidgetContext as Context, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, DEBUG_SCHEME, CONTEXT_IN_BREAKPOINT_WIDGET, IBreakpointUpdateData, IBreakpointEditorContribution, BREAKPOINT_EDITOR_CONTRIBUTION_ID } from 'vs/workbench/contrib/debug/common/debug';
|
||||
import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler';
|
||||
import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService';
|
||||
import { IThemeService, IColorTheme } from 'vs/platform/theme/common/themeService';
|
||||
import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { ServicesAccessor, EditorCommand, registerEditorCommand } from 'vs/editor/browser/editorExtensions';
|
||||
@@ -56,7 +56,7 @@ function isCurlyBracketOpen(input: IActiveCodeEditor): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
function createDecorations(theme: ITheme, placeHolder: string): IDecorationOptions[] {
|
||||
function createDecorations(theme: IColorTheme, placeHolder: string): IDecorationOptions[] {
|
||||
const transparentForeground = transparent(editorForeground, 0.4)(theme);
|
||||
return [{
|
||||
range: {
|
||||
@@ -225,11 +225,11 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi
|
||||
this.toDispose.push(model);
|
||||
const setDecorations = () => {
|
||||
const value = this.input.getModel().getValue();
|
||||
const decorations = !!value ? [] : createDecorations(this.themeService.getTheme(), this.placeholder);
|
||||
const decorations = !!value ? [] : createDecorations(this.themeService.getColorTheme(), this.placeholder);
|
||||
this.input.setDecorations(DECORATION_KEY, decorations);
|
||||
};
|
||||
this.input.getModel().onDidChangeContent(() => setDecorations());
|
||||
this.themeService.onThemeChange(() => setDecorations());
|
||||
this.themeService.onDidColorThemeChange(() => setDecorations());
|
||||
|
||||
this.toDispose.push(CompletionProviderRegistry.register({ scheme: DEBUG_SCHEME, hasAccessToAllModels: true }, {
|
||||
provideCompletionItems: (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken): Promise<CompletionList> => {
|
||||
|
||||
@@ -18,7 +18,7 @@ import { Constants } from 'vs/base/common/uint';
|
||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IListVirtualDelegate, IListContextMenuEvent, IListRenderer } from 'vs/base/browser/ui/list/list';
|
||||
import { IEditor } from 'vs/workbench/common/editor';
|
||||
import { IEditorPane } from 'vs/workbench/common/editor';
|
||||
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
@@ -28,7 +28,7 @@ import { attachInputBoxStyler } from 'vs/platform/theme/common/styler';
|
||||
import { isCodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { Gesture } from 'vs/base/browser/touch';
|
||||
@@ -74,7 +74,7 @@ export class BreakpointsView extends ViewPane {
|
||||
@IOpenerService openerService: IOpenerService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('breakpointsSection', "Breakpoints Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
|
||||
this.minimumBodySize = this.maximumBodySize = getExpandedBodySize(this.debugService.getModel());
|
||||
this._register(this.debugService.getModel().onDidChangeBreakpoints(() => this.onBreakpointsChange()));
|
||||
@@ -617,7 +617,7 @@ class FunctionBreakpointInputRenderer implements IListRenderer<IFunctionBreakpoi
|
||||
}
|
||||
}
|
||||
|
||||
export function openBreakpointSource(breakpoint: IBreakpoint, sideBySide: boolean, preserveFocus: boolean, debugService: IDebugService, editorService: IEditorService): Promise<IEditor | undefined> {
|
||||
export function openBreakpointSource(breakpoint: IBreakpoint, sideBySide: boolean, preserveFocus: boolean, debugService: IDebugService, editorService: IEditorService): Promise<IEditorPane | undefined> {
|
||||
if (breakpoint.uri.scheme === DEBUG_SCHEME && debugService.state === State.Inactive) {
|
||||
return Promise.resolve(undefined);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import { IDebugService, IStackFrame } from 'vs/workbench/contrib/debug/common/de
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { registerColor } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { localize } from 'vs/nls';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { IEditorContribution } from 'vs/editor/common/editorCommon';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
@@ -91,7 +92,7 @@ export class CallStackEditorContribution implements IEditorContribution {
|
||||
@IDebugService private readonly debugService: IDebugService,
|
||||
) {
|
||||
const setDecorations = () => this.decorationIds = this.editor.deltaDecorations(this.decorationIds, this.createCallStackDecorations());
|
||||
this.toDispose.push(this.debugService.getViewModel().onDidFocusStackFrame(() => {
|
||||
this.toDispose.push(Event.any(this.debugService.getViewModel().onDidFocusStackFrame, this.debugService.getModel().onDidChangeCallStack)(() => {
|
||||
setDecorations();
|
||||
}));
|
||||
this.toDispose.push(this.editor.onDidChangeModel(e => {
|
||||
|
||||
@@ -18,13 +18,13 @@ import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
|
||||
import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
||||
import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
|
||||
import { ITreeRenderer, ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree';
|
||||
import { TreeResourceNavigator, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService';
|
||||
import { ResourceNavigator, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService';
|
||||
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
|
||||
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
@@ -104,7 +104,7 @@ export class CallStackView extends ViewPane {
|
||||
@IThemeService themeService: IThemeService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('callstackSection', "Call Stack Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
this.callStackItemType = CONTEXT_CALLSTACK_ITEM_TYPE.bindTo(contextKeyService);
|
||||
|
||||
this.contributedContextMenu = menuService.createMenu(MenuId.DebugCallStackContext, contextKeyService);
|
||||
@@ -213,7 +213,7 @@ export class CallStackView extends ViewPane {
|
||||
|
||||
this.tree.setInput(this.debugService.getModel());
|
||||
|
||||
const callstackNavigator = new TreeResourceNavigator(this.tree);
|
||||
const callstackNavigator = ResourceNavigator.createTreeResourceNavigator(this.tree);
|
||||
this._register(callstackNavigator);
|
||||
this._register(callstackNavigator.onDidOpenResource(e => {
|
||||
if (this.ignoreSelectionChangedEvent) {
|
||||
|
||||
@@ -31,7 +31,7 @@ import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandler
|
||||
import { StatusBarColorProvider } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider';
|
||||
import { IViewsRegistry, Extensions as ViewExtensions, IViewContainersRegistry, ViewContainerLocation, ViewContainer } from 'vs/workbench/common/views';
|
||||
import { isMacintosh } from 'vs/base/common/platform';
|
||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { DebugQuickOpenHandler } from 'vs/workbench/contrib/debug/browser/debugQuickOpen';
|
||||
import { DebugStatusContribution } from 'vs/workbench/contrib/debug/browser/debugStatus';
|
||||
@@ -44,7 +44,7 @@ import { WatchExpressionsView } from 'vs/workbench/contrib/debug/browser/watchEx
|
||||
import { VariablesView } from 'vs/workbench/contrib/debug/browser/variablesView';
|
||||
import { ClearReplAction, Repl } from 'vs/workbench/contrib/debug/browser/repl';
|
||||
import { DebugContentProvider } from 'vs/workbench/contrib/debug/common/debugContentProvider';
|
||||
import { StartView } from 'vs/workbench/contrib/debug/browser/startView';
|
||||
import { WelcomeView } from 'vs/workbench/contrib/debug/browser/welcomeView';
|
||||
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
|
||||
import { DebugViewPaneContainer, OpenDebugPanelAction } from 'vs/workbench/contrib/debug/browser/debugViewlet';
|
||||
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
|
||||
@@ -52,10 +52,12 @@ import { CallStackEditorContribution } from 'vs/workbench/contrib/debug/browser/
|
||||
import { BreakpointEditorContribution } from 'vs/workbench/contrib/debug/browser/breakpointEditorContribution';
|
||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||
import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess';
|
||||
import { StartDebugQuickAccessProvider } from 'vs/workbench/contrib/debug/browser/debugQuickAccess';
|
||||
|
||||
class OpenDebugViewletAction extends ShowViewletAction {
|
||||
public static readonly ID = VIEWLET_ID;
|
||||
public static readonly LABEL = nls.localize('toggleDebugViewlet', "Show Debug");
|
||||
public static readonly LABEL = nls.localize('toggleDebugViewlet', "Show Run and Debug");
|
||||
|
||||
constructor(
|
||||
id: string,
|
||||
@@ -108,7 +110,7 @@ viewsRegistry.registerViews([{ id: VARIABLES_VIEW_ID, name: nls.localize('variab
|
||||
viewsRegistry.registerViews([{ id: WATCH_VIEW_ID, name: nls.localize('watch', "Watch"), ctorDescriptor: new SyncDescriptor(WatchExpressionsView), order: 20, weight: 10, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusWatchView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
|
||||
viewsRegistry.registerViews([{ id: CALLSTACK_VIEW_ID, name: nls.localize('callStack', "Call Stack"), ctorDescriptor: new SyncDescriptor(CallStackView), order: 30, weight: 30, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusCallStackView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
|
||||
viewsRegistry.registerViews([{ id: BREAKPOINTS_VIEW_ID, name: nls.localize('breakpoints', "Breakpoints"), ctorDescriptor: new SyncDescriptor(BreakpointsView), order: 40, weight: 20, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusBreakpointsView' }, when: ContextKeyExpr.or(CONTEXT_BREAKPOINTS_EXIST, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
|
||||
viewsRegistry.registerViews([{ id: StartView.ID, name: StartView.LABEL, ctorDescriptor: new SyncDescriptor(StartView), order: 10, weight: 40, canToggleVisibility: true, when: CONTEXT_DEBUG_UX.isEqualTo('simple') }], viewContainer);
|
||||
viewsRegistry.registerViews([{ id: WelcomeView.ID, name: WelcomeView.LABEL, ctorDescriptor: new SyncDescriptor(WelcomeView), order: 10, weight: 40, canToggleVisibility: true, when: CONTEXT_DEBUG_UX.isEqualTo('simple') }], viewContainer);
|
||||
viewsRegistry.registerViews([{ id: LOADED_SCRIPTS_VIEW_ID, name: nls.localize('loadedScripts', "Loaded Scripts"), ctorDescriptor: new SyncDescriptor(LoadedScriptsView), order: 35, weight: 5, canToggleVisibility: true, canMoveView: true, collapsed: true, when: ContextKeyExpr.and(CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
|
||||
|
||||
registerCommands();
|
||||
@@ -123,19 +125,20 @@ Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).regi
|
||||
Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(StatusBarColorProvider, LifecyclePhase.Eventually);
|
||||
|
||||
const debugCategory = nls.localize('debugCategory', "Debug");
|
||||
const runCategroy = nls.localize('runCategory', "Run");
|
||||
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(StartAction, StartAction.ID, StartAction.LABEL, { primary: KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE.toNegated()), 'Debug: Start Debugging', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL), 'Debug: Open launch.json', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(AddFunctionBreakpointAction, AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL), 'Debug: Add Function Breakpoint', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(ReapplyBreakpointsAction, ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL), 'Debug: Reapply All Breakpoints', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(RunAction, RunAction.ID, RunAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.F5, mac: { primary: KeyMod.WinCtrl | KeyCode.F5 } }), 'Debug: Run (Start Without Debugging)', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(RunAction, RunAction.ID, RunAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.F5, mac: { primary: KeyMod.WinCtrl | KeyCode.F5 } }), 'Run: Start Without Debugging', runCategroy);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(RemoveAllBreakpointsAction, RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL), 'Debug: Remove All Breakpoints', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(EnableAllBreakpointsAction, EnableAllBreakpointsAction.ID, EnableAllBreakpointsAction.LABEL), 'Debug: Enable All Breakpoints', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(DisableAllBreakpointsAction, DisableAllBreakpointsAction.ID, DisableAllBreakpointsAction.LABEL), 'Debug: Disable All Breakpoints', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(SelectAndStartAction, SelectAndStartAction.ID, SelectAndStartAction.LABEL), 'Debug: Select and Start Debugging', debugCategory);
|
||||
registry.registerWorkbenchAction(SyncActionDescriptor.create(ClearReplAction, ClearReplAction.ID, ClearReplAction.LABEL), 'Debug: Clear Console', debugCategory);
|
||||
|
||||
const registerDebugCommandPaletteItem = (id: string, title: string, when?: ContextKeyExpr, precondition?: ContextKeyExpr) => {
|
||||
const registerDebugCommandPaletteItem = (id: string, title: string, when?: ContextKeyExpression, precondition?: ContextKeyExpression) => {
|
||||
MenuRegistry.appendMenuItem(MenuId.CommandPalette, {
|
||||
when,
|
||||
command: {
|
||||
@@ -172,6 +175,14 @@ registerDebugCommandPaletteItem(TOGGLE_INLINE_BREAKPOINT_ID, nls.localize('inlin
|
||||
)
|
||||
);
|
||||
|
||||
// Register Quick Access
|
||||
Registry.as<IQuickAccessRegistry>(QuickAccessExtensions.Quickaccess).registerQuickAccessProvider({
|
||||
ctor: StartDebugQuickAccessProvider,
|
||||
prefix: StartDebugQuickAccessProvider.PREFIX,
|
||||
placeholder: nls.localize('startDebugPlaceholder', "Type the name of a launch configuration to run."),
|
||||
helpEntries: [{ description: nls.localize('startDebugHelp', "Start Debug Configurations"), needsEditor: false }]
|
||||
});
|
||||
|
||||
// register service
|
||||
registerSingleton(IDebugService, service.DebugService);
|
||||
|
||||
@@ -290,7 +301,7 @@ Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).regi
|
||||
|
||||
// Debug toolbar
|
||||
|
||||
const registerDebugToolBarItem = (id: string, title: string, order: number, icon: { light?: URI, dark?: URI } | ThemeIcon, when?: ContextKeyExpr, precondition?: ContextKeyExpr) => {
|
||||
const registerDebugToolBarItem = (id: string, title: string, order: number, icon: { light?: URI, dark?: URI } | ThemeIcon, when?: ContextKeyExpression, precondition?: ContextKeyExpression) => {
|
||||
MenuRegistry.appendMenuItem(MenuId.DebugToolBar, {
|
||||
group: 'navigation',
|
||||
when,
|
||||
@@ -316,7 +327,7 @@ registerDebugToolBarItem(STEP_BACK_ID, nls.localize('stepBackDebug', "Step Back"
|
||||
registerDebugToolBarItem(REVERSE_CONTINUE_ID, nls.localize('reverseContinue', "Reverse"), 60, { id: 'codicon/debug-reverse-continue' }, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
|
||||
|
||||
// Debug callstack context menu
|
||||
const registerDebugCallstackItem = (id: string, title: string, order: number, when?: ContextKeyExpr, precondition?: ContextKeyExpr, group = 'navigation') => {
|
||||
const registerDebugCallstackItem = (id: string, title: string, order: number, when?: ContextKeyExpression, precondition?: ContextKeyExpression, group = 'navigation') => {
|
||||
MenuRegistry.appendMenuItem(MenuId.DebugCallStackContext, {
|
||||
group,
|
||||
when,
|
||||
@@ -558,7 +569,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, {
|
||||
// Touch Bar
|
||||
if (isMacintosh) {
|
||||
|
||||
const registerTouchBarEntry = (id: string, title: string, order: number, when: ContextKeyExpr | undefined, iconUri: URI) => {
|
||||
const registerTouchBarEntry = (id: string, title: string, order: number, when: ContextKeyExpression | undefined, iconUri: URI) => {
|
||||
MenuRegistry.appendMenuItem(MenuId.TouchBarContext, {
|
||||
command: {
|
||||
id,
|
||||
|
||||
@@ -227,7 +227,7 @@ export function handleANSIOutput(text: string, linkDetector: LinkDetector, theme
|
||||
* nothing.
|
||||
*/
|
||||
function setBasicColor(styleCode: number): void {
|
||||
const theme = themeService.getTheme();
|
||||
const theme = themeService.getColorTheme();
|
||||
let colorType: 'foreground' | 'background' | undefined;
|
||||
let colorIndex: number | undefined;
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ export class StartAction extends AbstractDebugAction {
|
||||
|
||||
export class RunAction extends StartAction {
|
||||
static readonly ID = 'workbench.action.debug.run';
|
||||
static LABEL = nls.localize('startWithoutDebugging', "Run (Start Without Debugging)");
|
||||
static LABEL = nls.localize('startWithoutDebugging', "Start Without Debugging");
|
||||
|
||||
protected isNoDebug(): boolean {
|
||||
return true;
|
||||
|
||||
@@ -158,13 +158,13 @@ export function registerCommands(): void {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
const stackFrame = debugService.getViewModel().focusedStackFrame;
|
||||
const editorService = accessor.get(IEditorService);
|
||||
const activeEditor = editorService.activeTextEditorWidget;
|
||||
const activeEditorControl = editorService.activeTextEditorControl;
|
||||
const notificationService = accessor.get(INotificationService);
|
||||
const quickInputService = accessor.get(IQuickInputService);
|
||||
|
||||
if (stackFrame && isCodeEditor(activeEditor) && activeEditor.hasModel()) {
|
||||
const position = activeEditor.getPosition();
|
||||
const resource = activeEditor.getModel().uri;
|
||||
if (stackFrame && isCodeEditor(activeEditorControl) && activeEditorControl.hasModel()) {
|
||||
const position = activeEditorControl.getPosition();
|
||||
const resource = activeEditorControl.getModel().uri;
|
||||
const source = stackFrame.thread.session.getSourceForUri(resource);
|
||||
if (source) {
|
||||
const response = await stackFrame.thread.session.gotoTargets(source.raw, position.lineNumber, position.column);
|
||||
@@ -368,11 +368,11 @@ export function registerCommands(): void {
|
||||
handler: (accessor) => {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
const editorService = accessor.get(IEditorService);
|
||||
const widget = editorService.activeTextEditorWidget;
|
||||
if (isCodeEditor(widget)) {
|
||||
const model = widget.getModel();
|
||||
const control = editorService.activeTextEditorControl;
|
||||
if (isCodeEditor(control)) {
|
||||
const model = control.getModel();
|
||||
if (model) {
|
||||
const position = widget.getPosition();
|
||||
const position = control.getPosition();
|
||||
if (position) {
|
||||
const bps = debugService.getModel().getBreakpoints({ uri: model.uri, lineNumber: position.lineNumber });
|
||||
if (bps.length) {
|
||||
@@ -514,11 +514,11 @@ export function registerCommands(): void {
|
||||
const inlineBreakpointHandler = (accessor: ServicesAccessor) => {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
const editorService = accessor.get(IEditorService);
|
||||
const widget = editorService.activeTextEditorWidget;
|
||||
if (isCodeEditor(widget)) {
|
||||
const position = widget.getPosition();
|
||||
if (position && widget.hasModel() && debugService.getConfigurationManager().canSetBreakpointsIn(widget.getModel())) {
|
||||
const modelUri = widget.getModel().uri;
|
||||
const control = editorService.activeTextEditorControl;
|
||||
if (isCodeEditor(control)) {
|
||||
const position = control.getPosition();
|
||||
if (position && control.hasModel() && debugService.getConfigurationManager().canSetBreakpointsIn(control.getModel())) {
|
||||
const modelUri = control.getModel().uri;
|
||||
const breakpointAlreadySet = debugService.getModel().getBreakpoints({ lineNumber: position.lineNumber, uri: modelUri })
|
||||
.some(bp => (bp.sessionAgnosticData.column === position.column || (!bp.column && position.column <= 1)));
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import { URI as uri } from 'vs/base/common/uri';
|
||||
import * as resources from 'vs/base/common/resources';
|
||||
import { IJSONSchema } from 'vs/base/common/jsonSchema';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { IEditor } from 'vs/workbench/common/editor';
|
||||
import { IEditorPane } from 'vs/workbench/common/editor';
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
@@ -443,10 +443,10 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
return Promise.resolve(adapter);
|
||||
}
|
||||
|
||||
const activeTextEditorWidget = this.editorService.activeTextEditorWidget;
|
||||
const activeTextEditorControl = this.editorService.activeTextEditorControl;
|
||||
let candidates: Debugger[] | undefined;
|
||||
if (isCodeEditor(activeTextEditorWidget)) {
|
||||
const model = activeTextEditorWidget.getModel();
|
||||
if (isCodeEditor(activeTextEditorControl)) {
|
||||
const model = activeTextEditorControl.getModel();
|
||||
const language = model ? model.getLanguageIdentifier().language : undefined;
|
||||
const adapters = this.debuggers.filter(a => language && a.languages && a.languages.indexOf(language) >= 0);
|
||||
if (adapters.length === 1) {
|
||||
@@ -573,7 +573,7 @@ class Launch extends AbstractLaunch implements ILaunch {
|
||||
return this.configurationService.inspect<IGlobalConfig>('launch', { resource: this.workspace.uri }).workspaceFolderValue;
|
||||
}
|
||||
|
||||
async openConfigFile(sideBySide: boolean, preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditor | null, created: boolean }> {
|
||||
async openConfigFile(sideBySide: boolean, preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null, created: boolean }> {
|
||||
const resource = this.uri;
|
||||
let created = false;
|
||||
let content = '';
|
||||
@@ -653,7 +653,7 @@ class WorkspaceLaunch extends AbstractLaunch implements ILaunch {
|
||||
return this.configurationService.inspect<IGlobalConfig>('launch').workspaceValue;
|
||||
}
|
||||
|
||||
async openConfigFile(sideBySide: boolean, preserveFocus: boolean): Promise<{ editor: IEditor | null, created: boolean }> {
|
||||
async openConfigFile(sideBySide: boolean, preserveFocus: boolean): Promise<{ editor: IEditorPane | null, created: boolean }> {
|
||||
|
||||
const editor = await this.editorService.openEditor({
|
||||
resource: this.contextService.getWorkspace().configuration!,
|
||||
@@ -696,8 +696,8 @@ class UserLaunch extends AbstractLaunch implements ILaunch {
|
||||
return this.configurationService.inspect<IGlobalConfig>('launch').userValue;
|
||||
}
|
||||
|
||||
async openConfigFile(_: boolean, preserveFocus: boolean): Promise<{ editor: IEditor | null, created: boolean }> {
|
||||
const editor = await this.preferencesService.openGlobalSettings(false, { preserveFocus });
|
||||
async openConfigFile(_: boolean, preserveFocus: boolean): Promise<{ editor: IEditorPane | null, created: boolean }> {
|
||||
const editor = await this.preferencesService.openGlobalSettings(true, { preserveFocus });
|
||||
return ({
|
||||
editor: withUndefinedAsNull(editor),
|
||||
created: false
|
||||
|
||||
92
src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts
Normal file
92
src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
|
||||
import { PickerQuickAccessProvider, IPickerQuickAccessItem } from 'vs/platform/quickinput/common/quickAccess';
|
||||
import { localize } from 'vs/nls';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { IDebugService } from 'vs/workbench/contrib/debug/common/debug';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { matchesFuzzy } from 'vs/base/common/filters';
|
||||
import { StartAction } from 'vs/workbench/contrib/debug/browser/debugActions';
|
||||
import { withNullAsUndefined } from 'vs/base/common/types';
|
||||
|
||||
export class StartDebugQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {
|
||||
|
||||
static PREFIX = 'debug ';
|
||||
|
||||
constructor(
|
||||
@IDebugService private readonly debugService: IDebugService,
|
||||
@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
|
||||
@ICommandService private readonly commandService: ICommandService,
|
||||
@INotificationService private readonly notificationService: INotificationService
|
||||
) {
|
||||
super(StartDebugQuickAccessProvider.PREFIX);
|
||||
}
|
||||
|
||||
protected getPicks(filter: string): (IQuickPickSeparator | IPickerQuickAccessItem)[] {
|
||||
const picks: Array<IPickerQuickAccessItem | IQuickPickSeparator> = [];
|
||||
|
||||
const configManager = this.debugService.getConfigurationManager();
|
||||
|
||||
// Entries: configs
|
||||
let lastGroup: string | undefined;
|
||||
for (let config of configManager.getAllConfigurations()) {
|
||||
const highlights = matchesFuzzy(filter, config.name, true);
|
||||
if (highlights) {
|
||||
|
||||
// Separator
|
||||
if (lastGroup !== config.presentation?.group) {
|
||||
picks.push({ type: 'separator' });
|
||||
lastGroup = config.presentation?.group;
|
||||
}
|
||||
|
||||
// Launch entry
|
||||
picks.push({
|
||||
label: config.name,
|
||||
ariaLabel: localize('entryAriaLabel', "{0}, debug", config.name),
|
||||
description: this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ? config.launch.name : '',
|
||||
highlights: { label: highlights },
|
||||
accept: async () => {
|
||||
if (StartAction.isEnabled(this.debugService)) {
|
||||
this.debugService.getConfigurationManager().selectConfiguration(config.launch, config.name);
|
||||
try {
|
||||
await this.debugService.startDebugging(config.launch);
|
||||
} catch (error) {
|
||||
this.notificationService.error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Entries: launches
|
||||
const visibleLaunches = configManager.getLaunches().filter(launch => !launch.hidden);
|
||||
|
||||
// Separator
|
||||
if (visibleLaunches.length > 0) {
|
||||
picks.push({ type: 'separator' });
|
||||
}
|
||||
|
||||
for (const launch of visibleLaunches) {
|
||||
const label = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ?
|
||||
localize("addConfigTo", "Add Config ({0})...", launch.name) :
|
||||
localize('addConfiguration', "Add Configuration...");
|
||||
|
||||
// Add Config entry
|
||||
picks.push({
|
||||
label,
|
||||
ariaLabel: localize('entryAriaLabel', "{0}, debug", label),
|
||||
description: this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ? launch.name : '',
|
||||
highlights: { label: withNullAsUndefined(matchesFuzzy(filter, label, true)) },
|
||||
accept: () => this.commandService.executeCommand('debug.addConfiguration', launch.uri.toString())
|
||||
});
|
||||
}
|
||||
|
||||
return picks;
|
||||
}
|
||||
}
|
||||
@@ -46,6 +46,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation';
|
||||
import { TaskRunResult, DebugTaskRunner } from 'vs/workbench/contrib/debug/browser/debugTaskRunner';
|
||||
import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity';
|
||||
import { IViewsService } from 'vs/workbench/common/views';
|
||||
import { generateUuid } from 'vs/base/common/uuid';
|
||||
|
||||
const DEBUG_BREAKPOINTS_KEY = 'debug.breakpoint';
|
||||
const DEBUG_FUNCTION_BREAKPOINTS_KEY = 'debug.functionbreakpoint';
|
||||
@@ -73,7 +74,7 @@ export class DebugService implements IDebugService {
|
||||
private breakpointsToSendOnResourceSaved: Set<string>;
|
||||
private initializing = false;
|
||||
private previousState: State | undefined;
|
||||
private initCancellationToken: CancellationTokenSource | undefined;
|
||||
private sessionCancellationTokens = new Map<string, CancellationTokenSource>();
|
||||
private activity: IDisposable | undefined;
|
||||
|
||||
constructor(
|
||||
@@ -206,24 +207,33 @@ export class DebugService implements IDebugService {
|
||||
return this.initializing ? State.Initializing : State.Inactive;
|
||||
}
|
||||
|
||||
private startInitializingState() {
|
||||
private startInitializingState(): void {
|
||||
if (!this.initializing) {
|
||||
this.initializing = true;
|
||||
this.onStateChange();
|
||||
}
|
||||
}
|
||||
|
||||
private endInitializingState() {
|
||||
if (this.initCancellationToken) {
|
||||
this.initCancellationToken.cancel();
|
||||
this.initCancellationToken = undefined;
|
||||
}
|
||||
private endInitializingState(): void {
|
||||
if (this.initializing) {
|
||||
this.initializing = false;
|
||||
this.onStateChange();
|
||||
}
|
||||
}
|
||||
|
||||
private cancelTokens(id: string | undefined): void {
|
||||
if (id) {
|
||||
const token = this.sessionCancellationTokens.get(id);
|
||||
if (token) {
|
||||
token.cancel();
|
||||
this.sessionCancellationTokens.delete(id);
|
||||
}
|
||||
} else {
|
||||
this.sessionCancellationTokens.forEach(t => t.cancel());
|
||||
this.sessionCancellationTokens.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private onStateChange(): void {
|
||||
const state = this.state;
|
||||
if (this.previousState !== state) {
|
||||
@@ -380,8 +390,11 @@ export class DebugService implements IDebugService {
|
||||
}
|
||||
}
|
||||
|
||||
this.initCancellationToken = new CancellationTokenSource();
|
||||
const configByProviders = await this.configurationManager.resolveConfigurationByProviders(launch && launch.workspace ? launch.workspace.uri : undefined, type, config!, this.initCancellationToken.token);
|
||||
const initCancellationToken = new CancellationTokenSource();
|
||||
const sessionId = generateUuid();
|
||||
this.sessionCancellationTokens.set(sessionId, initCancellationToken);
|
||||
|
||||
const configByProviders = await this.configurationManager.resolveConfigurationByProviders(launch && launch.workspace ? launch.workspace.uri : undefined, type, config!, initCancellationToken.token);
|
||||
// a falsy config indicates an aborted launch
|
||||
if (configByProviders && configByProviders.type) {
|
||||
try {
|
||||
@@ -391,15 +404,15 @@ export class DebugService implements IDebugService {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.initCancellationToken) {
|
||||
if (initCancellationToken.token.isCancellationRequested) {
|
||||
// User cancelled, silently return
|
||||
return false;
|
||||
}
|
||||
|
||||
const cfg = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, type, resolvedConfig, this.initCancellationToken.token);
|
||||
const cfg = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, type, resolvedConfig, initCancellationToken.token);
|
||||
if (!cfg) {
|
||||
if (launch && type && cfg === null && this.initCancellationToken) { // show launch.json only for "config" being "null".
|
||||
await launch.openConfigFile(false, true, type, this.initCancellationToken.token);
|
||||
if (launch && type && cfg === null && !initCancellationToken.token.isCancellationRequested) { // show launch.json only for "config" being "null".
|
||||
await launch.openConfigFile(false, true, type, initCancellationToken.token);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -423,7 +436,7 @@ export class DebugService implements IDebugService {
|
||||
const workspace = launch?.workspace || this.contextService.getWorkspace();
|
||||
const taskResult = await this.taskRunner.runTaskAndCheckErrors(workspace, resolvedConfig.preLaunchTask, (msg, actions) => this.showError(msg, actions));
|
||||
if (taskResult === TaskRunResult.Success) {
|
||||
return this.doCreateSession(launch?.workspace, { resolved: resolvedConfig, unresolved: unresolvedConfig }, options);
|
||||
return this.doCreateSession(sessionId, launch?.workspace, { resolved: resolvedConfig, unresolved: unresolvedConfig }, options);
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
@@ -432,16 +445,16 @@ export class DebugService implements IDebugService {
|
||||
} else if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
|
||||
await this.showError(nls.localize('noFolderWorkspaceDebugError', "The active file can not be debugged. Make sure it is saved and that you have a debug extension installed for that file type."));
|
||||
}
|
||||
if (launch && this.initCancellationToken) {
|
||||
await launch.openConfigFile(false, true, undefined, this.initCancellationToken.token);
|
||||
if (launch && !initCancellationToken.token.isCancellationRequested) {
|
||||
await launch.openConfigFile(false, true, undefined, initCancellationToken.token);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (launch && type && configByProviders === null && this.initCancellationToken) { // show launch.json only for "config" being "null".
|
||||
await launch.openConfigFile(false, true, type, this.initCancellationToken.token);
|
||||
if (launch && type && configByProviders === null && !initCancellationToken.token.isCancellationRequested) { // show launch.json only for "config" being "null".
|
||||
await launch.openConfigFile(false, true, type, initCancellationToken.token);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -450,9 +463,9 @@ export class DebugService implements IDebugService {
|
||||
/**
|
||||
* instantiates the new session, initializes the session, registers session listeners and reports telemetry
|
||||
*/
|
||||
private async doCreateSession(root: IWorkspaceFolder | undefined, configuration: { resolved: IConfig, unresolved: IConfig | undefined }, options?: IDebugSessionOptions): Promise<boolean> {
|
||||
private async doCreateSession(sessionId: string, root: IWorkspaceFolder | undefined, configuration: { resolved: IConfig, unresolved: IConfig | undefined }, options?: IDebugSessionOptions): Promise<boolean> {
|
||||
|
||||
const session = this.instantiationService.createInstance(DebugSession, configuration, root, this.model, options);
|
||||
const session = this.instantiationService.createInstance(DebugSession, sessionId, configuration, root, this.model, options);
|
||||
this.model.addSession(session);
|
||||
// register listeners as the very first thing!
|
||||
this.registerSessionListeners(session);
|
||||
@@ -566,6 +579,7 @@ export class DebugService implements IDebugService {
|
||||
}
|
||||
}
|
||||
this.endInitializingState();
|
||||
this.cancelTokens(session.getId());
|
||||
this._onDidEndSession.fire(session);
|
||||
|
||||
const focusedSession = this.viewModel.focusedSession;
|
||||
@@ -656,12 +670,13 @@ export class DebugService implements IDebugService {
|
||||
|
||||
let resolved: IConfig | undefined | null = session.configuration;
|
||||
if (launch && needsToSubstitute && unresolved) {
|
||||
this.initCancellationToken = new CancellationTokenSource();
|
||||
const resolvedByProviders = await this.configurationManager.resolveConfigurationByProviders(launch.workspace ? launch.workspace.uri : undefined, unresolved.type, unresolved, this.initCancellationToken.token);
|
||||
const initCancellationToken = new CancellationTokenSource();
|
||||
this.sessionCancellationTokens.set(session.getId(), initCancellationToken);
|
||||
const resolvedByProviders = await this.configurationManager.resolveConfigurationByProviders(launch.workspace ? launch.workspace.uri : undefined, unresolved.type, unresolved, initCancellationToken.token);
|
||||
if (resolvedByProviders) {
|
||||
resolved = await this.substituteVariables(launch, resolvedByProviders);
|
||||
if (resolved && this.initCancellationToken) {
|
||||
resolved = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, unresolved.type, resolved, this.initCancellationToken.token);
|
||||
if (resolved && !initCancellationToken.token.isCancellationRequested) {
|
||||
resolved = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, unresolved.type, resolved, initCancellationToken.token);
|
||||
}
|
||||
} else {
|
||||
resolved = resolvedByProviders;
|
||||
@@ -695,6 +710,7 @@ export class DebugService implements IDebugService {
|
||||
if (sessions.length === 0) {
|
||||
this.taskRunner.cancel();
|
||||
this.endInitializingState();
|
||||
this.cancelTokens(undefined);
|
||||
}
|
||||
|
||||
return Promise.all(sessions.map(s => s.terminate()));
|
||||
|
||||
@@ -37,7 +37,6 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
|
||||
export class DebugSession implements IDebugSession {
|
||||
|
||||
private id: string;
|
||||
private _subId: string | undefined;
|
||||
private raw: RawDebugSession | undefined;
|
||||
private initialized = false;
|
||||
@@ -62,6 +61,7 @@ export class DebugSession implements IDebugSession {
|
||||
private readonly _onDidChangeName = new Emitter<string>();
|
||||
|
||||
constructor(
|
||||
private id: string,
|
||||
private _configuration: { resolved: IConfig, unresolved: IConfig | undefined },
|
||||
public root: IWorkspaceFolder | undefined,
|
||||
private model: DebugModel,
|
||||
@@ -78,7 +78,6 @@ export class DebugSession implements IDebugSession {
|
||||
@INotificationService private readonly notificationService: INotificationService,
|
||||
@ILifecycleService lifecycleService: ILifecycleService
|
||||
) {
|
||||
this.id = generateUuid();
|
||||
this._options = options || {};
|
||||
if (this.hasSeparateRepl()) {
|
||||
this.repl = new ReplModel();
|
||||
|
||||
@@ -18,8 +18,7 @@ import { FocusSessionActionViewItem } from 'vs/workbench/contrib/debug/browser/d
|
||||
import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration';
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { Themable } from 'vs/workbench/common/theme';
|
||||
import { registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { registerThemingParticipant, IThemeService, Themable } from 'vs/platform/theme/common/themeService';
|
||||
import { registerColor, contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { localize } from 'vs/nls';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
@@ -67,7 +66,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution {
|
||||
super(themeService);
|
||||
|
||||
this.$el = dom.$('div.debug-toolbar');
|
||||
this.$el.style.top = `${layoutService.getTitleBarOffset()}px`;
|
||||
this.$el.style.top = `${layoutService.offset?.top ?? 0}px`;
|
||||
|
||||
this.dragArea = dom.append(this.$el, dom.$('div.drag-area.codicon.codicon-gripper'));
|
||||
|
||||
@@ -152,7 +151,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution {
|
||||
// Prevent default to stop editor selecting text #8524
|
||||
mouseMoveEvent.preventDefault();
|
||||
// Reduce x by width of drag handle to reduce jarring #16604
|
||||
this.setCoordinates(mouseMoveEvent.posx - 14, mouseMoveEvent.posy - this.layoutService.getTitleBarOffset());
|
||||
this.setCoordinates(mouseMoveEvent.posx - 14, mouseMoveEvent.posy - (this.layoutService.offset?.top ?? 0));
|
||||
});
|
||||
|
||||
const mouseUpListener = dom.addDisposableGenericMouseUpListner(window, (e: MouseEvent) => {
|
||||
@@ -198,7 +197,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution {
|
||||
}
|
||||
|
||||
private setYCoordinate(y = this.yCoordinate): void {
|
||||
const titlebarOffset = this.layoutService.getTitleBarOffset();
|
||||
const titlebarOffset = this.layoutService.offset?.top ?? 0;
|
||||
this.$el.style.top = `${titlebarOffset + y}px`;
|
||||
this.yCoordinate = y;
|
||||
}
|
||||
@@ -240,7 +239,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution {
|
||||
}
|
||||
if (!this.isBuilt) {
|
||||
this.isBuilt = true;
|
||||
this.layoutService.getWorkbenchElement().appendChild(this.$el);
|
||||
this.layoutService.container.appendChild(this.$el);
|
||||
}
|
||||
|
||||
this.isVisible = true;
|
||||
|
||||
@@ -32,8 +32,8 @@ import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryAc
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { TogglePanelAction } from 'vs/workbench/browser/panel';
|
||||
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
|
||||
import { StartView } from 'vs/workbench/contrib/debug/browser/startView';
|
||||
import { IViewDescriptorService } from 'vs/workbench/common/views';
|
||||
import { WelcomeView } from 'vs/workbench/contrib/debug/browser/welcomeView';
|
||||
|
||||
export class DebugViewPaneContainer extends ViewPaneContainer {
|
||||
|
||||
@@ -92,7 +92,7 @@ export class DebugViewPaneContainer extends ViewPaneContainer {
|
||||
if (this.startDebugActionViewItem) {
|
||||
this.startDebugActionViewItem.focus();
|
||||
} else {
|
||||
this.focusView(StartView.ID);
|
||||
this.focusView(WelcomeView.ID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { IExceptionInfo, IDebugSession } from 'vs/workbench/contrib/debug/common/debug';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService';
|
||||
import { IThemeService, IColorTheme } from 'vs/platform/theme/common/themeService';
|
||||
import { Color } from 'vs/base/common/color';
|
||||
import { registerColor } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
@@ -35,8 +35,8 @@ export class ExceptionWidget extends ZoneWidget {
|
||||
|
||||
this._backgroundColor = Color.white;
|
||||
|
||||
this._applyTheme(themeService.getTheme());
|
||||
this._disposables.add(themeService.onThemeChange(this._applyTheme.bind(this)));
|
||||
this._applyTheme(themeService.getColorTheme());
|
||||
this._disposables.add(themeService.onDidColorThemeChange(this._applyTheme.bind(this)));
|
||||
|
||||
this.create();
|
||||
const onDidLayoutChangeScheduler = new RunOnceScheduler(() => this._doLayout(undefined, undefined), 50);
|
||||
@@ -44,7 +44,7 @@ export class ExceptionWidget extends ZoneWidget {
|
||||
this._disposables.add(onDidLayoutChangeScheduler);
|
||||
}
|
||||
|
||||
private _applyTheme(theme: ITheme): void {
|
||||
private _applyTheme(theme: IColorTheme): void {
|
||||
this._backgroundColor = theme.getColor(debugExceptionWidgetBackground);
|
||||
const frameColor = theme.getColor(debugExceptionWidgetBorder);
|
||||
this.style({
|
||||
|
||||
@@ -7,7 +7,7 @@ import * as nls from 'vs/nls';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
|
||||
import { normalize, isAbsolute, posix } from 'vs/base/common/path';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
@@ -29,7 +29,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
|
||||
import { ITreeNode, ITreeFilter, TreeVisibility, TreeFilterResult, ITreeElement } from 'vs/base/browser/ui/tree/tree';
|
||||
import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { TreeResourceNavigator, WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService';
|
||||
import { ResourceNavigator, WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService';
|
||||
import { dispose } from 'vs/base/common/lifecycle';
|
||||
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
|
||||
import { DebugContentProvider } from 'vs/workbench/contrib/debug/common/debugContentProvider';
|
||||
@@ -430,7 +430,7 @@ export class LoadedScriptsView extends ViewPane {
|
||||
@IThemeService themeService: IThemeService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('loadedScriptsSection', "Loaded Scripts Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
this.loadedScriptsItemType = CONTEXT_LOADED_SCRIPTS_ITEM_TYPE.bindTo(contextKeyService);
|
||||
}
|
||||
|
||||
@@ -491,7 +491,7 @@ export class LoadedScriptsView extends ViewPane {
|
||||
}, 300);
|
||||
this._register(this.changeScheduler);
|
||||
|
||||
const loadedScriptsNavigator = new TreeResourceNavigator(this.tree);
|
||||
const loadedScriptsNavigator = ResourceNavigator.createTreeResourceNavigator(this.tree);
|
||||
this._register(loadedScriptsNavigator);
|
||||
this._register(loadedScriptsNavigator.onDidOpenResource(e => {
|
||||
if (e.element instanceof BaseTreeItem) {
|
||||
|
||||
@@ -153,6 +153,7 @@
|
||||
|
||||
.debug-pane .debug-call-stack .monaco-list-row .monaco-action-bar {
|
||||
display: none;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.debug-pane .debug-call-stack .monaco-list-row:hover .monaco-action-bar {
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
margin-right: 8px;
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
max-width: 150px;
|
||||
}
|
||||
|
||||
.repl .repl-tree .monaco-list-row {
|
||||
|
||||
@@ -270,7 +270,7 @@ export class RawDebugSession implements IDisposable {
|
||||
if (this.capabilities.supportsTerminateRequest) {
|
||||
if (!this.terminated) {
|
||||
this.terminated = true;
|
||||
return this.send('terminate', { restart }, undefined, 500);
|
||||
return this.send('terminate', { restart }, undefined, 1000);
|
||||
}
|
||||
return this.disconnect(restart);
|
||||
}
|
||||
@@ -481,7 +481,7 @@ export class RawDebugSession implements IDisposable {
|
||||
this.inShutdown = true;
|
||||
if (this.debugAdapter) {
|
||||
try {
|
||||
await this.send('disconnect', { restart }, undefined, 500);
|
||||
await this.send('disconnect', { restart }, undefined, 1000);
|
||||
} finally {
|
||||
this.stopAdapter(error);
|
||||
}
|
||||
@@ -601,9 +601,15 @@ export class RawDebugSession implements IDisposable {
|
||||
private send<R extends DebugProtocol.Response>(command: string, args: any, token?: CancellationToken, timeout?: number): Promise<R> {
|
||||
return new Promise<DebugProtocol.Response>((completeDispatch, errorDispatch) => {
|
||||
if (!this.debugAdapter) {
|
||||
errorDispatch(new Error(nls.localize('noDebugAdapter', "No debug adapter found. Can not send '{0}'.", command)));
|
||||
if (this.inShutdown) {
|
||||
// We are in shutdown silently complete
|
||||
completeDispatch();
|
||||
} else {
|
||||
errorDispatch(new Error(nls.localize('noDebugAdapter', "No debug adapter found. Can not send '{0}'.", command)));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
let cancelationListener: IDisposable;
|
||||
const requestId = this.debugAdapter.sendRequest(command, args, (response: DebugProtocol.Response) => {
|
||||
if (cancelationListener) {
|
||||
|
||||
@@ -113,7 +113,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
@IOpenerService openerService: IOpenerService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), id: REPL_VIEW_ID, ariaHeaderLabel: localize('debugConsole', "Debug Console") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
|
||||
this.history = new HistoryNavigator(JSON.parse(this.storageService.get(HISTORY_STORAGE_KEY, StorageScope.WORKSPACE, '[]')), 50);
|
||||
codeEditorService.registerDecorationType(DECORATION_KEY, {});
|
||||
@@ -190,7 +190,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
}
|
||||
this.updateActions();
|
||||
}));
|
||||
this._register(this.themeService.onThemeChange(() => {
|
||||
this._register(this.themeService.onDidColorThemeChange(() => {
|
||||
this.refreshReplElements(false);
|
||||
if (this.isVisible()) {
|
||||
this.updateInputDecoration();
|
||||
@@ -244,12 +244,12 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
return;
|
||||
}
|
||||
|
||||
const activeEditor = this.editorService.activeTextEditorWidget;
|
||||
if (isCodeEditor(activeEditor)) {
|
||||
const activeEditorControl = this.editorService.activeTextEditorControl;
|
||||
if (isCodeEditor(activeEditorControl)) {
|
||||
this.modelChangeListener.dispose();
|
||||
this.modelChangeListener = activeEditor.onDidChangeModelLanguage(() => this.setMode());
|
||||
if (activeEditor.hasModel()) {
|
||||
this.model.setMode(activeEditor.getModel().getLanguageIdentifier());
|
||||
this.modelChangeListener = activeEditorControl.onDidChangeModelLanguage(() => this.setMode());
|
||||
if (activeEditorControl.hasModel()) {
|
||||
this.model.setMode(activeEditorControl.getModel().getLanguageIdentifier());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -421,6 +421,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
|
||||
@memoize
|
||||
private get refreshScheduler(): RunOnceScheduler {
|
||||
const autoExpanded = new Set<string>();
|
||||
return new RunOnceScheduler(async () => {
|
||||
if (!this.tree.getInput()) {
|
||||
return;
|
||||
@@ -431,11 +432,22 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
|
||||
const session = this.tree.getInput();
|
||||
if (session) {
|
||||
const replElements = session.getReplElements();
|
||||
const lastElement = replElements.length ? replElements[replElements.length - 1] : undefined;
|
||||
if (lastElement instanceof ReplGroup && lastElement.autoExpand) {
|
||||
await this.tree.expand(lastElement);
|
||||
}
|
||||
// Automatically expand repl group elements when specified
|
||||
const autoExpandElements = async (elements: IReplElement[]) => {
|
||||
for (let element of elements) {
|
||||
if (element instanceof ReplGroup) {
|
||||
if (element.autoExpand && !autoExpanded.has(element.getId())) {
|
||||
autoExpanded.add(element.getId());
|
||||
await this.tree.expand(element);
|
||||
}
|
||||
if (!this.tree.isCollapsed(element)) {
|
||||
// Repl groups can have children which are repl groups thus we might need to expand those as well
|
||||
await autoExpandElements(element.getChildren());
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
await autoExpandElements(session.getReplElements());
|
||||
}
|
||||
|
||||
if (lastElementVisible) {
|
||||
@@ -582,7 +594,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
|
||||
|
||||
const decorations: IDecorationOptions[] = [];
|
||||
if (this.isReadonly && this.replInput.hasTextFocus() && !this.replInput.getValue()) {
|
||||
const transparentForeground = transparent(editorForeground, 0.4)(this.themeService.getTheme());
|
||||
const transparentForeground = transparent(editorForeground, 0.4)(this.themeService.getColorTheme());
|
||||
decorations.push({
|
||||
range: {
|
||||
startLineNumber: 0,
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { IThemeService, Themable } from 'vs/platform/theme/common/themeService';
|
||||
import { localize } from 'vs/nls';
|
||||
import { registerColor, contrastBorder } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
|
||||
import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService';
|
||||
import { IDebugService, State, IDebugSession } from 'vs/workbench/contrib/debug/common/debug';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_BACKGROUND, Themable, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER, STATUS_BAR_BORDER } from 'vs/workbench/common/theme';
|
||||
import { STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER, STATUS_BAR_BORDER } from 'vs/workbench/common/theme';
|
||||
import { addClass, removeClass, createStyleSheet } from 'vs/base/browser/dom';
|
||||
import { assertIsDefined } from 'vs/base/common/types';
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { CopyValueAction } from 'vs/workbench/contrib/debug/browser/debugActions';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
|
||||
import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
|
||||
import { ITreeRenderer, ITreeNode, ITreeMouseEvent, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree';
|
||||
@@ -61,7 +61,7 @@ export class VariablesView extends ViewPane {
|
||||
@IThemeService themeService: IThemeService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('variablesSection', "Variables Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
|
||||
// Use scheduler to prevent unnecessary flashing
|
||||
this.onFocusStackFrameScheduler = new RunOnceScheduler(async () => {
|
||||
|
||||
@@ -18,7 +18,7 @@ import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { renderExpressionValue, renderViewTree, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
|
||||
import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
|
||||
import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService';
|
||||
@@ -58,7 +58,7 @@ export class WatchExpressionsView extends ViewPane {
|
||||
@IThemeService themeService: IThemeService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('watchExpressionsSection', "Watch Expressions Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
|
||||
this.onWatchExpressionsUpdatedScheduler = new RunOnceScheduler(() => {
|
||||
this.needsRefresh = false;
|
||||
|
||||
@@ -13,7 +13,7 @@ import { localize } from 'vs/nls';
|
||||
import { StartAction, ConfigureAction } from 'vs/workbench/contrib/debug/browser/debugActions';
|
||||
import { IDebugService } from 'vs/workbench/contrib/debug/common/debug';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IViewDescriptorService, IViewsRegistry, Extensions } from 'vs/workbench/common/views';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
@@ -29,10 +29,10 @@ const debugStartLanguageKey = 'debugStartLanguage';
|
||||
const CONTEXT_DEBUG_START_LANGUAGE = new RawContextKey<string>(debugStartLanguageKey, undefined);
|
||||
const CONTEXT_DEBUGGER_INTERESTED_IN_ACTIVE_EDITOR = new RawContextKey<boolean>('debuggerInterestedInActiveEditor', false);
|
||||
|
||||
export class StartView extends ViewPane {
|
||||
export class WelcomeView extends ViewPane {
|
||||
|
||||
static ID = 'workbench.debug.startView';
|
||||
static LABEL = localize('start', "Start");
|
||||
static ID = 'workbench.debug.welcome';
|
||||
static LABEL = localize('run', "Run");
|
||||
|
||||
private debugStartLanguageContext: IContextKey<string | undefined>;
|
||||
private debuggerInterestedContext: IContextKey<boolean>;
|
||||
@@ -52,7 +52,7 @@ export class StartView extends ViewPane {
|
||||
@IStorageService storageSevice: IStorageService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: localize('debugStart', "Debug Start Section") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
|
||||
this.debugStartLanguageContext = CONTEXT_DEBUG_START_LANGUAGE.bindTo(contextKeyService);
|
||||
this.debuggerInterestedContext = CONTEXT_DEBUGGER_INTERESTED_IN_ACTIVE_EDITOR.bindTo(contextKeyService);
|
||||
@@ -60,9 +60,9 @@ export class StartView extends ViewPane {
|
||||
this.debugStartLanguageContext.set(lastSetLanguage);
|
||||
|
||||
const setContextKey = () => {
|
||||
const editor = this.editorService.activeTextEditorWidget;
|
||||
if (isCodeEditor(editor)) {
|
||||
const model = editor.getModel();
|
||||
const editorControl = this.editorService.activeTextEditorControl;
|
||||
if (isCodeEditor(editorControl)) {
|
||||
const model = editorControl.getModel();
|
||||
const language = model ? model.getLanguageIdentifier().language : undefined;
|
||||
if (language && this.debugService.getConfigurationManager().isDebuggerInterestedInLanguage(language)) {
|
||||
this.debugStartLanguageContext.set(language);
|
||||
@@ -87,23 +87,23 @@ export class StartView extends ViewPane {
|
||||
}
|
||||
|
||||
const viewsRegistry = Registry.as<IViewsRegistry>(Extensions.ViewsRegistry);
|
||||
viewsRegistry.registerViewWelcomeContent(StartView.ID, {
|
||||
viewsRegistry.registerViewWelcomeContent(WelcomeView.ID, {
|
||||
content: localize('openAFileWhichCanBeDebugged', "[Open a file](command:{0}) which can be debugged or run.", isMacintosh ? OpenFileFolderAction.ID : OpenFileAction.ID),
|
||||
when: CONTEXT_DEBUGGER_INTERESTED_IN_ACTIVE_EDITOR.toNegated()
|
||||
});
|
||||
|
||||
let debugKeybindingLabel = '';
|
||||
viewsRegistry.registerViewWelcomeContent(StartView.ID, {
|
||||
viewsRegistry.registerViewWelcomeContent(WelcomeView.ID, {
|
||||
content: localize('runAndDebugAction', "[Run and Debug{0}](command:{1})", debugKeybindingLabel, StartAction.ID),
|
||||
preconditions: [CONTEXT_DEBUGGER_INTERESTED_IN_ACTIVE_EDITOR]
|
||||
});
|
||||
|
||||
viewsRegistry.registerViewWelcomeContent(StartView.ID, {
|
||||
viewsRegistry.registerViewWelcomeContent(WelcomeView.ID, {
|
||||
content: localize('customizeRunAndDebug', "To customize Run and Debug [create a launch.json file](command:{0}).", ConfigureAction.ID),
|
||||
when: WorkbenchStateContext.notEqualsTo('empty')
|
||||
});
|
||||
|
||||
viewsRegistry.registerViewWelcomeContent(StartView.ID, {
|
||||
viewsRegistry.registerViewWelcomeContent(WelcomeView.ID, {
|
||||
content: localize('customizeRunAndDebugOpenFolder', "To customize Run and Debug, [open a folder](command:{0}) and create a launch.json file.", isMacintosh ? OpenFileFolderAction.ID : OpenFolderAction.ID),
|
||||
when: WorkbenchStateContext.isEqualTo('empty')
|
||||
});
|
||||
@@ -11,7 +11,7 @@ import { IJSONSchemaSnippet } from 'vs/base/common/jsonSchema';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import * as editorCommon from 'vs/editor/common/editorCommon';
|
||||
import { ITextModel as EditorIModel } from 'vs/editor/common/model';
|
||||
import { IEditor, ITextEditor } from 'vs/workbench/common/editor';
|
||||
import { IEditorPane, ITextEditorPane } from 'vs/workbench/common/editor';
|
||||
import { Position, IPosition } from 'vs/editor/common/core/position';
|
||||
import { Source } from 'vs/workbench/contrib/debug/common/debugSource';
|
||||
import { Range, IRange } from 'vs/editor/common/core/range';
|
||||
@@ -316,7 +316,7 @@ export interface IStackFrame extends ITreeElement {
|
||||
forgetScopes(): void;
|
||||
restart(): Promise<any>;
|
||||
toString(): string;
|
||||
openInEditor(editorService: IEditorService, preserveFocus?: boolean, sideBySide?: boolean): Promise<ITextEditor | undefined>;
|
||||
openInEditor(editorService: IEditorService, preserveFocus?: boolean, sideBySide?: boolean): Promise<ITextEditorPane | undefined>;
|
||||
equals(other: IStackFrame): boolean;
|
||||
}
|
||||
|
||||
@@ -709,7 +709,7 @@ export interface ILaunch {
|
||||
/**
|
||||
* Opens the launch.json file. Creates if it does not exist.
|
||||
*/
|
||||
openConfigFile(sideBySide: boolean, preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditor | null, created: boolean }>;
|
||||
openConfigFile(sideBySide: boolean, preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null, created: boolean }>;
|
||||
}
|
||||
|
||||
// Debug service interfaces
|
||||
|
||||
@@ -21,7 +21,7 @@ import { commonSuffixLength } from 'vs/base/common/strings';
|
||||
import { posix } from 'vs/base/common/path';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { ITextEditor } from 'vs/workbench/common/editor';
|
||||
import { ITextEditorPane } from 'vs/workbench/common/editor';
|
||||
import { mixin } from 'vs/base/common/objects';
|
||||
|
||||
export class ExpressionContainer implements IExpressionContainer {
|
||||
@@ -347,7 +347,7 @@ export class StackFrame implements IStackFrame {
|
||||
return sourceToString === UNKNOWN_SOURCE_LABEL ? this.name : `${this.name} (${sourceToString})`;
|
||||
}
|
||||
|
||||
async openInEditor(editorService: IEditorService, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise<ITextEditor | undefined> {
|
||||
async openInEditor(editorService: IEditorService, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise<ITextEditorPane | undefined> {
|
||||
if (this.source.available) {
|
||||
return this.source.openInEditor(editorService, this.range, preserveFocus, sideBySide, pinned);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import { IRange } from 'vs/editor/common/core/range';
|
||||
import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { isUri } from 'vs/workbench/contrib/debug/common/debugUtils';
|
||||
import { ITextEditor } from 'vs/workbench/common/editor';
|
||||
import { ITextEditorPane } from 'vs/workbench/common/editor';
|
||||
import { TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor';
|
||||
|
||||
export const UNKNOWN_SOURCE_LABEL = nls.localize('unknownSource', "Unknown Source");
|
||||
@@ -71,7 +71,7 @@ export class Source {
|
||||
return this.uri.scheme === DEBUG_SCHEME;
|
||||
}
|
||||
|
||||
openInEditor(editorService: IEditorService, selection: IRange, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise<ITextEditor | undefined> {
|
||||
openInEditor(editorService: IEditorService, selection: IRange, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise<ITextEditorPane | undefined> {
|
||||
return !this.available ? Promise.resolve(undefined) : editorService.openEditor({
|
||||
resource: this.uri,
|
||||
description: this.origin,
|
||||
|
||||
@@ -12,7 +12,7 @@ import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfigurat
|
||||
|
||||
let externalTerminalService: IExternalTerminalService | undefined = undefined;
|
||||
|
||||
export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): void {
|
||||
export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise<number | undefined> {
|
||||
if (!externalTerminalService) {
|
||||
if (env.isWindows) {
|
||||
externalTerminalService = new WindowsExternalTerminalService(<IConfigurationService><unknown>undefined);
|
||||
@@ -20,12 +20,12 @@ export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestAr
|
||||
externalTerminalService = new MacExternalTerminalService(<IConfigurationService><unknown>undefined);
|
||||
} else if (env.isLinux) {
|
||||
externalTerminalService = new LinuxExternalTerminalService(<IConfigurationService><unknown>undefined);
|
||||
} else {
|
||||
throw new Error('external terminals not supported on this platform');
|
||||
}
|
||||
}
|
||||
if (externalTerminalService) {
|
||||
const config = configProvider.getConfiguration('terminal');
|
||||
externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config.external || {});
|
||||
}
|
||||
const config = configProvider.getConfiguration('terminal');
|
||||
return externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config.external || {});
|
||||
}
|
||||
|
||||
function spawnAsPromised(command: string, args: string[]): Promise<string> {
|
||||
|
||||
@@ -18,9 +18,10 @@ import { createBreakpointDecorations } from 'vs/workbench/contrib/debug/browser/
|
||||
import { OverviewRulerLane } from 'vs/editor/common/model';
|
||||
import { MarkdownString } from 'vs/base/common/htmlContent';
|
||||
import { createTextModel } from 'vs/editor/test/common/editorTestUtils';
|
||||
import { generateUuid } from 'vs/base/common/uuid';
|
||||
|
||||
function createMockSession(model: DebugModel, name = 'mockSession', options?: IDebugSessionOptions): DebugSession {
|
||||
return new DebugSession({ resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, options, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
return new DebugSession(generateUuid(), { resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, options, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
}
|
||||
|
||||
function addBreakpointsAndCheckEvents(model: DebugModel, uri: uri, data: IBreakpointData[]): void {
|
||||
|
||||
@@ -16,9 +16,10 @@ import { createDecorationsForStackFrame } from 'vs/workbench/contrib/debug/brows
|
||||
import { Constants } from 'vs/base/common/uint';
|
||||
import { getContext, getContextForContributedActions } from 'vs/workbench/contrib/debug/browser/callStackView';
|
||||
import { getStackFrameThreadAndSessionToFocus } from 'vs/workbench/contrib/debug/browser/debugService';
|
||||
import { generateUuid } from 'vs/base/common/uuid';
|
||||
|
||||
export function createMockSession(model: DebugModel, name = 'mockSession', options?: IDebugSessionOptions): DebugSession {
|
||||
return new DebugSession({ resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, options, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
return new DebugSession(generateUuid(), { resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, options, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
}
|
||||
|
||||
function createTwoStackFrames(session: DebugSession): { firstStackFrame: StackFrame, secondStackFrame: StackFrame } {
|
||||
@@ -363,7 +364,7 @@ suite('Debug - CallStack', () => {
|
||||
get state(): State {
|
||||
return State.Stopped;
|
||||
}
|
||||
}({ resolved: { name: 'stoppedSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
}(generateUuid(), { resolved: { name: 'stoppedSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
|
||||
const runningSession = createMockSession(model);
|
||||
model.addSession(runningSession);
|
||||
|
||||
@@ -12,7 +12,7 @@ import { workbenchInstantiationService } from 'vs/workbench/test/browser/workben
|
||||
import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector';
|
||||
import { Color, RGBA } from 'vs/base/common/color';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { TestThemeService, TestTheme } from 'vs/platform/theme/test/common/testThemeService';
|
||||
import { TestThemeService, TestColorTheme } from 'vs/platform/theme/test/common/testThemeService';
|
||||
import { ansiColorMap } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry';
|
||||
import { DebugModel } from 'vs/workbench/contrib/debug/common/debugModel';
|
||||
import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession';
|
||||
@@ -30,7 +30,7 @@ suite.skip('Debug - ANSI Handling', () => {
|
||||
*/
|
||||
setup(() => {
|
||||
model = new DebugModel([], [], [], [], [], <any>{ isDirty: (e: any) => false });
|
||||
session = new DebugSession({ resolved: { name: 'test', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
session = new DebugSession(generateUuid(), { resolved: { name: 'test', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, NullOpenerService, undefined!, undefined!);
|
||||
|
||||
const instantiationService: TestInstantiationService = <TestInstantiationService>workbenchInstantiationService();
|
||||
linkDetector = instantiationService.createInstance(LinkDetector);
|
||||
@@ -39,7 +39,7 @@ suite.skip('Debug - ANSI Handling', () => {
|
||||
for (let color in ansiColorMap) {
|
||||
colors[color] = <any>ansiColorMap[color].defaults.dark;
|
||||
}
|
||||
const testTheme = new TestTheme(colors);
|
||||
const testTheme = new TestColorTheme(colors);
|
||||
themeService = new TestThemeService(testTheme);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user