Merge VS Code 1.23.1 (#1520)
@@ -6,7 +6,7 @@
|
||||
'use strict';
|
||||
|
||||
import Uri from 'vs/base/common/uri';
|
||||
import errors = require('vs/base/common/errors');
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { ITextFileService, TextFileModelChangeEvent, StateChange } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
|
||||
@@ -9,7 +9,7 @@ import URI from 'vs/base/common/uri';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
|
||||
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
|
||||
import errors = require('vs/base/common/errors');
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
|
||||
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
|
||||
@@ -36,7 +36,7 @@ export class NodeCachedDataManager implements IWorkbenchContribution {
|
||||
/* __GDPR__
|
||||
"cachedDataError" : {
|
||||
"errorCode" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" },
|
||||
"path": { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }
|
||||
"path": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
|
||||
}
|
||||
*/
|
||||
this._telemetryService.publicLog('cachedDataError', {
|
||||
@@ -49,18 +49,18 @@ export class NodeCachedDataManager implements IWorkbenchContribution {
|
||||
// log summary
|
||||
/* __GDPR__
|
||||
"cachedDataInfo" : {
|
||||
"didRequestCachedData" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||
"didRejectCachedData": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||
"didProduceCachedData": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
|
||||
"didRequestCachedData" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true },
|
||||
"didRejectCachedData": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true },
|
||||
"didProduceCachedData": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }
|
||||
}
|
||||
*/
|
||||
this._telemetryService.publicLog('cachedDataInfo', {
|
||||
didRequestCachedData: Boolean(global.require.getConfig().nodeCachedDataDir),
|
||||
didRequestCachedData: Boolean((<any>global).require.getConfig().nodeCachedDataDir),
|
||||
didRejectCachedData,
|
||||
didProduceCachedData
|
||||
});
|
||||
|
||||
global.require.config({ onNodeCachedData: undefined });
|
||||
(<any>global).require.config({ onNodeCachedData: undefined });
|
||||
delete MonacoEnvironment.onNodeCachedData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@ import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
|
||||
import product from 'vs/platform/node/product';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { IChoiceService, Choice } from 'vs/platform/dialogs/common/dialogs';
|
||||
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||
import Severity from 'vs/base/common/severity';
|
||||
import { ILogService } from '../../../../platform/log/common/log';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
|
||||
function ignore<T>(code: string, value: T = null): (err: any) => TPromise<T> {
|
||||
return err => err.code === code ? TPromise.as<T>(value) : TPromise.wrapError<T>(err);
|
||||
@@ -47,7 +47,7 @@ class InstallAction extends Action {
|
||||
id: string,
|
||||
label: string,
|
||||
@INotificationService private notificationService: INotificationService,
|
||||
@IChoiceService private choiceService: IChoiceService,
|
||||
@IDialogService private dialogService: IDialogService,
|
||||
@ILogService private logService: ILogService
|
||||
) {
|
||||
super(id, label);
|
||||
@@ -103,9 +103,9 @@ class InstallAction extends Action {
|
||||
|
||||
private createBinFolder(): TPromise<void> {
|
||||
return new TPromise<void>((c, e) => {
|
||||
const choices: Choice[] = [nls.localize('ok', "OK"), nls.localize('cancel2', "Cancel")];
|
||||
const buttons = [nls.localize('ok', "OK"), nls.localize('cancel2', "Cancel")];
|
||||
|
||||
this.choiceService.choose(Severity.Info, nls.localize('warnEscalation', "Code will now prompt with 'osascript' for Administrator privileges to install the shell command."), choices, 1, true).then(choice => {
|
||||
this.dialogService.show(Severity.Info, nls.localize('warnEscalation', "Code will now prompt with 'osascript' for Administrator privileges to install the shell command."), buttons, { cancelId: 1 }).then(choice => {
|
||||
switch (choice) {
|
||||
case 0 /* OK */:
|
||||
const command = 'osascript -e "do shell script \\"mkdir -p /usr/local/bin && chown \\" & (do shell script (\\"whoami\\")) & \\" /usr/local/bin\\" with administrator privileges"';
|
||||
|
||||
@@ -13,10 +13,4 @@ import './electron-browser/toggleMultiCursorModifier';
|
||||
import './electron-browser/toggleRenderControlCharacter';
|
||||
import './electron-browser/toggleRenderWhitespace';
|
||||
import './electron-browser/toggleWordWrap';
|
||||
import { OPTIONS, TextBufferType } from 'vs/editor/common/model/textModel';
|
||||
|
||||
// Configure text buffer implementation
|
||||
if (process.env['VSCODE_PIECE_TREE']) {
|
||||
console.log(`Using TextBufferType.PieceTree (env variable VSCODE_PIECE_TREE)`);
|
||||
OPTIONS.TEXT_BUFFER_IMPLEMENTATION = TextBufferType.PieceTree;
|
||||
}
|
||||
import './electron-browser/workbenchReferenceSearch';
|
||||
@@ -581,5 +581,5 @@ const schema: IJSONSchema = {
|
||||
|
||||
}
|
||||
};
|
||||
let schemaRegistry = <IJSONContributionRegistry>Registry.as(Extensions.JSONContribution);
|
||||
let schemaRegistry = Registry.as<IJSONContributionRegistry>(Extensions.JSONContribution);
|
||||
schemaRegistry.registerSchema(schemaId, schema);
|
||||
|
||||
@@ -5,11 +5,6 @@
|
||||
|
||||
.tm-inspect-widget {
|
||||
z-index: 50;
|
||||
-webkit-user-select: text;
|
||||
-ms-user-select: text;
|
||||
-khtml-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-o-user-select: text;
|
||||
user-select: text;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { IEditorService } from 'vs/platform/editor/common/editor';
|
||||
import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
|
||||
import { ITextModelService } from 'vs/editor/common/services/resolverService';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { ReferencesController } from 'vs/editor/contrib/referenceSearch/referencesController';
|
||||
|
||||
export class WorkbenchReferencesController extends ReferencesController {
|
||||
|
||||
public constructor(
|
||||
editor: ICodeEditor,
|
||||
@IContextKeyService contextKeyService: IContextKeyService,
|
||||
@IEditorService editorService: IEditorService,
|
||||
@ITextModelService textModelResolverService: ITextModelService,
|
||||
@INotificationService notificationService: INotificationService,
|
||||
@IInstantiationService instantiationService: IInstantiationService,
|
||||
@IWorkspaceContextService contextService: IWorkspaceContextService,
|
||||
@IStorageService storageService: IStorageService,
|
||||
@IThemeService themeService: IThemeService,
|
||||
@IConfigurationService configurationService: IConfigurationService,
|
||||
@optional(IEnvironmentService) environmentService: IEnvironmentService
|
||||
) {
|
||||
super(
|
||||
false,
|
||||
editor,
|
||||
contextKeyService,
|
||||
editorService,
|
||||
textModelResolverService,
|
||||
notificationService,
|
||||
instantiationService,
|
||||
contextService,
|
||||
storageService,
|
||||
themeService,
|
||||
configurationService,
|
||||
environmentService
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
registerEditorContribution(WorkbenchReferencesController);
|
||||
@@ -146,12 +146,11 @@ export function renderRenameBox(debugService: IDebugService, contextViewService:
|
||||
const wrapUp = once((renamed: boolean) => {
|
||||
if (!disposed) {
|
||||
disposed = true;
|
||||
debugService.getViewModel().setSelectedExpression(undefined);
|
||||
if (element instanceof Expression && renamed && inputBox.value) {
|
||||
debugService.renameWatchExpression(element.getId(), inputBox.value);
|
||||
debugService.getViewModel().setSelectedExpression(undefined);
|
||||
} else if (element instanceof Expression && !element.name) {
|
||||
debugService.removeWatchExpressions(element.getId());
|
||||
debugService.getViewModel().setSelectedExpression(undefined);
|
||||
} else if (element instanceof Variable) {
|
||||
element.errorMessage = null;
|
||||
if (renamed && element.value !== inputBox.value) {
|
||||
@@ -165,7 +164,7 @@ export function renderRenameBox(debugService: IDebugService, contextViewService:
|
||||
}
|
||||
}
|
||||
|
||||
tree.DOMFocus();
|
||||
tree.domFocus();
|
||||
tree.setFocus(element);
|
||||
|
||||
// need to remove the input box since this template will be reused.
|
||||
@@ -229,7 +228,7 @@ export class BaseDebugController extends WorkbenchTreeController {
|
||||
}),
|
||||
onHide: (wasCancelled?: boolean) => {
|
||||
if (wasCancelled) {
|
||||
tree.DOMFocus();
|
||||
tree.domFocus();
|
||||
}
|
||||
},
|
||||
getActionsContext: () => element
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import 'vs/css!../browser/media/breakpointWidget';
|
||||
import * as nls from 'vs/nls';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { isWindows, isMacintosh } from 'vs/base/common/platform';
|
||||
import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox';
|
||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget';
|
||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IDebugService, IBreakpoint } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { once } from 'vs/base/common/functional';
|
||||
import { attachInputBoxStyler, attachSelectBoxStyler } from 'vs/platform/theme/common/styler';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
const $ = dom.$;
|
||||
const EXPRESSION_PLACEHOLDER = nls.localize('breakpointWidgetExpressionPlaceholder', "Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel.");
|
||||
const EXPRESSION_ARIA_LABEL = nls.localize('breakpointWidgetAriaLabel', "The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel.");
|
||||
const HIT_COUNT_PLACEHOLDER = nls.localize('breakpointWidgetHitCountPlaceholder', "Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel.");
|
||||
const HIT_COUNT_ARIA_LABEL = nls.localize('breakpointWidgetHitCountAriaLabel', "The program will only stop here if the hit count is met. Press Enter to accept or Escape to cancel.");
|
||||
|
||||
export class BreakpointWidget extends ZoneWidget {
|
||||
|
||||
private inputBox: InputBox;
|
||||
private toDispose: lifecycle.IDisposable[];
|
||||
private hitCountContext: boolean;
|
||||
private hitCountInput: string;
|
||||
private conditionInput: string;
|
||||
|
||||
constructor(editor: ICodeEditor, private lineNumber: number, private column: number,
|
||||
@IContextViewService private contextViewService: IContextViewService,
|
||||
@IDebugService private debugService: IDebugService,
|
||||
@IThemeService private themeService: IThemeService
|
||||
) {
|
||||
super(editor, { showFrame: true, showArrow: false, frameWidth: 1 });
|
||||
|
||||
this.toDispose = [];
|
||||
this.hitCountInput = '';
|
||||
this.conditionInput = '';
|
||||
this.create();
|
||||
}
|
||||
|
||||
private get placeholder(): string {
|
||||
return this.hitCountContext ? HIT_COUNT_PLACEHOLDER : EXPRESSION_PLACEHOLDER;
|
||||
}
|
||||
|
||||
private get ariaLabel(): string {
|
||||
return this.hitCountContext ? HIT_COUNT_ARIA_LABEL : EXPRESSION_ARIA_LABEL;
|
||||
}
|
||||
|
||||
private getInputBoxValue(breakpoint: IBreakpoint): string {
|
||||
if (this.hitCountContext) {
|
||||
return breakpoint && breakpoint.hitCondition ? breakpoint.hitCondition : this.hitCountInput;
|
||||
}
|
||||
|
||||
return breakpoint && breakpoint.condition ? breakpoint.condition : this.conditionInput;
|
||||
}
|
||||
|
||||
protected _fillContainer(container: HTMLElement): void {
|
||||
this.setCssClass('breakpoint-widget');
|
||||
const uri = this.editor.getModel().uri;
|
||||
const breakpoint = this.debugService.getModel().getBreakpoints().filter(bp => bp.lineNumber === this.lineNumber && bp.column === this.column && bp.uri.toString() === uri.toString()).pop();
|
||||
|
||||
this.hitCountContext = breakpoint && breakpoint.hitCondition && !breakpoint.condition;
|
||||
const selected = this.hitCountContext ? 1 : 0;
|
||||
const selectBox = new SelectBox([nls.localize('expression', "Expression"), nls.localize('hitCount', "Hit Count")], selected, this.contextViewService);
|
||||
this.toDispose.push(attachSelectBoxStyler(selectBox, this.themeService));
|
||||
selectBox.render(dom.append(container, $('.breakpoint-select-container')));
|
||||
selectBox.onDidSelect(e => {
|
||||
this.hitCountContext = e.selected === 'Hit Count';
|
||||
if (this.hitCountContext) {
|
||||
this.conditionInput = this.inputBox.value;
|
||||
} else {
|
||||
this.hitCountInput = this.inputBox.value;
|
||||
}
|
||||
|
||||
this.inputBox.setAriaLabel(this.ariaLabel);
|
||||
this.inputBox.setPlaceHolder(this.placeholder);
|
||||
this.inputBox.value = this.getInputBoxValue(breakpoint);
|
||||
});
|
||||
|
||||
const inputBoxContainer = dom.append(container, $('.inputBoxContainer'));
|
||||
this.inputBox = new InputBox(inputBoxContainer, this.contextViewService, {
|
||||
placeholder: this.placeholder,
|
||||
ariaLabel: this.ariaLabel
|
||||
});
|
||||
this.toDispose.push(attachInputBoxStyler(this.inputBox, this.themeService));
|
||||
this.toDispose.push(this.inputBox);
|
||||
|
||||
dom.addClass(this.inputBox.inputElement, isWindows ? 'windows' : isMacintosh ? 'mac' : 'linux');
|
||||
this.inputBox.value = this.getInputBoxValue(breakpoint);
|
||||
// Due to an electron bug we have to do the timeout, otherwise we do not get focus
|
||||
setTimeout(() => this.inputBox.focus(), 0);
|
||||
|
||||
let disposed = false;
|
||||
const wrapUp = once((success: boolean) => {
|
||||
if (!disposed) {
|
||||
disposed = true;
|
||||
if (success) {
|
||||
// if there is already a breakpoint on this location - remove it.
|
||||
const oldBreakpoint = this.debugService.getModel().getBreakpoints()
|
||||
.filter(bp => bp.lineNumber === this.lineNumber && bp.column === this.column && bp.uri.toString() === uri.toString()).pop();
|
||||
|
||||
let condition = oldBreakpoint && oldBreakpoint.condition;
|
||||
let hitCondition = oldBreakpoint && oldBreakpoint.hitCondition;
|
||||
|
||||
if (this.hitCountContext) {
|
||||
hitCondition = this.inputBox.value;
|
||||
if (this.conditionInput) {
|
||||
condition = this.conditionInput;
|
||||
}
|
||||
} else {
|
||||
condition = this.inputBox.value;
|
||||
if (this.hitCountInput) {
|
||||
hitCondition = this.hitCountInput;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldBreakpoint) {
|
||||
this.debugService.updateBreakpoints(oldBreakpoint.uri, {
|
||||
[oldBreakpoint.getId()]: {
|
||||
condition,
|
||||
hitCondition,
|
||||
verified: oldBreakpoint.verified
|
||||
}
|
||||
}, false);
|
||||
} else {
|
||||
this.debugService.addBreakpoints(uri, [{
|
||||
lineNumber: this.lineNumber,
|
||||
column: oldBreakpoint ? oldBreakpoint.column : undefined,
|
||||
enabled: true,
|
||||
condition,
|
||||
hitCondition
|
||||
}]).done(null, errors.onUnexpectedError);
|
||||
}
|
||||
}
|
||||
|
||||
this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
this.toDispose.push(dom.addStandardDisposableListener(this.inputBox.inputElement, 'keydown', (e: IKeyboardEvent) => {
|
||||
const isEscape = e.equals(KeyCode.Escape);
|
||||
const isEnter = e.equals(KeyCode.Enter);
|
||||
if (isEscape || isEnter) {
|
||||
e.stopPropagation();
|
||||
wrapUp(isEnter);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
super.dispose();
|
||||
lifecycle.dispose(this.toDispose);
|
||||
setTimeout(() => this.editor.focus(), 0);
|
||||
}
|
||||
}
|
||||
@@ -107,6 +107,13 @@ export class BreakpointsView extends ViewsViewletPanel {
|
||||
this.list.splice(0, this.list.length, this.elements);
|
||||
}
|
||||
|
||||
public focus(): void {
|
||||
if (this.list) {
|
||||
this.list.domFocus();
|
||||
}
|
||||
super.focus();
|
||||
}
|
||||
|
||||
protected layoutBody(size: number): void {
|
||||
if (this.list) {
|
||||
this.list.layout(size);
|
||||
@@ -117,8 +124,9 @@ export class BreakpointsView extends ViewsViewletPanel {
|
||||
const actions: IAction[] = [];
|
||||
const element = e.element;
|
||||
|
||||
const breakpointType = element instanceof Breakpoint && element.logMessage ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint");
|
||||
if (element instanceof Breakpoint || element instanceof FunctionBreakpoint) {
|
||||
actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editConditionalBreakpoint', "Edit Breakpoint..."), undefined, true, () => {
|
||||
actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editBreakpoint', "Edit {0}...", breakpointType), undefined, true, () => {
|
||||
if (element instanceof Breakpoint) {
|
||||
return openBreakpointSource(element, false, false, this.debugService, this.editorService).then(editor => {
|
||||
const codeEditor = editor.getControl();
|
||||
@@ -135,8 +143,7 @@ export class BreakpointsView extends ViewsViewletPanel {
|
||||
actions.push(new Separator());
|
||||
}
|
||||
|
||||
actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService));
|
||||
|
||||
actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, nls.localize('removeBreakpoint', "Remove {0}", breakpointType), this.debugService, this.keybindingService));
|
||||
|
||||
if (this.debugService.getModel().getBreakpoints().length + this.debugService.getModel().getFunctionBreakpoints().length > 1) {
|
||||
actions.push(new RemoveAllBreakpointsAction(RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL, this.debugService, this.keybindingService));
|
||||
@@ -196,7 +203,7 @@ export class BreakpointsView extends ViewsViewletPanel {
|
||||
|
||||
private get elements(): IEnablement[] {
|
||||
const model = this.debugService.getModel();
|
||||
const elements = (<IEnablement[]>model.getExceptionBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints());
|
||||
const elements = (<ReadonlyArray<IEnablement>>model.getExceptionBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints());
|
||||
|
||||
return elements;
|
||||
}
|
||||
@@ -547,7 +554,7 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, te
|
||||
|
||||
if (!breakpoint.enabled || !debugService.getModel().areBreakpointsActivated()) {
|
||||
return {
|
||||
className: breakpoint instanceof FunctionBreakpoint ? 'debug-function-breakpoint-disabled' : 'debug-breakpoint-disabled',
|
||||
className: breakpoint instanceof FunctionBreakpoint ? 'debug-function-breakpoint-disabled' : breakpoint.logMessage ? 'debug-breakpoint-log-disabled' : 'debug-breakpoint-disabled',
|
||||
message: nls.localize('breakpointDisabledHover', "Disabled breakpoint"),
|
||||
};
|
||||
}
|
||||
@@ -557,7 +564,7 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, te
|
||||
};
|
||||
if (debugActive && !breakpoint.verified) {
|
||||
return {
|
||||
className: breakpoint instanceof FunctionBreakpoint ? 'debug-function-breakpoint-unverified' : 'debug-breakpoint-unverified',
|
||||
className: breakpoint instanceof FunctionBreakpoint ? 'debug-function-breakpoint-unverified' : breakpoint.logMessage ? 'debug-breakpoint-log-unverified' : 'debug-breakpoint-unverified',
|
||||
message: appendMessage(nls.localize('breakpointUnverifieddHover', "Unverified breakpoint")),
|
||||
};
|
||||
}
|
||||
@@ -583,6 +590,20 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, te
|
||||
};
|
||||
}
|
||||
|
||||
if (breakpoint.logMessage) {
|
||||
if (process && breakpoint.condition && !process.session.capabilities.supportsLogPoints) {
|
||||
return {
|
||||
className: 'debug-breakpoint-unsupported',
|
||||
message: nls.localize('logBreakpointUnsupported', "Logpoints not supported by this debug type"),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
className: 'debug-breakpoint-log',
|
||||
message: appendMessage(breakpoint.logMessage)
|
||||
};
|
||||
}
|
||||
|
||||
if (breakpoint.condition || breakpoint.hitCondition) {
|
||||
if (process && breakpoint.condition && !process.session.capabilities.supportsConditionalBreakpoints) {
|
||||
return {
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as nls from 'vs/nls';
|
||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { IAction, IActionRunner } from 'vs/base/common/actions';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
@@ -21,6 +20,7 @@ import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
||||
import { selectBorder } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
|
||||
const $ = dom.$;
|
||||
|
||||
@@ -33,7 +33,7 @@ export class StartDebugActionItem implements IActionItem {
|
||||
private start: HTMLElement;
|
||||
private selectBox: SelectBox;
|
||||
private options: { label: string, handler: (() => boolean) }[];
|
||||
private toDispose: lifecycle.IDisposable[];
|
||||
private toDispose: IDisposable[];
|
||||
private selected: number;
|
||||
|
||||
constructor(
|
||||
@@ -48,6 +48,7 @@ export class StartDebugActionItem implements IActionItem {
|
||||
) {
|
||||
this.toDispose = [];
|
||||
this.selectBox = new SelectBox([], -1, contextViewService);
|
||||
this.toDispose.push(this.selectBox);
|
||||
this.toDispose.push(attachSelectBoxStyler(this.selectBox, themeService, {
|
||||
selectBackground: SIDE_BAR_BACKGROUND
|
||||
}));
|
||||
@@ -61,14 +62,6 @@ export class StartDebugActionItem implements IActionItem {
|
||||
this.updateOptions();
|
||||
}
|
||||
}));
|
||||
this.toDispose.push(this.selectBox.onDidSelect(e => {
|
||||
if (this.options[e.index].handler()) {
|
||||
this.selected = e.index;
|
||||
} else {
|
||||
// Some select options should not remain selected https://github.com/Microsoft/vscode/issues/31526
|
||||
this.selectBox.select(this.selected);
|
||||
}
|
||||
}));
|
||||
this.toDispose.push(this.debugService.getConfigurationManager().onDidSelectConfiguration(() => {
|
||||
this.updateOptions();
|
||||
}));
|
||||
@@ -108,6 +101,15 @@ export class StartDebugActionItem implements IActionItem {
|
||||
event.stopPropagation();
|
||||
}
|
||||
}));
|
||||
this.toDispose.push(this.selectBox.onDidSelect(e => {
|
||||
const shouldBeSelected = this.options[e.index].handler();
|
||||
if (shouldBeSelected) {
|
||||
this.selected = e.index;
|
||||
} else {
|
||||
// Some select options should not remain selected https://github.com/Microsoft/vscode/issues/31526
|
||||
this.selectBox.select(this.selected);
|
||||
}
|
||||
}));
|
||||
|
||||
const selectBoxContainer = $('.configuration');
|
||||
this.selectBox.render(dom.append(container, selectBoxContainer));
|
||||
@@ -147,7 +149,7 @@ export class StartDebugActionItem implements IActionItem {
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
this.toDispose = lifecycle.dispose(this.toDispose);
|
||||
this.toDispose = dispose(this.toDispose);
|
||||
}
|
||||
|
||||
private updateOptions(): void {
|
||||
|
||||
@@ -7,12 +7,11 @@ import * as nls from 'vs/nls';
|
||||
import { Action } from 'vs/base/common/actions';
|
||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IDebugService, State, IProcess, IThread, IEnablement, IBreakpoint, IStackFrame, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, IExpression, REPL_ID, ProcessState }
|
||||
import { IDebugService, State, IProcess, IThread, IEnablement, IBreakpoint, IStackFrame, REPL_ID, ProcessState }
|
||||
from 'vs/workbench/parts/debug/common/debug';
|
||||
import { Variable, Expression, Thread, Breakpoint, Process } from 'vs/workbench/parts/debug/common/debugModel';
|
||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||
@@ -23,6 +22,8 @@ import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { CollapseAction } from 'vs/workbench/browser/viewlet';
|
||||
import { ITree } from 'vs/base/parts/tree/browser/tree';
|
||||
import { first } from 'vs/base/common/arrays';
|
||||
import { IHistoryService } from 'vs/workbench/services/history/common/history';
|
||||
|
||||
export abstract class AbstractDebugAction extends Action {
|
||||
|
||||
@@ -105,7 +106,12 @@ export class ConfigureAction extends AbstractDebugAction {
|
||||
}
|
||||
|
||||
const sideBySide = !!(event && (event.ctrlKey || event.metaKey));
|
||||
return this.debugService.getConfigurationManager().selectedConfiguration.launch.openConfigFile(sideBySide);
|
||||
const configurationManager = this.debugService.getConfigurationManager();
|
||||
if (!configurationManager.selectedConfiguration.launch) {
|
||||
configurationManager.selectConfiguration(configurationManager.getLaunches()[0]);
|
||||
}
|
||||
|
||||
return configurationManager.selectedConfiguration.launch.openConfigFile(sideBySide);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +122,8 @@ export class StartAction extends AbstractDebugAction {
|
||||
constructor(id: string, label: string,
|
||||
@IDebugService debugService: IDebugService,
|
||||
@IKeybindingService keybindingService: IKeybindingService,
|
||||
@IWorkspaceContextService private contextService: IWorkspaceContextService
|
||||
@IWorkspaceContextService private contextService: IWorkspaceContextService,
|
||||
@IHistoryService private historyService: IHistoryService
|
||||
) {
|
||||
super(id, label, 'debug-action start', debugService, keybindingService);
|
||||
|
||||
@@ -126,7 +133,19 @@ export class StartAction extends AbstractDebugAction {
|
||||
}
|
||||
|
||||
public run(): TPromise<any> {
|
||||
const launch = this.debugService.getConfigurationManager().selectedConfiguration.launch;
|
||||
const configurationManager = this.debugService.getConfigurationManager();
|
||||
let launch = configurationManager.selectedConfiguration.launch;
|
||||
if (!launch) {
|
||||
const rootUri = this.historyService.getLastActiveWorkspaceRoot();
|
||||
launch = configurationManager.getLaunch(rootUri);
|
||||
if (!launch || launch.getConfigurationNames().length === 0) {
|
||||
const launches = configurationManager.getLaunches();
|
||||
launch = first(launches, l => !!l.getConfigurationNames().length, launches.length ? launches[0] : launch);
|
||||
}
|
||||
|
||||
configurationManager.selectConfiguration(launch);
|
||||
}
|
||||
|
||||
return this.debugService.startDebugging(launch, undefined, this.isNoDebug());
|
||||
}
|
||||
|
||||
@@ -196,10 +215,21 @@ export class RestartAction extends AbstractDebugAction {
|
||||
static LABEL = nls.localize('restartDebug', "Restart");
|
||||
static RECONNECT_LABEL = nls.localize('reconnectDebug', "Reconnect");
|
||||
|
||||
constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
private startAction: StartAction;
|
||||
|
||||
constructor(id: string, label: string,
|
||||
@IDebugService debugService: IDebugService,
|
||||
@IKeybindingService keybindingService: IKeybindingService,
|
||||
@IWorkspaceContextService private contextService?: IWorkspaceContextService,
|
||||
@IHistoryService historyService?: IHistoryService
|
||||
) {
|
||||
super(id, label, 'debug-action restart', debugService, keybindingService, 70);
|
||||
this.setLabel(this.debugService.getViewModel().focusedProcess);
|
||||
this.toDispose.push(this.debugService.getViewModel().onDidFocusStackFrame(() => this.setLabel(this.debugService.getViewModel().focusedProcess)));
|
||||
|
||||
if (contextService !== undefined && historyService !== undefined) {
|
||||
this.startAction = new StartAction(id, label, debugService, keybindingService, contextService, historyService);
|
||||
}
|
||||
}
|
||||
|
||||
private setLabel(process: IProcess): void {
|
||||
@@ -210,8 +240,9 @@ export class RestartAction extends AbstractDebugAction {
|
||||
if (!(process instanceof Process)) {
|
||||
process = this.debugService.getViewModel().focusedProcess;
|
||||
}
|
||||
|
||||
if (!process) {
|
||||
return TPromise.as(null);
|
||||
return this.startAction.run();
|
||||
}
|
||||
|
||||
if (this.debugService.getModel().getProcesses().length <= 1) {
|
||||
@@ -221,7 +252,11 @@ export class RestartAction extends AbstractDebugAction {
|
||||
}
|
||||
|
||||
protected isEnabled(state: State): boolean {
|
||||
return super.isEnabled(state) && (state === State.Running || state === State.Stopped);
|
||||
return super.isEnabled(state) && (
|
||||
state === State.Running ||
|
||||
state === State.Stopped ||
|
||||
StartAction.isEnabled(this.debugService, this.contextService, this.debugService.getConfigurationManager().selectedConfiguration.name)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,6 +404,27 @@ export class PauseAction extends AbstractDebugAction {
|
||||
}
|
||||
}
|
||||
|
||||
export class TerminateThreadAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.action.debug.terminateThread';
|
||||
static LABEL = nls.localize('terminateThread', "Terminate Thread");
|
||||
|
||||
constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
super(id, label, undefined, debugService, keybindingService);
|
||||
}
|
||||
|
||||
public run(thread: IThread): TPromise<any> {
|
||||
if (!(thread instanceof Thread)) {
|
||||
thread = this.debugService.getViewModel().focusedThread;
|
||||
}
|
||||
|
||||
return thread ? thread.terminate() : TPromise.as(null);
|
||||
}
|
||||
|
||||
protected isEnabled(state: State): boolean {
|
||||
return super.isEnabled(state) && (state === State.Running || state === State.Stopped);
|
||||
}
|
||||
}
|
||||
|
||||
export class RestartFrameAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.action.debug.restartFrame';
|
||||
static LABEL = nls.localize('restartFrame', "Restart Frame");
|
||||
@@ -419,32 +475,6 @@ export class RemoveAllBreakpointsAction extends AbstractDebugAction {
|
||||
}
|
||||
}
|
||||
|
||||
export class EnableBreakpointAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.enableBreakpoint';
|
||||
static LABEL = nls.localize('enableBreakpoint', "Enable Breakpoint");
|
||||
|
||||
constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
super(id, label, undefined, debugService, keybindingService);
|
||||
}
|
||||
|
||||
public run(element: IEnablement): TPromise<any> {
|
||||
return this.debugService.enableOrDisableBreakpoints(true, element);
|
||||
}
|
||||
}
|
||||
|
||||
export class DisableBreakpointAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.disableBreakpoint';
|
||||
static LABEL = nls.localize('disableBreakpoint', "Disable Breakpoint");
|
||||
|
||||
constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
super(id, label, undefined, debugService, keybindingService);
|
||||
}
|
||||
|
||||
public run(element: IEnablement): TPromise<any> {
|
||||
return this.debugService.enableOrDisableBreakpoints(false, element);
|
||||
}
|
||||
}
|
||||
|
||||
export class EnableAllBreakpointsAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.enableAllBreakpoints';
|
||||
static LABEL = nls.localize('enableAllBreakpoints', "Enable All Breakpoints");
|
||||
@@ -460,7 +490,7 @@ export class EnableAllBreakpointsAction extends AbstractDebugAction {
|
||||
|
||||
protected isEnabled(state: State): boolean {
|
||||
const model = this.debugService.getModel();
|
||||
return super.isEnabled(state) && (<IEnablement[]>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => !bp.enabled);
|
||||
return super.isEnabled(state) && (<ReadonlyArray<IEnablement>>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => !bp.enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,7 +509,7 @@ export class DisableAllBreakpointsAction extends AbstractDebugAction {
|
||||
|
||||
protected isEnabled(state: State): boolean {
|
||||
const model = this.debugService.getModel();
|
||||
return super.isEnabled(state) && (<IEnablement[]>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => bp.enabled);
|
||||
return super.isEnabled(state) && (<ReadonlyArray<IEnablement>>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => bp.enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -547,44 +577,6 @@ export class AddFunctionBreakpointAction extends AbstractDebugAction {
|
||||
}
|
||||
}
|
||||
|
||||
export class AddConditionalBreakpointAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.addConditionalBreakpointAction';
|
||||
static LABEL = nls.localize('addConditionalBreakpoint', "Add Conditional Breakpoint...");
|
||||
|
||||
constructor(id: string, label: string,
|
||||
private editor: ICodeEditor,
|
||||
private lineNumber: number,
|
||||
@IDebugService debugService: IDebugService,
|
||||
@IKeybindingService keybindingService: IKeybindingService,
|
||||
) {
|
||||
super(id, label, null, debugService, keybindingService);
|
||||
}
|
||||
|
||||
public run(): TPromise<any> {
|
||||
this.editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(this.lineNumber, undefined);
|
||||
return TPromise.as(null);
|
||||
}
|
||||
}
|
||||
|
||||
export class EditConditionalBreakpointAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.editConditionalBreakpointAction';
|
||||
static LABEL = nls.localize('editConditionalBreakpoint', "Edit Breakpoint...");
|
||||
|
||||
constructor(id: string, label: string,
|
||||
private editor: ICodeEditor,
|
||||
@IDebugService debugService: IDebugService,
|
||||
@IKeybindingService keybindingService: IKeybindingService,
|
||||
) {
|
||||
super(id, label, null, debugService, keybindingService);
|
||||
}
|
||||
|
||||
public run(breakpoint: IBreakpoint): TPromise<any> {
|
||||
this.editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(breakpoint.lineNumber, breakpoint.column);
|
||||
return TPromise.as(null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export class SetValueAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.setValue';
|
||||
static LABEL = nls.localize('setValue', "Set Value");
|
||||
@@ -645,15 +637,18 @@ export class AddToWatchExpressionsAction extends AbstractDebugAction {
|
||||
static readonly ID = 'workbench.debug.viewlet.action.addToWatchExpressions';
|
||||
static LABEL = nls.localize('addToWatchExpressions', "Add to Watch");
|
||||
|
||||
constructor(id: string, label: string, private expression: IExpression, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
constructor(id: string, label: string, private variable: Variable, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) {
|
||||
super(id, label, 'debug-action add-to-watch', debugService, keybindingService);
|
||||
this.updateEnablement();
|
||||
}
|
||||
|
||||
public run(): TPromise<any> {
|
||||
const name = this.expression instanceof Variable ? this.expression.evaluateName : this.expression.name;
|
||||
this.debugService.addWatchExpression(name);
|
||||
this.debugService.addWatchExpression(this.variable.evaluateName);
|
||||
return TPromise.as(undefined);
|
||||
}
|
||||
|
||||
protected isEnabled(state: State): boolean {
|
||||
return super.isEnabled(state) && this.variable && !!this.variable.evaluateName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'vs/css!./media/debugActionsWidget';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import * as builder from 'vs/base/browser/builder';
|
||||
import { $, Builder } from 'vs/base/browser/builder';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import * as arrays from 'vs/base/common/arrays';
|
||||
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
@@ -29,8 +29,8 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
|
||||
const $ = builder.$;
|
||||
const DEBUG_ACTIONS_WIDGET_POSITION_KEY = 'debug.actionswidgetposition';
|
||||
|
||||
export const debugToolBarBackground = registerColor('debugToolBar.background', {
|
||||
@@ -46,11 +46,12 @@ export const debugToolBarBorder = registerColor('debugToolBar.border', {
|
||||
|
||||
export class DebugActionsWidget extends Themable implements IWorkbenchContribution {
|
||||
|
||||
private $el: builder.Builder;
|
||||
private dragArea: builder.Builder;
|
||||
private $el: Builder;
|
||||
private dragArea: Builder;
|
||||
private actionBar: ActionBar;
|
||||
private allActions: AbstractDebugAction[];
|
||||
private activeActions: AbstractDebugAction[];
|
||||
private updateScheduler: RunOnceScheduler;
|
||||
|
||||
private isVisible: boolean;
|
||||
private isBuilt: boolean;
|
||||
@@ -77,7 +78,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi
|
||||
this.$el.append(actionBarContainter);
|
||||
|
||||
this.activeActions = [];
|
||||
this.actionBar = new ActionBar(actionBarContainter, {
|
||||
this.actionBar = new ActionBar(actionBarContainter.getHTMLElement(), {
|
||||
orientation: ActionsOrientation.HORIZONTAL,
|
||||
actionItemProvider: (action: IAction) => {
|
||||
if (action.id === FocusProcessAction.ID) {
|
||||
@@ -88,6 +89,21 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi
|
||||
}
|
||||
});
|
||||
|
||||
this.updateScheduler = new RunOnceScheduler(() => {
|
||||
const state = this.debugService.state;
|
||||
if (state === State.Inactive || state === State.Initializing || this.configurationService.getValue<IDebugConfiguration>('debug').hideActionBar) {
|
||||
return this.hide();
|
||||
}
|
||||
|
||||
const actions = this.getActions();
|
||||
if (!arrays.equals(actions, this.activeActions, (first, second) => first.id === second.id)) {
|
||||
this.actionBar.clear();
|
||||
this.actionBar.push(actions, { icon: true, label: false });
|
||||
this.activeActions = actions;
|
||||
}
|
||||
this.show();
|
||||
}, 20);
|
||||
|
||||
this.updateStyles();
|
||||
|
||||
this.toUnbind.push(this.actionBar);
|
||||
@@ -98,7 +114,8 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi
|
||||
}
|
||||
|
||||
private registerListeners(): void {
|
||||
this.toUnbind.push(this.debugService.onDidChangeState(state => this.update(state)));
|
||||
this.toUnbind.push(this.debugService.onDidChangeState(() => this.updateScheduler.schedule()));
|
||||
this.toUnbind.push(this.debugService.getViewModel().onDidFocusProcess(() => this.updateScheduler.schedule()));
|
||||
this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => this.onDidConfigurationChange(e)));
|
||||
this.toUnbind.push(this.actionBar.actionRunner.onDidRun((e: IRunEvent) => {
|
||||
// check for error
|
||||
@@ -200,31 +217,17 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi
|
||||
|
||||
private onDidConfigurationChange(event: IConfigurationChangeEvent): void {
|
||||
if (event.affectsConfiguration('debug.hideActionBar')) {
|
||||
this.update(this.debugService.state);
|
||||
this.updateScheduler.schedule();
|
||||
}
|
||||
}
|
||||
|
||||
private update(state: State): void {
|
||||
if (state === State.Inactive || state === State.Initializing || this.configurationService.getValue<IDebugConfiguration>('debug').hideActionBar) {
|
||||
return this.hide();
|
||||
}
|
||||
|
||||
const actions = this.getActions();
|
||||
if (!arrays.equals(actions, this.activeActions, (first, second) => first.id === second.id)) {
|
||||
this.actionBar.clear();
|
||||
this.actionBar.push(actions, { icon: true, label: false });
|
||||
this.activeActions = actions;
|
||||
}
|
||||
this.show();
|
||||
}
|
||||
|
||||
private show(): void {
|
||||
if (this.isVisible) {
|
||||
return;
|
||||
}
|
||||
if (!this.isBuilt) {
|
||||
this.isBuilt = true;
|
||||
this.$el.build(builder.withElementById(this.partService.getWorkbenchElementId()).getHTMLElement());
|
||||
this.$el.build(document.getElementById(this.partService.getWorkbenchElementId()));
|
||||
}
|
||||
|
||||
this.isVisible = true;
|
||||
|
||||
@@ -34,13 +34,12 @@ export function registerCommands(): void {
|
||||
handler: (accessor) => {
|
||||
const listService = accessor.get(IListService);
|
||||
const debugService = accessor.get(IDebugService);
|
||||
const focused = listService.lastFocusedList;
|
||||
|
||||
// Tree only
|
||||
if (!(focused instanceof List)) {
|
||||
const tree = focused;
|
||||
const element = <IEnablement>tree.getFocus();
|
||||
debugService.enableOrDisableBreakpoints(!element.enabled, element).done(null, errors.onUnexpectedError);
|
||||
const list = listService.lastFocusedList;
|
||||
if (list instanceof List) {
|
||||
const focused = <IEnablement[]>list.getFocusedElements();
|
||||
if (focused && focused.length) {
|
||||
debugService.enableOrDisableBreakpoints(!focused[0].enabled, focused[0]).done(null, errors.onUnexpectedError);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -111,17 +110,18 @@ export function registerCommands(): void {
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'debug.removeBreakpoint',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
when: ContextKeyExpr.and(CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_BREAKPOINT_SELECTED.toNegated()),
|
||||
when: ContextKeyExpr.and(CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_BREAKPOINT_SELECTED.toNegated()),
|
||||
primary: KeyCode.Delete,
|
||||
mac: { primary: KeyMod.CtrlCmd | KeyCode.Backspace },
|
||||
handler: (accessor) => {
|
||||
const listService = accessor.get(IListService);
|
||||
const debugService = accessor.get(IDebugService);
|
||||
const focused = listService.lastFocusedList;
|
||||
const list = listService.lastFocusedList;
|
||||
|
||||
// Tree only
|
||||
if (!(focused instanceof List)) {
|
||||
const element = focused.getFocus();
|
||||
if (list instanceof List) {
|
||||
const focused = list.getFocusedElements();
|
||||
const element = focused.length ? focused[0] : undefined;
|
||||
if (element instanceof Breakpoint) {
|
||||
debugService.removeBreakpoints(element.getId()).done(null, errors.onUnexpectedError);
|
||||
} else if (element instanceof FunctionBreakpoint) {
|
||||
@@ -177,7 +177,7 @@ export function registerCommands(): void {
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
primary: KeyMod.Shift | KeyCode.F9,
|
||||
when: EditorContextKeys.textFocus,
|
||||
when: EditorContextKeys.editorTextFocus,
|
||||
id: COLUMN_BREAKPOINT_COMMAND_ID,
|
||||
handler: (accessor) => {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
@@ -188,13 +188,13 @@ export function registerCommands(): void {
|
||||
const position = control.getPosition();
|
||||
const modelUri = control.getModel().uri;
|
||||
const bp = debugService.getModel().getBreakpoints()
|
||||
.filter(bp => bp.lineNumber === position.lineNumber && bp.column === position.column && bp.uri.toString() === modelUri.toString()).pop();
|
||||
.filter(bp => bp.lineNumber === position.lineNumber && (bp.column === position.column || !bp.column && position.column <= 1) && bp.uri.toString() === modelUri.toString()).pop();
|
||||
|
||||
if (bp) {
|
||||
return TPromise.as(null);
|
||||
}
|
||||
if (debugService.getConfigurationManager().canSetBreakpointsIn(control.getModel())) {
|
||||
return debugService.addBreakpoints(modelUri, [{ lineNumber: position.lineNumber, column: position.column }]);
|
||||
return debugService.addBreakpoints(modelUri, [{ lineNumber: position.lineNumber, column: position.column > 1 ? position.column : undefined }]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ import { Source } from 'vs/workbench/parts/debug/common/debugSource';
|
||||
* debug:arbitrary_path?session=123e4567-e89b-12d3-a456-426655440000&ref=1016
|
||||
* \___/ \____________/ \__________________________________________/ \______/
|
||||
* | | | |
|
||||
* scheme source.path session id source.referencequery
|
||||
* scheme source.path session id source.reference
|
||||
*
|
||||
* the arbitrary_path and the session id are encoded with 'encodeURIComponent'
|
||||
*
|
||||
@@ -58,7 +58,7 @@ export class DebugContentProvider implements IWorkbenchContribution, ITextModelC
|
||||
if (!process) {
|
||||
return TPromise.wrapError<ITextModel>(new Error(localize('unable', "Unable to resolve the resource without a debug session")));
|
||||
}
|
||||
const source = process.sources.get(resource.toString());
|
||||
const source = process.getSourceForUri(resource);
|
||||
let rawSource: DebugProtocol.Source;
|
||||
if (source) {
|
||||
rawSource = source.raw;
|
||||
|
||||
@@ -8,12 +8,11 @@ import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
|
||||
import { ServicesAccessor, registerEditorAction, EditorAction, EditorCommand, registerEditorCommand } from 'vs/editor/browser/editorExtensions';
|
||||
import { ServicesAccessor, registerEditorAction, EditorAction } from 'vs/editor/browser/editorExtensions';
|
||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_NOT_IN_DEBUG_REPL, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINT_WIDGET_VISIBLE } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_NOT_IN_DEBUG_REPL, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, IBreakpoint } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
|
||||
class ToggleBreakpointAction extends EditorAction {
|
||||
@@ -24,7 +23,7 @@ class ToggleBreakpointAction extends EditorAction {
|
||||
alias: 'Debug: Toggle Breakpoint',
|
||||
precondition: null,
|
||||
kbOpts: {
|
||||
kbExpr: EditorContextKeys.textFocus,
|
||||
kbExpr: EditorContextKeys.editorTextFocus,
|
||||
primary: KeyCode.F9
|
||||
}
|
||||
});
|
||||
@@ -70,6 +69,26 @@ class ConditionalBreakpointAction extends EditorAction {
|
||||
}
|
||||
}
|
||||
|
||||
class LogPointAction extends EditorAction {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'editor.debug.action.toggleLogPoint',
|
||||
label: nls.localize('logPointEditorAction', "Debug: Add Logpoint..."),
|
||||
alias: 'Debug: Add Logpoint...',
|
||||
precondition: null
|
||||
});
|
||||
}
|
||||
|
||||
public run(accessor: ServicesAccessor, editor: ICodeEditor): void {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
|
||||
const { lineNumber, column } = editor.getPosition();
|
||||
if (debugService.getConfigurationManager().canSetBreakpointsIn(editor.getModel())) {
|
||||
editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(lineNumber, column, BreakpointWidgetContext.LOG_MESSAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class RunToCursorAction extends EditorAction {
|
||||
|
||||
@@ -88,26 +107,27 @@ class RunToCursorAction extends EditorAction {
|
||||
|
||||
public run(accessor: ServicesAccessor, editor: ICodeEditor): TPromise<void> {
|
||||
const debugService = accessor.get(IDebugService);
|
||||
|
||||
if (debugService.state !== State.Stopped) {
|
||||
return TPromise.as(null);
|
||||
}
|
||||
const position = editor.getPosition();
|
||||
const uri = editor.getModel().uri;
|
||||
|
||||
let breakpointToRemove: IBreakpoint;
|
||||
const oneTimeListener = debugService.getViewModel().focusedProcess.session.onDidEvent(event => {
|
||||
if (event.event === 'stopped' || event.event === 'exit') {
|
||||
const toRemove = debugService.getModel().getBreakpoints()
|
||||
.filter(bp => bp.lineNumber === position.lineNumber && bp.uri.toString() === uri.toString()).pop();
|
||||
if (toRemove) {
|
||||
debugService.removeBreakpoints(toRemove.getId());
|
||||
if (breakpointToRemove) {
|
||||
debugService.removeBreakpoints(breakpointToRemove.getId());
|
||||
}
|
||||
oneTimeListener.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
const position = editor.getPosition();
|
||||
const uri = editor.getModel().uri;
|
||||
const bpExists = !!(debugService.getModel().getBreakpoints().filter(bp => bp.column === position.column && bp.lineNumber === position.lineNumber && bp.uri.toString() === uri.toString()).pop());
|
||||
return (bpExists ? TPromise.as(null) : debugService.addBreakpoints(uri, [{ lineNumber: position.lineNumber, column: position.column }])).then(() => {
|
||||
return (bpExists ? TPromise.as(null) : debugService.addBreakpoints(uri, [{ lineNumber: position.lineNumber, column: position.column }])).then((breakpoints) => {
|
||||
if (breakpoints && breakpoints.length) {
|
||||
breakpointToRemove = breakpoints[0];
|
||||
}
|
||||
debugService.getViewModel().focusedThread.continue();
|
||||
});
|
||||
}
|
||||
@@ -172,7 +192,7 @@ class ShowDebugHoverAction extends EditorAction {
|
||||
alias: 'Debug: Show Hover',
|
||||
precondition: CONTEXT_IN_DEBUG_MODE,
|
||||
kbOpts: {
|
||||
kbExpr: EditorContextKeys.textFocus,
|
||||
kbExpr: EditorContextKeys.editorTextFocus,
|
||||
primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_I)
|
||||
}
|
||||
});
|
||||
@@ -190,30 +210,10 @@ class ShowDebugHoverAction extends EditorAction {
|
||||
}
|
||||
}
|
||||
|
||||
class CloseBreakpointWidgetCommand extends EditorCommand {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'closeBreakpointWidget',
|
||||
precondition: CONTEXT_BREAKPOINT_WIDGET_VISIBLE,
|
||||
kbOpts: {
|
||||
weight: KeybindingsRegistry.WEIGHT.editorContrib(8),
|
||||
kbExpr: EditorContextKeys.focus,
|
||||
primary: KeyCode.Escape,
|
||||
secondary: [KeyMod.Shift | KeyCode.Escape]
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void {
|
||||
return editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).closeBreakpointWidget();
|
||||
}
|
||||
}
|
||||
|
||||
registerEditorAction(ToggleBreakpointAction);
|
||||
registerEditorAction(ConditionalBreakpointAction);
|
||||
registerEditorAction(LogPointAction);
|
||||
registerEditorAction(RunToCursorAction);
|
||||
registerEditorAction(SelectionToReplAction);
|
||||
registerEditorAction(SelectionToWatchExpressionsAction);
|
||||
registerEditorAction(ShowDebugHoverAction);
|
||||
registerEditorCommand(new CloseBreakpointWidgetCommand());
|
||||
|
||||
@@ -3,16 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import nls = require('vs/nls');
|
||||
import Filters = require('vs/base/common/filters');
|
||||
import * as nls from 'vs/nls';
|
||||
import * as Filters from 'vs/base/common/filters';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import Quickopen = require('vs/workbench/browser/quickopen');
|
||||
import QuickOpen = require('vs/base/parts/quickopen/common/quickOpen');
|
||||
import Model = require('vs/base/parts/quickopen/browser/quickOpenModel');
|
||||
import * as Quickopen from 'vs/workbench/browser/quickopen';
|
||||
import * as QuickOpen from 'vs/base/parts/quickopen/common/quickOpen';
|
||||
import * as Model from 'vs/base/parts/quickopen/browser/quickOpenModel';
|
||||
import { IDebugService, ILaunch } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { QuickOpenEntry, QuickOpenEntryGroup } from 'vs/base/parts/quickopen/browser/quickOpenModel';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { StartAction } from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
@@ -94,7 +93,7 @@ export class DebugQuickOpenHandler extends Quickopen.QuickOpenHandler {
|
||||
}
|
||||
|
||||
public getResults(input: string): TPromise<Model.QuickOpenModel> {
|
||||
const configurations: QuickOpenEntry[] = [];
|
||||
const configurations: Model.QuickOpenEntry[] = [];
|
||||
|
||||
const configManager = this.debugService.getConfigurationManager();
|
||||
const launches = configManager.getLaunches();
|
||||
@@ -113,7 +112,7 @@ export class DebugQuickOpenHandler extends Quickopen.QuickOpenHandler {
|
||||
const label = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ? nls.localize("addConfigTo", "Add Config ({0})...", l.name) : nls.localize('addConfiguration', "Add Configuration...");
|
||||
const entry = new AddConfigEntry(label, l, this.commandService, this.contextService, Filters.matchesContiguousSubString(input, label));
|
||||
if (index === 0) {
|
||||
configurations.push(new QuickOpenEntryGroup(entry, undefined, true));
|
||||
configurations.push(new Model.QuickOpenEntryGroup(entry, undefined, true));
|
||||
} else {
|
||||
configurations.push(entry);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar';
|
||||
import { IDebugService, State, IDebugConfiguration } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { Themable, STATUS_BAR_FOREGROUND } from 'vs/workbench/common/theme';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { STATUS_BAR_DEBUGGING_FOREGROUND, isStatusbarInDebugMode } from 'vs/workbench/parts/debug/browser/statusbarColorProvider';
|
||||
|
||||
const $ = dom.$;
|
||||
|
||||
@@ -61,7 +62,11 @@ export class DebugStatus extends Themable implements IStatusbarItem {
|
||||
protected updateStyles(): void {
|
||||
super.updateStyles();
|
||||
if (this.icon) {
|
||||
this.icon.style.backgroundColor = this.getColor(STATUS_BAR_FOREGROUND);
|
||||
if (isStatusbarInDebugMode(this.debugService)) {
|
||||
this.icon.style.backgroundColor = this.getColor(STATUS_BAR_DEBUGGING_FOREGROUND);
|
||||
} else {
|
||||
this.icon.style.backgroundColor = this.getColor(STATUS_BAR_FOREGROUND);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,15 +90,16 @@ export class DebugStatus extends Themable implements IStatusbarItem {
|
||||
this.icon = dom.append(a, $('.icon'));
|
||||
this.label = dom.append(a, $('span.label'));
|
||||
this.setLabel();
|
||||
this.updateStyles();
|
||||
}
|
||||
|
||||
this.updateStyles();
|
||||
}
|
||||
|
||||
private setLabel(): void {
|
||||
if (this.label && this.statusBarItem) {
|
||||
const manager = this.debugService.getConfigurationManager();
|
||||
const name = manager.selectedConfiguration.name;
|
||||
if (name) {
|
||||
if (name && manager.selectedConfiguration.launch) {
|
||||
this.statusBarItem.style.display = 'block';
|
||||
this.label.textContent = manager.getLaunches().length > 1 ? `${name} (${manager.selectedConfiguration.launch.name})` : name;
|
||||
} else {
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
import 'vs/css!./media/debugViewlet';
|
||||
import * as nls from 'vs/nls';
|
||||
import { Builder } from 'vs/base/browser/builder';
|
||||
import { Action, IAction } from 'vs/base/common/actions';
|
||||
import * as DOM from 'vs/base/browser/dom';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
@@ -27,6 +26,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||
import { memoize } from 'vs/base/common/decorators';
|
||||
|
||||
export class DebugViewlet extends PersistentViewsViewlet {
|
||||
|
||||
@@ -56,11 +56,10 @@ export class DebugViewlet extends PersistentViewsViewlet {
|
||||
this._register(this.contextService.onDidChangeWorkbenchState(() => this.updateTitleArea()));
|
||||
}
|
||||
|
||||
async create(parent: Builder): TPromise<void> {
|
||||
async create(parent: HTMLElement): TPromise<void> {
|
||||
await super.create(parent);
|
||||
|
||||
const el = parent.getHTMLElement();
|
||||
DOM.addClass(el, 'debug-viewlet');
|
||||
DOM.addClass(parent, 'debug-viewlet');
|
||||
}
|
||||
|
||||
public focus(): void {
|
||||
@@ -71,12 +70,17 @@ export class DebugViewlet extends PersistentViewsViewlet {
|
||||
}
|
||||
}
|
||||
|
||||
@memoize
|
||||
private get actions(): IAction[] {
|
||||
return [
|
||||
this._register(this.instantiationService.createInstance(StartAction, StartAction.ID, StartAction.LABEL)),
|
||||
this._register(this.instantiationService.createInstance(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL)),
|
||||
this._register(this.instantiationService.createInstance(ToggleReplAction, ToggleReplAction.ID, ToggleReplAction.LABEL))
|
||||
];
|
||||
}
|
||||
|
||||
public getActions(): IAction[] {
|
||||
const actions = [];
|
||||
actions.push(this.instantiationService.createInstance(StartAction, StartAction.ID, StartAction.LABEL));
|
||||
actions.push(this.instantiationService.createInstance(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL));
|
||||
actions.push(this._register(this.instantiationService.createInstance(ToggleReplAction, ToggleReplAction.ID, ToggleReplAction.LABEL)));
|
||||
return actions;
|
||||
return this.actions;
|
||||
}
|
||||
|
||||
public getSecondaryActions(): IAction[] {
|
||||
@@ -111,22 +115,26 @@ export class DebugViewlet extends PersistentViewsViewlet {
|
||||
}
|
||||
}
|
||||
|
||||
addPanel(panel: ViewsViewletPanel, size: number, index?: number): void {
|
||||
super.addPanel(panel, size, index);
|
||||
addPanels(panels: { panel: ViewsViewletPanel, size: number, index?: number }[]): void {
|
||||
super.addPanels(panels);
|
||||
|
||||
// attach event listener to
|
||||
if (panel.id === BREAKPOINTS_VIEW_ID) {
|
||||
this.breakpointView = panel;
|
||||
this.updateBreakpointsMaxSize();
|
||||
} else {
|
||||
this.panelListeners.set(panel.id, panel.onDidChange(() => this.updateBreakpointsMaxSize()));
|
||||
for (const { panel } of panels) {
|
||||
// attach event listener to
|
||||
if (panel.id === BREAKPOINTS_VIEW_ID) {
|
||||
this.breakpointView = panel;
|
||||
this.updateBreakpointsMaxSize();
|
||||
} else {
|
||||
this.panelListeners.set(panel.id, panel.onDidChange(() => this.updateBreakpointsMaxSize()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
removePanel(panel: ViewsViewletPanel): void {
|
||||
super.removePanel(panel);
|
||||
dispose(this.panelListeners.get(panel.id));
|
||||
this.panelListeners.delete(panel.id);
|
||||
removePanels(panels: ViewsViewletPanel[]): void {
|
||||
super.removePanels(panels);
|
||||
for (const panel of panels) {
|
||||
dispose(this.panelListeners.get(panel.id));
|
||||
this.panelListeners.delete(panel.id);
|
||||
}
|
||||
}
|
||||
|
||||
private updateBreakpointsMaxSize(): void {
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><rect height="11" width="3" y="3" x="7" fill="#fff"/><rect height="3" width="11" y="7" x="3" fill="#fff"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent{fill:#f6f6f6;opacity:0;}.icon-white{fill:#fff;}</style></defs><title>add-focus</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="iconBg"><path class="icon-white" d="M13,7V9H9v4H7V9H3V7H7V3H9V7Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 197 B After Width: | Height: | Size: 345 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><rect height="11" width="3" y="3" x="7" fill="#C5C5C5"/><rect height="3" width="11" y="7" x="3" fill="#C5C5C5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>add</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14,6v4H10v4H6V10H2V6H6V2h4V6Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M13,7V9H9v4H7V9H3V7H7V3H9V7Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 486 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><rect height="11" width="3" y="3" x="7" fill="#424242"/><rect height="3" width="11" y="7" x="3" fill="#424242"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>add</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14,6v4H10v4H6V10H2V6H6V2h4V6Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M13,7V9H9v4H7V9H3V7H7V3H9V7Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 486 B |
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#CC1100;}
|
||||
</style>
|
||||
<path class="st0" d="M8,3C5.2,3,3,5.2,3,8s2.2,5,5,5s5-2.2,5-5S10.8,3,8,3z M10.8,9.9H5.2V8.7h5.7V9.9z M10.8,7.3H5.2V6.1h5.7V7.3z"
|
||||
/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 539 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1,.icon-vs-out{fill:#f6f6f6;}.cls-1{fill-opacity:0;}.icon-disabled-grey{fill:#848484;}.icon-white{fill:#fff;}</style></defs><title>breakpoint-conditional-disabled</title><g id="canvas"><path class="cls-1" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.8,8A4.8,4.8,0,1,1,8,3.2,4.806,4.806,0,0,1,12.8,8Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M11.8,8A3.8,3.8,0,1,1,8,4.2,3.8,3.8,0,0,1,11.8,8Z"/><path class="icon-white" d="M10.1,6.7v.8H5.9V6.7ZM5.9,9.2h4.2V8.4H5.9Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 620 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-conditional-unverified</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M6.526,8.421H9.474v.842H6.526ZM11.789,8A3.789,3.789,0,1,1,8,4.211,3.788,3.788,0,0,1,11.789,8Zm-1,0A2.789,2.789,0,1,0,8,10.79,2.793,2.793,0,0,0,10.789,8ZM6.526,7.579H9.474V6.737H6.526Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 719 B |
@@ -1,10 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#E51400;}
|
||||
</style>
|
||||
<path class="st0" d="M8,3C5.2,3,3,5.2,3,8s2.2,5,5,5s5-2.2,5-5S10.8,3,8,3z M10.8,9.9H5.2V8.7h5.7V9.9z M10.8,7.3H5.2V6.1h5.7V7.3z"
|
||||
/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1,.icon-vs-out{fill:#f6f6f6;}.cls-1{fill-opacity:0;}.icon-vs-red{fill:#e51400;}.icon-white{fill:#fff;}</style></defs><title>breakpoint-conditional</title><g id="canvas"><path class="cls-1" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.8,8A4.8,4.8,0,1,1,8,3.2,4.806,4.806,0,0,1,12.8,8Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M11.8,8A3.8,3.8,0,1,1,8,4.2,3.8,3.8,0,0,1,11.8,8Z"/><path class="icon-white" d="M10.1,6.7v.8H5.9V6.7ZM5.9,9.2h4.2V8.4H5.9Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 539 B After Width: | Height: | Size: 597 B |
@@ -1 +0,0 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><g fill="#c10"><circle cx="8" cy="8" r="5"/></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 176 B |
@@ -1 +0,0 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" fill-opacity="0.8"><g fill="#5A5A5A"><circle cx="8" cy="8" r="5"/></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 198 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" fill-opacity="0.6"><g fill="#6C6C6C"><circle cx="8" cy="8" r="5"/></g></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-disabled</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M11.789,8A3.789,3.789,0,1,1,8,4.211,3.788,3.788,0,0,1,11.789,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 585 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#c10;}</style></defs><title>BreakpointFunction_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M13,13H3L8,4Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 482 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>BreakpointFunction_disabled_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M13,13H3L8,4Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 508 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>BreakpointFunction_disabled_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M13,13H3L8,4Z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-function-disabled</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.7,13H2.3L8,2.741Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M12,12H4L8,4.8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 504 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#848484;}</style></defs><title>BreakpointFunctionUnverified_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M8,4,3,13H13ZM8,6.059,11.3,12H4.7Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 516 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#848484;}</style></defs><title>BreakpointFunctionUnverified_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M8,4,3,13H13ZM8,6.059,11.3,12H4.7Z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-function-unverified</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.7,13H2.3L8,2.741Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M8,4.8,4,12h8ZM8,6.859,10.3,11H5.7Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 526 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#e51400;}</style></defs><title>BreakpointFunction_16xMD</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.7,14H1.3L8,1.941Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M13,13H3L8,4Z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#e51400;}</style></defs><title>breakpoint-function</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.7,13H2.3L8,2.741Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M12,12H4L8,4.8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 484 B After Width: | Height: | Size: 481 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" fill-opacity="0.4"><g fill="#E51400"><circle cx="8" cy="8" r="5"/></g></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.cls-1{fill:#e51400;opacity:0.4;}</style></defs><title>breakpoint-hint</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="cls-1" d="M11.789,8A3.789,3.789,0,1,1,8,4.211,3.788,3.788,0,0,1,11.789,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 567 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-log-disabled</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.414,8,8,13.414,2.586,8,8,2.586Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M12,8,8,12,4,8,8,4Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 517 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-log-unverified</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.414,8,8,13.414,2.586,8,8,2.586Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M8,4,4,8l4,4,4-4ZM5.414,8,8,5.414,10.586,8,8,10.586Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 552 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#e51400;}</style></defs><title>breakpoint-log</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.414,8,8,13.414,2.586,8,8,2.586Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M12,8,8,12,4,8,8,4Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 494 B |
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#CC1100;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
<circle class="st0" cx="8" cy="8" r="5"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="7.3" y="10.2" class="st1" width="1.5" height="1.5"/>
|
||||
<rect x="7.3" y="4.4" class="st1" width="1.5" height="4.4"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 530 B |
@@ -1,17 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#E51400;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
<circle class="st0" cx="8" cy="8" r="5"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="7.3" y="10.2" class="st1" width="1.5" height="1.5"/>
|
||||
<rect x="7.3" y="4.4" class="st1" width="1.5" height="4.4"/>
|
||||
</g>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#e51400;}.icon-white{fill:#fff;}</style></defs><title>breakpoint-unsupported</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M11.789,8A3.789,3.789,0,1,1,8,4.211,3.788,3.788,0,0,1,11.789,8Z"/><path class="icon-white" d="M7.5,9.5h1v1h-1Zm0-4v3h1v-3Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 530 B After Width: | Height: | Size: 656 B |
@@ -1 +0,0 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><g stroke="#5A5A5A" stroke-width="3" stroke-opacity="0.8"><circle cx="8" cy="8" r="4"/></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 219 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><g stroke="#6C6C6C" stroke-width="3" stroke-opacity="0.6"><circle cx="8" cy="8" r="4"/></g></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>breakpoint-unverified</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M8,4.211A3.789,3.789,0,1,0,11.789,8,3.788,3.788,0,0,0,8,4.211ZM8,10.79A2.79,2.79,0,1,1,10.79,8,2.794,2.794,0,0,1,8,10.79Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 645 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><g fill="#E51400"><circle cx="8" cy="8" r="5"/></g></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-red{fill:#e51400;}</style></defs><title>breakpoint</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M12.632,8A4.632,4.632,0,1,1,8,3.368,4.638,4.638,0,0,1,12.632,8Z"/></g><g id="iconBg"><path class="icon-vs-red" d="M11.789,8A3.789,3.789,0,1,1,8,4.211,3.788,3.788,0,0,1,11.789,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 179 B After Width: | Height: | Size: 562 B |
@@ -14,28 +14,11 @@
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
padding: 0 10px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .inputBoxContainer {
|
||||
.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .inputContainer {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .monaco-inputbox {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.monaco-editor .breakpoint-widget .input {
|
||||
font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback";
|
||||
line-height: 22px;
|
||||
background-color: transparent;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.monaco-workbench.mac .monaco-editor .breakpoint-widget .input {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.monaco-workbench.windows .monaco-editor .breakpoint-widget .input,
|
||||
.monaco-workbench.linux .monaco-editor .breakpoint-widget .input {
|
||||
font-size: 13px;
|
||||
margin-top: 6px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#1E1E1E" d="M16 5.5c0-3-2.5-5.5-5.5-5.5C7.6 0 5.3 2.2 5 5c-2.8.2-5 2.6-5 5.5 0 3 2.5 5.5 5.5 5.5 2.9 0 5.2-2.2 5.5-5 2.8-.3 5-2.6 5-5.5z"/><g fill="#C5C5C5"><path d="M10.5 1C8.2 1 6.3 2.8 6 5c.3 0 .7.1 1 .2C7.2 3.4 8.7 2 10.5 2 12.4 2 14 3.6 14 5.5c0 1.8-1.4 3.3-3.2 3.5.1.3.2.6.2 1 2.3-.2 4-2.1 4-4.5C15 3 13 1 10.5 1z"/><circle cx="5.5" cy="10.5" r="4.5"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>breakpoints-activate</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,5.5A5.536,5.536,0,0,1,11,11a5.536,5.536,0,0,1-5.5,5A5.549,5.549,0,0,1,0,10.5,5.465,5.465,0,0,1,5,5a5.512,5.512,0,0,1,11,.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.395,4.395,0,0,1,11,10a2.957,2.957,0,0,0-.2-1A3.565,3.565,0,0,0,14,5.5a3.507,3.507,0,0,0-7-.3A3.552,3.552,0,0,0,6,5a4.622,4.622,0,0,1,4.5-4A4.481,4.481,0,0,1,15,5.5ZM5.5,6A4.5,4.5,0,1,0,10,10.5,4.5,4.5,0,0,0,5.5,6Z"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 497 B After Width: | Height: | Size: 795 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#F6F6F6" d="M16 5.5c0-3-2.5-5.5-5.5-5.5C7.6 0 5.3 2.2 5 5c-2.8.2-5 2.6-5 5.5 0 3 2.5 5.5 5.5 5.5 2.9 0 5.2-2.2 5.5-5 2.8-.3 5-2.6 5-5.5z"/><g fill="#424242"><path d="M10.5 1C8.2 1 6.3 2.8 6 5c.3 0 .7.1 1 .2C7.2 3.4 8.7 2 10.5 2 12.4 2 14 3.6 14 5.5c0 1.8-1.4 3.3-3.2 3.5.1.3.2.6.2 1 2.3-.2 4-2.1 4-4.5C15 3 13 1 10.5 1z"/><circle cx="5.5" cy="10.5" r="4.5"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>breakpoints-activate</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,5.5A5.536,5.536,0,0,1,11,11a5.536,5.536,0,0,1-5.5,5A5.549,5.549,0,0,1,0,10.5,5.465,5.465,0,0,1,5,5a5.512,5.512,0,0,1,11,.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.395,4.395,0,0,1,11,10a2.957,2.957,0,0,0-.2-1A3.565,3.565,0,0,0,14,5.5a3.507,3.507,0,0,0-7-.3A3.552,3.552,0,0,0,6,5a4.622,4.622,0,0,1,4.5-4A4.481,4.481,0,0,1,15,5.5ZM5.5,6A4.5,4.5,0,1,0,10,10.5,4.5,4.5,0,0,0,5.5,6Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 497 B After Width: | Height: | Size: 794 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#1E1E1E" d="M4.222 0h-2.222v.479c-.526.648-.557 1.57-.043 2.269l.043.059v3.203l-.4.296-.053.053c-.353.352-.547.822-.547 1.321s.194.967.549 1.32c.134.134.288.236.451.322v6.678h14v-16h-11.778z"/><path fill="#E8E8E8" d="M10.798 7l-1.83-2h6.032v2h-4.202zm-2.292-6h-3.207l1.337 1.52 1.87-1.52zm-5.506 8.531v1.469h12v-2h-10.813l-.024.021c-.3.299-.716.479-1.163.51zm0 5.469h12v-2h-12v2zm3.323-8h.631l-.347-.266-.284.266zm8.677-4v-2h-3.289l-1.743 2h5.032z"/><path fill="#F48771" d="M7.246 4.6l2.856-3.277-.405-.002-3.176 2.581-2.607-2.962c-.336-.221-.786-.2-1.082.096-.308.306-.319.779-.069 1.12l2.83 2.444-3.339 2.466c-.339.338-.339.887 0 1.225.339.337.888.337 1.226 0l3.063-2.867 3.33 2.555h.466l-3.093-3.379z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}.icon-vs-action-red{fill:#f48771;}</style></defs><title>clear-repl</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M15,0V16H1V7.475l-1-1V5.525l1-1v-.99l-1-1V1.586l1-1V0H15Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M7.032,13H14v2H2V13ZM3.97,6.5l-.5.5h.99Zm0-4.949L4.525,1H3.414ZM10.711,1H7.354L8.414,2.061,7.475,3H14V1ZM3.187,9H2v2H14V9H3.187ZM7.414,5l1,1-1,1H14V5H7.414Z"/></g><g id="colorAction"><path class="icon-vs-action-red" d="M5.03,4.03,7,6,5.939,7.061,3.97,5.091,2,7.061.939,6l1.97-1.97L.939,2.061,2,1,3.97,2.97,5.939,1,7,2.061Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 787 B After Width: | Height: | Size: 847 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#fff" d="M4.222 0h-2.222v.479c-.526.648-.557 1.57-.043 2.269l.043.059v3.203l-.4.296-.053.053c-.353.352-.547.822-.547 1.321s.194.967.549 1.32c.134.134.288.236.451.322v6.678h14v-16h-11.778z"/><path fill="#424242" d="M10.798 7l-1.83-2h6.032v2h-4.202zm-2.292-6h-3.207l1.337 1.52 1.87-1.52zm-5.506 8.531v1.469h12v-2h-10.813l-.024.021c-.3.299-.716.479-1.163.51zm0 5.469h12v-2h-12v2zm3.323-8h.631l-.347-.266-.284.266zm8.677-4v-2h-3.289l-1.743 2h5.032z"/><path fill="#A1260D" d="M7.246 4.6l2.856-3.277-.405-.002-3.176 2.581-2.607-2.962c-.336-.221-.786-.2-1.082.096-.308.306-.319.779-.069 1.12l2.83 2.444-3.339 2.466c-.339.338-.339.887 0 1.225.339.337.888.337 1.226 0l3.063-2.867 3.33 2.555h.466l-3.093-3.379z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}.icon-vs-action-red{fill:#a1260d;}</style></defs><title>clear-repl</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M15,0V16H1V7.475l-1-1V5.525l1-1v-.99l-1-1V1.586l1-1V0H15Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M7.032,13H14v2H2V13ZM3.97,6.5l-.5.5h.99Zm0-4.949L4.525,1H3.414ZM10.711,1H7.354L8.414,2.061,7.475,3H14V1ZM3.187,9H2v2H14V9H3.187ZM7.414,5l1,1-1,1H14V5H7.414Z"/></g><g id="colorAction"><path class="icon-vs-action-red" d="M5.03,4.03,7,6,5.939,7.061,3.97,5.091,2,7.061.939,6l1.97-1.97L.939,2.061,2,1,3.97,2.97,5.939,1,7,2.061Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 784 B After Width: | Height: | Size: 847 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g fill="#C5C5C5"><path d="M12.714 9.603c-.07.207-.15.407-.246.601l1.017 2.139c-.335.424-.718.807-1.142 1.143l-2.14-1.018c-.193.097-.394.176-.601.247l-.795 2.235c-.265.03-.534.05-.807.05-.272 0-.541-.02-.806-.05l-.795-2.235c-.207-.071-.408-.15-.602-.247l-2.14 1.017c-.424-.336-.807-.719-1.143-1.143l1.017-2.139c-.094-.193-.175-.393-.245-.6l-2.236-.796c-.03-.265-.05-.534-.05-.807s.02-.542.05-.807l2.236-.795c.07-.207.15-.407.246-.601l-1.016-2.139c.336-.423.719-.807 1.143-1.142l2.14 1.017c.193-.096.394-.176.602-.247l.793-2.236c.265-.03.534-.05.806-.05.273 0 .542.02.808.05l.795 2.236c.207.07.407.15.601.246l2.14-1.017c.424.335.807.719 1.142 1.142l-1.017 2.139c.096.194.176.394.246.601l2.236.795c.029.266.049.535.049.808s-.02.542-.05.807l-2.236.796zm-4.714-4.603c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3z"/><circle cx="8" cy="8" r="1.5"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>configure</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,10.015l-2.238.372,1.318,1.847L12.233,15.08l-1.847-1.318L10.013,16H5.986l-.373-2.237L3.767,15.08.919,12.233l1.319-1.847L0,10.013V5.986l2.238-.373L.919,3.767,3.768.919,5.613,2.238,5.986,0h4.028l.372,2.238L12.233.919,15.08,3.768,13.762,5.613,16,5.986Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M12.876,9.521,15,9.167V6.834L12.879,6.48a5.12,5.12,0,0,0-.354-.854l1.25-1.75-1.65-1.65L10.373,3.477c-.137-.072-.262-.159-.408-.219s-.3-.087-.444-.133L9.167,1H6.834L6.48,3.121a5.118,5.118,0,0,0-.854.354l-1.75-1.25-1.65,1.65L3.477,5.627c-.072.137-.159.262-.219.408s-.087.3-.133.444L1,6.833V9.166l2.121.354a5.122,5.122,0,0,0,.354.854l-1.25,1.75,1.65,1.65,1.752-1.252c.137.072.262.159.408.22s.3.087.444.133L6.833,15H9.166l.354-2.121a5.121,5.121,0,0,0,.854-.354l1.75,1.25,1.65-1.65-1.252-1.752c.072-.137.159-.263.219-.409S12.83,9.669,12.876,9.521ZM8,10.212A2.212,2.212,0,1,1,10.212,8,2.212,2.212,0,0,1,8,10.212Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 927 B After Width: | Height: | Size: 1.3 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g fill="#424242"><path d="M12.714 9.603c-.07.207-.15.407-.246.601l1.017 2.139c-.335.424-.718.807-1.142 1.143l-2.14-1.018c-.193.097-.394.176-.601.247l-.795 2.235c-.265.03-.534.05-.807.05-.272 0-.541-.02-.806-.05l-.795-2.235c-.207-.071-.408-.15-.602-.247l-2.14 1.017c-.424-.336-.807-.719-1.143-1.143l1.017-2.139c-.094-.193-.175-.393-.245-.6l-2.236-.796c-.03-.265-.05-.534-.05-.807s.02-.542.05-.807l2.236-.795c.07-.207.15-.407.246-.601l-1.016-2.139c.336-.423.719-.807 1.143-1.142l2.14 1.017c.193-.096.394-.176.602-.247l.793-2.236c.265-.03.534-.05.806-.05.273 0 .542.02.808.05l.795 2.236c.207.07.407.15.601.246l2.14-1.017c.424.335.807.719 1.142 1.142l-1.017 2.139c.096.194.176.394.246.601l2.236.795c.029.266.049.535.049.808s-.02.542-.05.807l-2.236.796zm-4.714-4.603c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3z"/><circle cx="8" cy="8" r="1.5"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>configure</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,10.015l-2.238.372,1.318,1.847L12.233,15.08l-1.847-1.318L10.013,16H5.986l-.373-2.237L3.767,15.08.919,12.233l1.319-1.847L0,10.013V5.986l2.238-.373L.919,3.767,3.768.919,5.613,2.238,5.986,0h4.028l.372,2.238L12.233.919,15.08,3.768,13.762,5.613,16,5.986Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M12.876,9.521,15,9.167V6.834L12.879,6.48a5.12,5.12,0,0,0-.354-.854l1.25-1.75-1.65-1.65L10.373,3.477c-.137-.072-.262-.159-.408-.219s-.3-.087-.444-.133L9.167,1H6.834L6.48,3.121a5.118,5.118,0,0,0-.854.354l-1.75-1.25-1.65,1.65L3.477,5.627c-.072.137-.159.262-.219.408s-.087.3-.133.444L1,6.833V9.166l2.121.354a5.122,5.122,0,0,0,.354.854l-1.25,1.75,1.65,1.65,1.752-1.252c.137.072.262.159.408.22s.3.087.444.133L6.833,15H9.166l.354-2.121a5.121,5.121,0,0,0,.854-.354l1.75,1.25,1.65-1.65-1.252-1.752c.072-.137.159-.263.219-.409S12.83,9.669,12.876,9.521ZM8,10.212A2.212,2.212,0,1,1,10.212,8,2.212,2.212,0,0,1,8,10.212Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 927 B After Width: | Height: | Size: 1.3 KiB |
@@ -1,3 +1 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="-3 0 16 16" enable-background="new -3 0 16 16"><path fill="#89D185" d="M1 2v12l8-6-8-6z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-green{fill:#89d185;}</style></defs><title>continue</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14.334,8,3.667,16H3V0h.667Z"/></g><g id="iconBg"><path class="icon-vs-action-green" d="M4,1.5v13L12.667,8,4,1.5Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 505 B |
@@ -1,3 +1,3 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="-3 0 16 16" enable-background="new -3 0 16 16"><path fill="#388A34" d="M1 2v12l8-6-8-6z"/></svg>
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="-3 0 16 16" enable-background="new -3 0 16 16"><path fill="#388A34" d="M1 2v12l8-6-8-6z"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 324 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-red{fill:#e51400}.icon-vs-yellow{fill:#fc0}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z" id="iconBg"/><g id="iconFg"><path class="icon-vs-red" d="M10.5 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-yellow{fill:#fc0;}.icon-vs-red{fill:#e51400;}</style></defs><title>current-and-breakpoint</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.829,8,9.454,13H4V3H9.454Z"/></g><g id="iconBg"><path class="icon-vs-yellow" d="M12.5,8,9,12H5V4H9Z"/><path class="icon-vs-red" d="M10.5,8A2.5,2.5,0,1,1,8,5.5,2.5,2.5,0,0,1,10.5,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 530 B After Width: | Height: | Size: 607 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-yellow{fill:#fc0}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><g id="iconBg"><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-yellow{fill:#fc0;}</style></defs><title>current-arrow</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.829,8,9.454,13H4V3H9.454Z"/></g><g id="iconBg"><path class="icon-vs-yellow" d="M12.5,8,9,12H5V4H9Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 424 B After Width: | Height: | Size: 490 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path d="M17 19.488v4.248c0 .462.09 1.264-.373 1.264H15v-1h1v-3.19l-.173-.18c-1.453 1.205-3.528 1.248-4.67.108C10 19.578 10.118 18 11.376 16H8v1H7v-1.627C7 14.91 7.802 15 8.264 15h4.105L17 19.488zM14 9h-1V8h1.955c.46 0 1.045.22 1.045.682v3.345l.736.875c.18-.973.89-1.71 1.914-1.71.143 0 .35.014.35.04V9h1v2.618c0 .117.265.382.382.382H23v1h-2.233c.027 0 .042.154.042.298 0 1.025-.74 1.753-1.712 1.932l.875.77H23.318c.462 0 .682.583.682 1.045V19h-1v-1h-2.52L14 11.698V9zM16 4C9.373 4 4 9.373 4 16s5.373 12 12 12 12-5.373 12-12S22.627 4 16 4zm10 12c0 2.397-.85 4.6-2.262 6.324L9.676 8.262C11.4 6.85 13.602 6 16 6c5.514 0 10 4.486 10 10zM6 16c0-2.398.85-4.6 2.262-6.324L22.324 23.74C20.6 25.15 18.397 26 16 26c-5.514 0-10-4.486-10-10z" fill="#fff"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-white{fill:#fff;}</style></defs><title>debug-dark</title><g id="iconBg"><path class="icon-white" d="M8.667,10.325v2.832c0,.308.06.843-.249.843H7.333v-.667H8V11.207l-.115-.12a2.362,2.362,0,0,1-3.113.072C4,10.385,4.079,9.333,4.917,8H2.667v.667H2V7.582c0-.309.535-.249.843-.249H5.579Zm-2-6.992H6V2.667H7.3c.307,0,.7.147.7.455v2.23l.491.583a1.3,1.3,0,0,1,1.276-1.14A.6.6,0,0,1,10,4.821V3.333h.667V5.079a.413.413,0,0,0,.255.255h1.745V6H11.178c.018,0,.028.1.028.2a1.31,1.31,0,0,1-1.141,1.288L10.648,8h2.231c.308,0,.455.389.455.7V10h-.667V9.333h-1.68l-4.32-4.2ZM8,0a8,8,0,1,0,8,8A8,8,0,0,0,8,0Zm6.667,8a6.634,6.634,0,0,1-1.508,4.216L3.784,2.841A6.662,6.662,0,0,1,14.667,8ZM1.333,8A6.633,6.633,0,0,1,2.841,3.784l9.375,9.376A6.663,6.663,0,0,1,1.333,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 834 B After Width: | Height: | Size: 834 B |
@@ -6,6 +6,7 @@
|
||||
/* Activity Bar */
|
||||
.monaco-workbench > .activitybar .monaco-action-bar .action-label.debug {
|
||||
-webkit-mask: url('debug-dark.svg') no-repeat 50% 50%;
|
||||
-webkit-mask-size: 28px;
|
||||
}
|
||||
|
||||
.monaco-editor .debug-top-stack-frame-line,
|
||||
@@ -59,13 +60,12 @@
|
||||
.monaco-editor .debug-breakpoint-column::before,
|
||||
.monaco-editor .debug-top-stack-frame-column::before {
|
||||
content: " ";
|
||||
width: 0.9em;
|
||||
height: 0.8em;
|
||||
width: 1.3em;
|
||||
height: 1.3em;
|
||||
display: inline-block;
|
||||
vertical-align: text-bottom;
|
||||
margin-right: 2px;
|
||||
margin-left: 2px;
|
||||
background-size: 110% !important;
|
||||
background-position: initial !important;
|
||||
}
|
||||
|
||||
.debug-function-breakpoint {
|
||||
@@ -74,7 +74,6 @@
|
||||
|
||||
.debug-function-breakpoint-unverified {
|
||||
background: url('breakpoint-function-unverified.svg') center center no-repeat;
|
||||
|
||||
}
|
||||
|
||||
.debug-function-breakpoint-disabled {
|
||||
@@ -86,6 +85,19 @@
|
||||
background: url('breakpoint-conditional.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.debug-breakpoint-log,
|
||||
.monaco-editor .debug-breakpoint-column.debug-breakpoint-log-column::before {
|
||||
background: url('breakpoint-log.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.debug-breakpoint-log-disabled {
|
||||
background: url('breakpoint-log-disabled.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.debug-breakpoint-log-unverified {
|
||||
background: url('breakpoint-log-unverified.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.debug-breakpoint-unsupported,
|
||||
.monaco-editor .debug-breakpoint-column.debug-breakpoint-unsupported-column::before {
|
||||
background: url('breakpoint-unsupported.svg') center center no-repeat;
|
||||
@@ -93,15 +105,14 @@
|
||||
|
||||
.monaco-editor .debug-top-stack-frame.debug-breakpoint,
|
||||
.monaco-editor .debug-top-stack-frame.debug-breakpoint-conditional,
|
||||
.monaco-editor .debug-breakpoint-column.debug-breakpoint-column.debug-top-stack-frame-column::before,
|
||||
.monaco-editor.vs-dark .debug-top-stack-frame.debug-breakpoint,
|
||||
.monaco-editor.vs-dark .debug-top-stack-frame.debug-breakpoint-conditional,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-column.debug-top-stack-frame-column::before {
|
||||
.monaco-editor .debug-top-stack-frame.debug-breakpoint-log,
|
||||
.monaco-editor .debug-breakpoint-column.debug-breakpoint-column.debug-top-stack-frame-column::before {
|
||||
background: url('current-and-breakpoint.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.monaco-editor .debug-focused-stack-frame.debug-breakpoint,
|
||||
.monaco-editor .debug-focused-stack-frame.debug-breakpoint-conditional {
|
||||
.monaco-editor .debug-focused-stack-frame.debug-breakpoint-conditional,
|
||||
.monaco-editor .debug-focused-stack-frame.debug-breakpoint-log {
|
||||
background: url('stackframe-and-breakpoint.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
@@ -117,7 +128,7 @@
|
||||
|
||||
/* Debug status */
|
||||
/* A very precise css rule to overwrite the display set in statusbar.css */
|
||||
.monaco-workbench > .part.statusbar > .statusbar-item > .debug-statusbar-item > a:not([disabled]):not(.disabled) {
|
||||
.monaco-workbench > .part.statusbar > .statusbar-item > .debug-statusbar-item > a {
|
||||
display: flex;
|
||||
padding: 0 5px 0 5px;
|
||||
}
|
||||
@@ -246,61 +257,6 @@
|
||||
background-color: rgba(255, 255, 0, 0.3)
|
||||
}
|
||||
|
||||
.vs-dark .debug-breakpoint,
|
||||
.hc-black .debug-breakpoint,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-column::before {
|
||||
background: url('breakpoint-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-breakpoint-conditional,
|
||||
.hc-black .debug-breakpoint-conditional,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-conditional-column::before {
|
||||
background: url('breakpoint-conditional-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-breakpoint-unsupported,
|
||||
.hc-black .debug-breakpoint-unsupported,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-unsupported-column::before {
|
||||
background: url('breakpoint-unsupported-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-breakpoint-disabled,
|
||||
.hc-black .debug-breakpoint-disabled,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-disabled-column::before {
|
||||
background: url('breakpoint-disabled-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-breakpoint-unverified,
|
||||
.hc-black .debug-breakpoint-unverified,
|
||||
.monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-unverified-column::before {
|
||||
background: url('breakpoint-unverified-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.monaco-editor.vs-dark .debug-focused-stack-frame {
|
||||
background: url('stackframe-arrow-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.monaco-editor.vs-dark .debug-focused-stack-frame.debug-breakpoint,
|
||||
.monaco-editor.vs-dark .debug-focused-stack-frame.debug-breakpoint-conditional {
|
||||
background: url('stackframe-and-breakpoint-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-function-breakpoint,
|
||||
.hc-black .debug-function-breakpoint {
|
||||
background: url('breakpoint-function-dark.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
.vs-dark .debug-function-breakpoint-unverified,
|
||||
.hc-black .debug-function-breakpoint-unverified {
|
||||
background: url('breakpoint-function-unverified.svg') center center no-repeat;
|
||||
|
||||
}
|
||||
|
||||
.vs-dark .debug-function-breakpoint-disabled,
|
||||
.hc-black .debug-function-breakpoint-disabled {
|
||||
background: url('breakpoint-function-disabled.svg') center center no-repeat;
|
||||
}
|
||||
|
||||
/* High Contrast Theming */
|
||||
|
||||
.monaco-editor.hc-black .debug-focused-stack-frame-line {
|
||||
|
||||
@@ -17,15 +17,16 @@
|
||||
margin-right: 7px;
|
||||
}
|
||||
|
||||
.monaco-workbench .debug-actions-widget .monaco-action-bar .action-item .select-box {
|
||||
.monaco-workbench .debug-actions-widget .monaco-action-bar .action-item .monaco-select-box {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.monaco-workbench .debug-actions-widget .drag-area {
|
||||
cursor: -webkit-grab;
|
||||
height: 32px;
|
||||
width: 10px;
|
||||
width: 16px;
|
||||
background: url('drag.svg') center center no-repeat;
|
||||
background-size: 16px 16px;
|
||||
}
|
||||
|
||||
.monaco-workbench .debug-actions-widget .drag-area.dragged {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
z-index: 50;
|
||||
animation-duration: 0.15s;
|
||||
animation-name: fadeIn;
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
word-break: break-all;
|
||||
padding: 4px 5px;
|
||||
}
|
||||
@@ -35,7 +35,7 @@
|
||||
}
|
||||
|
||||
.monaco-editor .debug-hover-widget .debug-hover-tree .monaco-tree .monaco-tree-row > .content {
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,9 @@
|
||||
.monaco-workbench > .part > .title > .title-actions .start-debug-action-item .icon {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
background: url('continue.svg') center center no-repeat;
|
||||
background: url('continue.svg') no-repeat;
|
||||
background-size: 16px 16px;
|
||||
background-position: center center;
|
||||
flex-shrink: 0;
|
||||
transition: transform 50ms ease;
|
||||
-webkit-transition: -webkit-transform 50ms ease;
|
||||
@@ -75,16 +77,16 @@
|
||||
|
||||
.vs-dark .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .icon,
|
||||
.hc-black .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .icon {
|
||||
background: url('continue-inverse.svg') center center no-repeat;
|
||||
background-image: url('continue-inverse.svg');
|
||||
}
|
||||
|
||||
.monaco-workbench .monaco-action-bar .start-debug-action-item .configuration .select-box {
|
||||
.monaco-workbench .monaco-action-bar .start-debug-action-item .configuration .monaco-select-box {
|
||||
border: none;
|
||||
margin-top: 0px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.monaco-workbench .monaco-action-bar .start-debug-action-item .configuration.disabled .select-box {
|
||||
.monaco-workbench .monaco-action-bar .start-debug-action-item .configuration.disabled .monaco-select-box {
|
||||
opacity: 0.7;
|
||||
font-style: italic;
|
||||
cursor: initial;
|
||||
@@ -368,8 +370,8 @@
|
||||
}
|
||||
|
||||
.debug-viewlet .debug-breakpoints .breakpoint > .icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
}
|
||||
|
||||
.debug-viewlet .debug-breakpoints .breakpoint > .file-path {
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><defs><style>.cls-1{fill:#f48771;}</style></defs><title>Plan de travail 1</title><path class="cls-1" d="M61.8,64H2.2A2.2,2.2,0,0,1,0,61.8V2.2A2.2,2.2,0,0,1,2.2,0H61.8A2.2,2.2,0,0,1,64,2.2V61.8A2.2,2.2,0,0,1,61.8,64ZM46,21.1H42V9.1h-5v12H26.9V9.1H22v12H18v4.1h1V42.4l9,7.3v7.7h8V49.7l9-7.3V25.2h1Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-red{fill:#f48771;}</style></defs><title>disconnect</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M1,15V1H15V15Z"/></g><g id="iconBg"><path class="icon-vs-action-red" d="M2,2V14H14V2ZM9,3.5a.5.5,0,0,1,1,0V5H9Zm-3,0a.5.5,0,0,1,1,0V5H6ZM11,7H10V8.5a2,2,0,0,1-1.5,1.929V13h-1V10.429A2,2,0,0,1,6,8.5V7H5V6h6Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 598 B |
@@ -1 +1 @@
|
||||
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><defs><style>.cls-1{fill:#ac4747;}</style></defs><title>Plan de travail 1</title><path class="cls-1" d="M61.8,64H2.2A2.2,2.2,0,0,1,0,61.8V2.2A2.2,2.2,0,0,1,2.2,0H61.8A2.2,2.2,0,0,1,64,2.2V61.8A2.2,2.2,0,0,1,61.8,64ZM46,21.1H42V9.1h-5v12H26.9V9.1H22v12H18v4.1h1V42.4l9,7.3v7.7h8V49.7l9-7.3V25.2h1Z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-red{fill:#a1260d;}</style></defs><title>disconnect</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M1,15V1H15V15Z"/></g><g id="iconBg"><path class="icon-vs-action-red" d="M2,2V14H14V2ZM9,3.5a.5.5,0,0,1,1,0V5H9Zm-3,0a.5.5,0,0,1,1,0V5H6ZM11,7H10V8.5a2,2,0,0,1-1.5,1.929V13h-1V10.429A2,2,0,0,1,6,8.5V7H5V6h6Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 598 B |
@@ -1,8 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="16px" height="32px" fill="#999">
|
||||
<circle cx="5px" cy="11px" r="1.2"/>
|
||||
<circle cx="10px" cy="11px" r="1.2"/>
|
||||
<circle cx="5px" cy="16px" r="1.2"/>
|
||||
<circle cx="10px" cy="16px" r="1.2"/>
|
||||
<circle cx="5px" cy="21px" r="1.2"/>
|
||||
<circle cx="10px" cy="21px" r="1.2"/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent{fill:#f6f6f6;opacity:0;}.icon-disabled-grey{fill:#848484;}</style></defs><title>drag</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="iconBg"><path class="icon-disabled-grey" d="M7,4A1,1,0,1,1,6,3,1,1,0,0,1,7,4Zm3,1A1,1,0,1,0,9,4,1,1,0,0,0,10,5ZM6,7A1,1,0,1,0,7,8,1,1,0,0,0,6,7Zm4,0a1,1,0,1,0,1,1A1,1,0,0,0,10,7ZM6,11a1,1,0,1,0,1,1A1,1,0,0,0,6,11Zm4,0a1,1,0,1,0,1,1A1,1,0,0,0,10,11Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 337 B After Width: | Height: | Size: 534 B |
@@ -10,11 +10,6 @@
|
||||
.monaco-editor .zone-widget .zone-widget-container.exception-widget {
|
||||
padding: 6px 10px;
|
||||
white-space: pre-wrap;
|
||||
-webkit-user-select: text;
|
||||
-ms-user-select: text;
|
||||
-khtml-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-o-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path d="M13 13H3V2h10v11z" fill="#1E1E1E"/><path d="M7 12H4V3h3v9zm5-9H9v9h3V3z" fill="#75BEFF"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-blue{fill:#75beff;}</style></defs><title>pause</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13,2V14H8.5V2ZM3,14H7.5V2H3Z"/></g><g id="iconBg"><path class="icon-vs-action-blue" d="M4,3H6.5V13H4ZM9.5,3V13H12V3Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 505 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path d="M13 13H3V2h10v11z" fill="#F6F6F6"/><path d="M7 12H4V3h3v9zm5-9H9v9h3V3z" fill="#00539C"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-blue{fill:#00539c;}</style></defs><title>pause</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13,2V14H8.5V2ZM3,14H7.5V2H3Z"/></g><g id="iconBg"><path class="icon-vs-action-blue" d="M4,3H6.5V13H4ZM9.5,3V13H12V3Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 505 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#1E1E1E" d="M16 12h-2v2h-2v2H0V5h2V3h2V1h12v11z"/><g fill="#C5C5C5"><path d="M3 5h9v8h1V4H3zM5 2v1h9v8h1V2zM1 6v9h10V6H1zm8 7H7.5L6 11.5 4.5 13H3l2.3-2.3L3 8.5h1.5L6 10l1.5-1.5H9l-2.3 2.3L9 13z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>remove-all</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,1V12H14v2H12v2H0V5H2V3H4V1Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,2v9H14V3H5V2ZM3,5h9v8h1V4H3ZM1,6H11v9H1Zm4.116,4.5L3.058,12.558l.884.884L6,11.384l2.058,2.058.884-.884L6.884,10.5,8.942,8.442l-.884-.884L6,9.616,3.942,7.558l-.884.884Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 636 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#F6F6F6" d="M16 12h-2v2h-2v2H0V5h2V3h2V1h12v11z"/><g fill="#424242"><path d="M3 5h9v8h1V4H3zM5 2v1h9v8h1V2zM1 6v9h10V6H1zm8 7H7.5L6 11.5 4.5 13H3l2.3-2.3L3 8.5h1.5L6 10l1.5-1.5H9l-2.3 2.3L9 13z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}.icon-vs-fg{fill:#f0eff1;}</style></defs><title>remove-all_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline"><path class="icon-vs-out" d="M16,1V12H14v2H12v2H0V5H2V3H4V1Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M3,4H13v9H12V5H3ZM1,15H11V6H1ZM5,2V3h9v8h1V2Z"/></g><g id="iconFg"><path class="icon-vs-fg" d="M6.75,10.75,9,13H7.5L6,11.5,4.5,13H3l2.25-2.25L3,8.5H4.5L6,10,7.5,8.5H9Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 639 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="3 3 16 16" enable-background="new 3 3 16 16"><polygon fill="#FFF" points="12.597,11.042 15.4,13.845 13.844,15.4 11.042,12.598 8.239,15.4 6.683,13.845 9.485,11.042 6.683,8.239 8.238,6.683 11.042,9.486 13.845,6.683 15.4,8.239"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent{fill:#f6f6f6;opacity:0;}.icon-white{fill:#fff;}</style></defs><title>remove-focus</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="iconBg"><path class="icon-white" d="M9.414,8l3.293,3.293-1.414,1.414L8,9.414,4.707,12.707,3.293,11.293,6.586,8,3.293,4.707,4.707,3.293,8,6.586l3.293-3.293,1.414,1.414Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 450 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="3 3 16 16" enable-background="new 3 3 16 16"><polygon fill="#e8e8e8" points="12.597,11.042 15.4,13.845 13.844,15.4 11.042,12.598 8.239,15.4 6.683,13.845 9.485,11.042 6.683,8.239 8.238,6.683 11.042,9.486 13.845,6.683 15.4,8.239"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>remove</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M10.828,8l3.293,3.293-2.828,2.828L8,10.828,4.707,14.121,1.879,11.293,5.172,8,1.879,4.707,4.707,1.879,8,5.172l3.293-3.293,2.828,2.828Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M9.414,8l3.293,3.293-1.414,1.414L8,9.414,4.707,12.707,3.293,11.293,6.586,8,3.293,4.707,4.707,3.293,8,6.586l3.293-3.293,1.414,1.414Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 694 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="3 3 16 16" enable-background="new 3 3 16 16"><polygon fill="#424242" points="12.597,11.042 15.4,13.845 13.844,15.4 11.042,12.598 8.239,15.4 6.683,13.845 9.485,11.042 6.683,8.239 8.238,6.683 11.042,9.486 13.845,6.683 15.4,8.239"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>remove</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M10.828,8l3.293,3.293-2.828,2.828L8,10.828,4.707,14.121,1.879,11.293,5.172,8,1.879,4.707,4.707,1.879,8,5.172l3.293-3.293,2.828,2.828Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M9.414,8l3.293,3.293-1.414,1.414L8,9.414,4.707,12.707,3.293,11.293,6.586,8,3.293,4.707,4.707,3.293,8,6.586l3.293-3.293,1.414,1.414Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 694 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#252526;} .icon-vs-bg{fill:#c5c5c5;} .icon-vs-fg{fill:#2a292c;}</style><path class="icon-canvas-transparent" d="M32 32h-32v-32h32v32z" id="canvas"/><path class="icon-vs-out" d="M32 28h-32v-24h32v24z" id="outline"/><path class="icon-vs-bg" d="M2 6v20h28v-20h-28zm26 18h-24v-16h24v16zm-13-8l-5.25 5.5-1.75-1.833 3.5-3.667-3.5-3.667 1.75-1.833 5.25 5.5z" id="iconBg"/><g id="iconFg"><path class="icon-vs-fg" d="M4 8v16h24v-16h-24zm5.75 13.5l-1.75-1.833 3.5-3.667-3.5-3.667 1.75-1.833 5.25 5.5-5.25 5.5z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>repl</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,2V14H0V2Z"/></g><g id="iconBg"><path id="iconBg-2" data-name="iconBg" class="icon-vs-bg" d="M1,3V13H15V3Zm13,9H2V4H14ZM7.5,8,4.875,10.75,4,9.833,5.75,8,4,6.167l.875-.917Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 686 B After Width: | Height: | Size: 552 B |
@@ -23,7 +23,7 @@
|
||||
|
||||
.monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content {
|
||||
line-height: 18px;
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
/* Wrap words but also do not trim whitespace #6275 */
|
||||
word-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
@@ -163,6 +163,7 @@
|
||||
|
||||
/* ANSI Codes */
|
||||
.monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code-bold { font-weight: bold; }
|
||||
.monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code-underline { text-decoration: underline; }
|
||||
|
||||
.monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code30, .monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code90 { color: gray; }
|
||||
.monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code31, .monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row > .content > .output.expression .code91 { color: #BE1717; }
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-fg{fill:#F0EFF1;}</style><path class="icon-canvas-transparent" d="M32 32h-32v-32h32v32z" id="canvas"/><path class="icon-vs-out" d="M32 28h-32v-24h32v24z" id="outline"/><path class="icon-vs-bg" d="M2 6v20h28v-20h-28zm26 18h-24v-16h24v16zm-13-8l-5.25 5.5-1.75-1.833 3.5-3.667-3.5-3.667 1.75-1.833 5.25 5.5z" id="iconBg"/><g id="iconFg"><path class="icon-vs-fg" d="M4 8v16h24v-16h-24zm5.75 13.5l-1.75-1.833 3.5-3.667-3.5-3.667 1.75-1.833 5.25 5.5-5.25 5.5z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>repl</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M16,2V14H0V2Z"/></g><g id="iconBg"><path id="iconBg-2" data-name="iconBg" class="icon-vs-bg" d="M1,3V13H15V3Zm13,9H2V4H14ZM7.5,8,4.875,10.75,4,9.833,5.75,8,4,6.167l.875-.917Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 686 B After Width: | Height: | Size: 552 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#1E1E1E" d="M9.3 2.1L11.4 0H5.6l-4 4 .8.8-.4.6C1.4 6.5 1 7.7 1 9c0 3.9 3.1 7 7 7s7-3.1 7-7c0-3.4-2.5-6.3-5.7-6.9zM8 12c-1.7 0-3-1.3-3-3 0-.4.1-.8.3-1.2v-.1l.3.3h5.2c.1.3.2.6.2 1 0 1.7-1.3 3-3 3z"/><path fill="#89D185" d="M8 3H7l2-2H6L3 4l3 3h3L7 5h1c2.2 0 4 1.8 4 4s-1.8 4-4 4-4-1.8-4-4c0-.6.1-1.1.4-1.6L2.9 5.9c-.6.9-.9 2-.9 3.1 0 3.3 2.7 6 6 6s6-2.7 6-6-2.7-6-6-6z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-green{fill:#89d185;}</style></defs><title>restart</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M8.5,1A7.5,7.5,0,0,0,4,2.527V1H0V9H3.068l-2.057.583.272.962A7.5,7.5,0,1,0,8.5,1Zm0,11A3.515,3.515,0,0,1,5.131,9.455L5,9H8V5.036A3.6,3.6,0,0,1,8.5,5a3.5,3.5,0,0,1,0,7Z"/></g><g id="iconBg"><path class="icon-vs-action-green" d="M15,8.5A6.5,6.5,0,0,1,2.245,10.272l1.924-.544A4.509,4.509,0,1,0,4.764,6H7V8H1V2H3V5.07A6.486,6.486,0,0,1,15,8.5Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 729 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#F6F6F6" d="M9.3 2.1L11.4 0H5.6l-4 4 .8.8-.4.6C1.4 6.5 1 7.7 1 9c0 3.9 3.1 7 7 7s7-3.1 7-7c0-3.4-2.5-6.3-5.7-6.9zM8 12c-1.7 0-3-1.3-3-3 0-.4.1-.8.3-1.2v-.1l.3.3h5.2c.1.3.2.6.2 1 0 1.7-1.3 3-3 3z"/><path fill="#388A34" d="M8 3H7l2-2H6L3 4l3 3h3L7 5h1c2.2 0 4 1.8 4 4s-1.8 4-4 4-4-1.8-4-4c0-.6.1-1.1.4-1.6L2.9 5.9c-.6.9-.9 2-.9 3.1 0 3.3 2.7 6 6 6s6-2.7 6-6-2.7-6-6-6z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-green{fill:#388a34;}</style></defs><title>restart</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M8.5,1A7.5,7.5,0,0,0,4,2.527V1H0V9H3.068l-2.057.583.272.962A7.5,7.5,0,1,0,8.5,1Zm0,11A3.515,3.515,0,0,1,5.131,9.455L5,9H8V5.036A3.6,3.6,0,0,1,8.5,5a3.5,3.5,0,0,1,0,7Z"/></g><g id="iconBg"><path class="icon-vs-action-green" d="M15,8.5A6.5,6.5,0,0,1,2.245,10.272l1.924-.544A4.509,4.509,0,1,0,4.764,6H7V8H1V2H3V5.07A6.486,6.486,0,0,1,15,8.5Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 729 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-red{fill:#e51400}.icon-vs-yellow{fill:#9CCE9C}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z" id="iconBg"/><g id="iconFg"><path class="icon-vs-red" d="M10.5 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 533 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-red{fill:#e51400}.icon-vs-yellow{fill:#CEE7CE}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z" id="iconBg"/><g id="iconFg"><path class="icon-vs-red" d="M10.5 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.cls-1{fill:#9cce9c;}.icon-vs-red{fill:#e51400;}</style></defs><title>stackframe-and-breakpoint</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.829,8,9.454,13H4V3H9.454Z"/></g><g id="iconBg"><path class="cls-1" d="M12.5,8,9,12H5V4H9Z"/><path class="icon-vs-red" d="M10.5,8A2.5,2.5,0,1,1,8,5.5,2.5,2.5,0,0,1,10.5,8Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 595 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-yellow{fill:#9CCE9C}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><g id="iconBg"><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 427 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-yellow{fill:#CEE7CE}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-bg" d="M14.414 8l-5 6H3V2h6.414l5 6z" id="outline" style="display: none;"/><g id="iconBg"><path class="icon-vs-yellow" d="M13 8l-4 5H4V3h5l4 5z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.cls-1{fill:#9cce9c;}</style></defs><title>stackframe-arrow</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M13.829,8,9.454,13H4V3H9.454Z"/></g><g id="iconBg"><path class="cls-1" d="M12.5,8,9,12H5V4H9Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 427 B After Width: | Height: | Size: 478 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#2D2D30;} .icon-vs-out{fill:#2D2D30;} .icon-vs-bg{fill:#C5C5C5;} .icon-vs-action-blue{fill:#75BEFF;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 13c0-1.526-1.15-2.775-2.624-2.962L12 6.414V1.586l-2 2V1H6v2.586l-2-2v4.828l3.624 3.624C6.15 10.225 5 11.474 5 13c0 1.654 1.346 3 3 3s3-1.346 3-3z" id="outline"/><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 9L5 6V4l2 2V2h2v4l2-2v2L8 9z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}.icon-vs-action-blue{fill:#75beff;}</style></defs><title>step-into</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M11,13a3,3,0,1,1-4.375-2.651L2.556,6.28,5.03,3.806l.97.97V0h4V4.775l.97-.97L13.444,6.28,9.375,10.349A2.991,2.991,0,0,1,11,13Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M8,11a2,2,0,1,1-2,2A2,2,0,0,1,8,11Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M12.03,6.28,8,10.311,3.97,6.28,5.03,5.22,7,7.189V1H9V7.189l1.97-1.97Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 717 B After Width: | Height: | Size: 761 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 13c0-1.526-1.15-2.775-2.624-2.962L12 6.414V1.586l-2 2V1H6v2.586l-2-2v4.828l3.624 3.624C6.15 10.225 5 11.474 5 13c0 1.654 1.346 3 3 3s3-1.346 3-3z" id="outline"/><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 9L5 6V4l2 2V2h2v4l2-2v2L8 9z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}.icon-vs-action-blue{fill:#00539c;}</style></defs><title>step-into</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M11,13a3,3,0,1,1-4.375-2.651L2.556,6.28,5.03,3.806l.97.97V0h4V4.775l.97-.97L13.444,6.28,9.375,10.349A2.991,2.991,0,0,1,11,13Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M8,11a2,2,0,1,1-2,2A2,2,0,0,1,8,11Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M12.03,6.28,8,10.311,3.97,6.28,5.03,5.22,7,7.189V1H9V7.189l1.97-1.97Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 717 B After Width: | Height: | Size: 761 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#2D2D30;} .icon-vs-out{fill:#2D2D30;} .icon-vs-bg{fill:#C5C5C5;} .icon-vs-action-blue{fill:#75BEFF;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><g id="outline"><path class="icon-vs-out" d="M10 7.414l2 2V4.586l-4-4-4 4v4.828l2-2V10h4z"/><circle class="icon-vs-out" cx="8" cy="13" r="3"/></g><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M11 5v2L9 5v4H7V5L5 7V5l3-3 3 3z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}.icon-vs-action-blue{fill:#75beff;}</style></defs><title>step-out</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M10,10.78a3,3,0,1,1-4,0V6.225l-.97.97L2.556,4.72,7.275,0H8.725l4.72,4.72L10.97,7.194,10,6.225Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M8,11a2,2,0,1,1-2,2A2,2,0,0,1,8,11Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M3.97,4.72,8,.689l4.03,4.03L10.97,5.78,9,3.811V10H7V3.811L5.03,5.78Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 670 B After Width: | Height: | Size: 729 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><g id="outline"><path class="icon-vs-out" d="M10 7.414l2 2V4.586l-4-4-4 4v4.828l2-2V10h4z"/><circle class="icon-vs-out" cx="8" cy="13" r="3"/></g><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M11 5v2L9 5v4H7V5L5 7V5l3-3 3 3z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}.icon-vs-action-blue{fill:#00539c;}</style></defs><title>step-out</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M10,10.78a3,3,0,1,1-4,0V6.225l-.97.97L2.556,4.72,7.275,0H8.725l4.72,4.72L10.97,7.194,10,6.225Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M8,11a2,2,0,1,1-2,2A2,2,0,0,1,8,11Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M3.97,4.72,8,.689l4.03,4.03L10.97,5.78,9,3.811V10H7V3.811L5.03,5.78Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 670 B After Width: | Height: | Size: 729 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#2D2D30;} .icon-vs-out{fill:#2D2D30;} .icon-vs-bg{fill:#C5C5C5;} .icon-vs-action-blue{fill:#75BEFF;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M8 16c-1.654 0-3-1.346-3-3s1.346-3 3-3 3 1.346 3 3-1.346 3-3 3zm7-6V4.586l-4-4V3.03C9.967 2.367 8.755 2 7.5 2 4.158 2 1.305 4.596 1.004 7.91L.904 9H4.55l.113-.872c.104-.79.528-1.474 1.13-1.923L9.587 10H15zM6.106 6c.415-.232.892-.363 1.394-.363.51 0 1.02.133 1.466.363h-2.86z" id="outline"/><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M3.67 8H2c.254-2.8 2.637-5 5.5-5 1.86 0 3.504.93 4.5 2.348V3l2 2v4h-4L8 7h3v-.002l.238.002C10.652 5.61 9.102 4.637 7.5 4.637 5.535 4.637 3.915 6.102 3.67 8z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}.icon-vs-action-blue{fill:#75beff;}</style></defs><title>step-over</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M11,13a3,3,0,1,1-3-3A3,3,0,0,1,11,13ZM12,1V2.527A7.466,7.466,0,0,0,.028,7.923L0,8.293V9H3.945l.1-.888A3.475,3.475,0,0,1,8,5.036V9h8V1Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M10,13a2,2,0,1,1-2-2A2,2,0,0,1,10,13Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M15,2V8H9V6h2.237A4.481,4.481,0,0,0,3.051,8H1.025A6.482,6.482,0,0,1,13,5.069V2Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 967 B After Width: | Height: | Size: 782 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M8 16c-1.654 0-3-1.346-3-3s1.346-3 3-3 3 1.346 3 3-1.346 3-3 3zm7-6V4.586l-4-4V3.03C9.967 2.367 8.755 2 7.5 2 4.158 2 1.305 4.596 1.004 7.91L.904 9H4.55l.113-.872c.104-.79.528-1.474 1.13-1.923L9.587 10H15zM6.106 6c.415-.232.892-.363 1.394-.363.51 0 1.02.133 1.466.363h-2.86z" id="outline"/><path class="icon-vs-bg" d="M8 11c1.104 0 2 .896 2 2s-.896 2-2 2-2-.896-2-2 .896-2 2-2z" id="iconBg"/><path class="icon-vs-action-blue" d="M3.67 8H2c.254-2.8 2.637-5 5.5-5 1.86 0 3.504.93 4.5 2.348V3l2 2v4h-4L8 7h3v-.002l.238.002C10.652 5.61 9.102 4.637 7.5 4.637 5.535 4.637 3.915 6.102 3.67 8z" id="colorAction"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}.icon-vs-action-blue{fill:#00539c;}</style></defs><title>step-over</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M11,13a3,3,0,1,1-3-3A3,3,0,0,1,11,13ZM12,1V2.527A7.466,7.466,0,0,0,.028,7.923L0,8.293V9H3.945l.1-.888A3.475,3.475,0,0,1,8,5.036V9h8V1Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M10,13a2,2,0,1,1-2-2A2,2,0,0,1,10,13Z"/></g><g id="colorAction"><path class="icon-vs-action-blue" d="M15,2V8H9V6h2.237A4.481,4.481,0,0,0,3.051,8H1.025A6.482,6.482,0,0,1,13,5.069V2Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 967 B After Width: | Height: | Size: 782 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#2D2D30" d="M13 13h-10v-10h10v10z"/><path fill="#F48771" d="M12 12h-8v-8h8v8z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-red{fill:#f48771;}</style></defs><title>stop</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14,2V14H2V2Z"/></g><g id="iconBg"><path class="icon-vs-action-red" d="M13,3V13H3V3Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 470 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16" height="16" width="16"><path fill="#F6F6F6" d="M13 13h-10v-10h10v10z"/><path fill="#A1260D" d="M12 12h-8v-8h8v8z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-action-red{fill:#a1260d;}</style></defs><title>stop</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,0V16H0V0Z"/></g><g id="outline" style="display: none;"><path class="icon-vs-out" d="M14,2V14H2V2Z"/></g><g id="iconBg"><path class="icon-vs-action-red" d="M13,3V13H3V3Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 470 B |
@@ -56,7 +56,7 @@ export class StatusBarColorProvider extends Themable implements IWorkbenchContri
|
||||
super.updateStyles();
|
||||
|
||||
const container = this.partService.getContainer(Parts.STATUSBAR_PART);
|
||||
if (this.isDebugging()) {
|
||||
if (isStatusbarInDebugMode(this.debugService)) {
|
||||
addClass(container, 'debugging');
|
||||
} else {
|
||||
removeClass(container, 'debugging');
|
||||
@@ -84,7 +84,7 @@ export class StatusBarColorProvider extends Themable implements IWorkbenchContri
|
||||
private getColorKey(noFolderColor: string, debuggingColor: string, normalColor: string): string {
|
||||
|
||||
// Not debugging
|
||||
if (!this.isDebugging()) {
|
||||
if (!isStatusbarInDebugMode(this.debugService)) {
|
||||
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
|
||||
return normalColor;
|
||||
}
|
||||
@@ -95,24 +95,20 @@ export class StatusBarColorProvider extends Themable implements IWorkbenchContri
|
||||
// Debugging
|
||||
return debuggingColor;
|
||||
}
|
||||
}
|
||||
|
||||
private isDebugging(): boolean {
|
||||
if (this.debugService.state === State.Inactive || this.debugService.state === State.Initializing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.isRunningWithoutDebug()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
export function isStatusbarInDebugMode(debugService: IDebugService): boolean {
|
||||
if (debugService.state === State.Inactive || debugService.state === State.Initializing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
private isRunningWithoutDebug(): boolean {
|
||||
const process = this.debugService.getViewModel().focusedProcess;
|
||||
|
||||
return process && process.configuration && process.configuration.noDebug;
|
||||
const process = debugService.getViewModel().focusedProcess;
|
||||
const isRunningWithoutDebug = process && process.configuration && process.configuration.noDebug;
|
||||
if (isRunningWithoutDebug) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||
@@ -120,4 +116,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||
if (statusBarItemDebuggingForeground) {
|
||||
collector.addRule(`.monaco-workbench > .part.statusbar.debugging > .statusbar-item .mask-icon { background-color: ${statusBarItemDebuggingForeground} !important; }`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -7,7 +7,7 @@ import * as nls from 'vs/nls';
|
||||
import uri from 'vs/base/common/uri';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import severity from 'vs/base/common/severity';
|
||||
import Event from 'vs/base/common/event';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IJSONSchemaSnippet } from 'vs/base/common/jsonSchema';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IEditorContribution } from 'vs/editor/common/editorCommon';
|
||||
@@ -20,6 +20,7 @@ import { Range, IRange } from 'vs/editor/common/core/range';
|
||||
import { RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
|
||||
export const VIEWLET_ID = 'workbench.view.debug';
|
||||
export const VARIABLES_VIEW_ID = 'workbench.debug.variablesView';
|
||||
@@ -34,9 +35,10 @@ export const CONTEXT_IN_DEBUG_MODE = new RawContextKey<boolean>('inDebugMode', f
|
||||
export const CONTEXT_NOT_IN_DEBUG_MODE: ContextKeyExpr = CONTEXT_IN_DEBUG_MODE.toNegated();
|
||||
export const CONTEXT_IN_DEBUG_REPL = new RawContextKey<boolean>('inDebugRepl', false);
|
||||
export const CONTEXT_NOT_IN_DEBUG_REPL: ContextKeyExpr = CONTEXT_IN_DEBUG_REPL.toNegated();
|
||||
export const CONTEXT_ON_FIRST_DEBUG_REPL_LINE = new RawContextKey<boolean>('onFirsteDebugReplLine', false);
|
||||
export const CONTEXT_ON_FIRST_DEBUG_REPL_LINE = new RawContextKey<boolean>('onFirstDebugReplLine', false);
|
||||
export const CONTEXT_ON_LAST_DEBUG_REPL_LINE = new RawContextKey<boolean>('onLastDebugReplLine', false);
|
||||
export const CONTEXT_BREAKPOINT_WIDGET_VISIBLE = new RawContextKey<boolean>('breakpointWidgetVisible', false);
|
||||
export const CONTEXT_IN_BREAKPOINT_WIDGET = new RawContextKey<boolean>('inBreakpointWidget', false);
|
||||
export const CONTEXT_BREAKPOINTS_FOCUSED = new RawContextKey<boolean>('breakpointsFocused', true);
|
||||
export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey<boolean>('watchExpressionsFocused', true);
|
||||
export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey<boolean>('variablesFocused', true);
|
||||
@@ -121,6 +123,7 @@ export interface ISession {
|
||||
stepOut(args: DebugProtocol.StepOutArguments): TPromise<DebugProtocol.StepOutResponse>;
|
||||
continue(args: DebugProtocol.ContinueArguments): TPromise<DebugProtocol.ContinueResponse>;
|
||||
pause(args: DebugProtocol.PauseArguments): TPromise<DebugProtocol.PauseResponse>;
|
||||
terminateThreads(args: DebugProtocol.TerminateThreadsArguments): TPromise<DebugProtocol.TerminateThreadsResponse>;
|
||||
stepBack(args: DebugProtocol.StepBackArguments): TPromise<DebugProtocol.StepBackResponse>;
|
||||
reverseContinue(args: DebugProtocol.ReverseContinueArguments): TPromise<DebugProtocol.ReverseContinueResponse>;
|
||||
|
||||
@@ -139,8 +142,8 @@ export interface IProcess extends ITreeElement {
|
||||
getName(includeRoot: boolean): string;
|
||||
configuration: IConfig;
|
||||
session: ISession;
|
||||
sources: Map<string, Source>;
|
||||
state: ProcessState;
|
||||
getSourceForUri(modelUri: uri): Source;
|
||||
getThread(threadId: number): IThread;
|
||||
getAllThreads(): IThread[];
|
||||
getSource(raw: DebugProtocol.Source): Source;
|
||||
@@ -197,6 +200,7 @@ export interface IThread extends ITreeElement {
|
||||
stepBack(): TPromise<any>;
|
||||
continue(): TPromise<any>;
|
||||
pause(): TPromise<any>;
|
||||
terminate(): TPromise<any>;
|
||||
reverseContinue(): TPromise<any>;
|
||||
}
|
||||
|
||||
@@ -230,32 +234,36 @@ export interface IBreakpointData {
|
||||
column?: number;
|
||||
enabled?: boolean;
|
||||
condition?: string;
|
||||
logMessage?: string;
|
||||
hitCondition?: string;
|
||||
}
|
||||
|
||||
export interface IBreakpointUpdateData extends DebugProtocol.Breakpoint {
|
||||
condition?: string;
|
||||
hitCondition?: string;
|
||||
logMessage?: string;
|
||||
}
|
||||
|
||||
export interface IBreakpoint extends IEnablement {
|
||||
export interface IBaseBreakpoint extends IEnablement {
|
||||
condition: string;
|
||||
hitCondition: string;
|
||||
logMessage: string;
|
||||
verified: boolean;
|
||||
idFromAdapter: number;
|
||||
}
|
||||
|
||||
export interface IBreakpoint extends IBaseBreakpoint {
|
||||
uri: uri;
|
||||
lineNumber: number;
|
||||
endLineNumber?: number;
|
||||
column: number;
|
||||
endColumn?: number;
|
||||
condition: string;
|
||||
hitCondition: string;
|
||||
verified: boolean;
|
||||
idFromAdapter: number;
|
||||
message: string;
|
||||
adapterData: any;
|
||||
}
|
||||
|
||||
export interface IFunctionBreakpoint extends IEnablement {
|
||||
export interface IFunctionBreakpoint extends IBaseBreakpoint {
|
||||
name: string;
|
||||
verified: boolean;
|
||||
idFromAdapter: number;
|
||||
hitCondition: string;
|
||||
}
|
||||
|
||||
export interface IExceptionBreakpoint extends IEnablement {
|
||||
@@ -300,13 +308,13 @@ export interface IViewModel extends ITreeElement {
|
||||
}
|
||||
|
||||
export interface IModel extends ITreeElement {
|
||||
getProcesses(): IProcess[];
|
||||
getBreakpoints(): IBreakpoint[];
|
||||
getProcesses(): ReadonlyArray<IProcess>;
|
||||
getBreakpoints(): ReadonlyArray<IBreakpoint>;
|
||||
areBreakpointsActivated(): boolean;
|
||||
getFunctionBreakpoints(): IFunctionBreakpoint[];
|
||||
getExceptionBreakpoints(): IExceptionBreakpoint[];
|
||||
getWatchExpressions(): IExpression[];
|
||||
getReplElements(): IReplElement[];
|
||||
getFunctionBreakpoints(): ReadonlyArray<IFunctionBreakpoint>;
|
||||
getExceptionBreakpoints(): ReadonlyArray<IExceptionBreakpoint>;
|
||||
getWatchExpressions(): ReadonlyArray<IExpression>;
|
||||
getReplElements(): ReadonlyArray<IReplElement>;
|
||||
|
||||
onDidChangeBreakpoints: Event<IBreakpointsChangeEvent>;
|
||||
onDidChangeCallStack: Event<void>;
|
||||
@@ -342,6 +350,8 @@ export interface IDebugConfiguration {
|
||||
hideActionBar: boolean;
|
||||
showInStatusBar: 'never' | 'always' | 'onFirstSessionStart';
|
||||
internalConsoleOptions: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart';
|
||||
extensionHostDebugAdapter: boolean;
|
||||
enableAllHovers: boolean;
|
||||
}
|
||||
|
||||
export interface IGlobalConfig {
|
||||
@@ -351,22 +361,29 @@ export interface IGlobalConfig {
|
||||
}
|
||||
|
||||
export interface IEnvConfig {
|
||||
name?: string;
|
||||
type: string;
|
||||
request: string;
|
||||
internalConsoleOptions?: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart';
|
||||
preLaunchTask?: string;
|
||||
__restart?: any;
|
||||
__sessionId?: string;
|
||||
postDebugTask?: string;
|
||||
debugServer?: number;
|
||||
noDebug?: boolean;
|
||||
port?: number;
|
||||
}
|
||||
|
||||
export interface IConfig extends IEnvConfig {
|
||||
|
||||
// fundamental attributes
|
||||
type: string;
|
||||
request: string;
|
||||
name?: string;
|
||||
|
||||
// platform specifics
|
||||
windows?: IEnvConfig;
|
||||
osx?: IEnvConfig;
|
||||
linux?: IEnvConfig;
|
||||
|
||||
// internals
|
||||
__sessionId?: string;
|
||||
__restart?: any;
|
||||
port?: number; // TODO
|
||||
}
|
||||
|
||||
export interface ICompound {
|
||||
@@ -374,34 +391,58 @@ export interface ICompound {
|
||||
configurations: (string | { name: string, folder: string })[];
|
||||
}
|
||||
|
||||
export interface IDebugAdapter extends IDisposable {
|
||||
readonly onError: Event<Error>;
|
||||
readonly onExit: Event<number>;
|
||||
onRequest(callback: (request: DebugProtocol.Request) => void);
|
||||
onEvent(callback: (event: DebugProtocol.Event) => void);
|
||||
startSession(): TPromise<void>;
|
||||
sendMessage(message: DebugProtocol.ProtocolMessage): void;
|
||||
sendResponse(response: DebugProtocol.Response): void;
|
||||
sendRequest(command: string, args: any, clb: (result: DebugProtocol.Response) => void): void;
|
||||
stopSession(): TPromise<void>;
|
||||
}
|
||||
|
||||
export interface IDebugAdapterProvider extends ITerminalLauncher {
|
||||
createDebugAdapter(debugType: string, adapterInfo: IAdapterExecutable | null): IDebugAdapter;
|
||||
substituteVariables(folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig>;
|
||||
}
|
||||
|
||||
export interface IAdapterExecutable {
|
||||
command?: string;
|
||||
args?: string[];
|
||||
}
|
||||
|
||||
export interface IRawEnvAdapter {
|
||||
type?: string;
|
||||
label?: string;
|
||||
export interface IPlatformSpecificAdapterContribution {
|
||||
program?: string;
|
||||
args?: string[];
|
||||
runtime?: string;
|
||||
runtimeArgs?: string[];
|
||||
}
|
||||
|
||||
export interface IRawAdapter extends IRawEnvAdapter {
|
||||
export interface IDebuggerContribution extends IPlatformSpecificAdapterContribution {
|
||||
type?: string;
|
||||
label?: string;
|
||||
// debug adapter executable
|
||||
adapterExecutableCommand?: string;
|
||||
enableBreakpointsFor?: { languageIds: string[] };
|
||||
configurationAttributes?: any;
|
||||
configurationSnippets?: IJSONSchemaSnippet[];
|
||||
initialConfigurations?: any[];
|
||||
languages?: string[];
|
||||
variables?: { [key: string]: string };
|
||||
win?: IPlatformSpecificAdapterContribution;
|
||||
winx86?: IPlatformSpecificAdapterContribution;
|
||||
windows?: IPlatformSpecificAdapterContribution;
|
||||
osx?: IPlatformSpecificAdapterContribution;
|
||||
linux?: IPlatformSpecificAdapterContribution;
|
||||
|
||||
// internal
|
||||
aiKey?: string;
|
||||
win?: IRawEnvAdapter;
|
||||
winx86?: IRawEnvAdapter;
|
||||
windows?: IRawEnvAdapter;
|
||||
osx?: IRawEnvAdapter;
|
||||
linux?: IRawEnvAdapter;
|
||||
|
||||
// supported languages
|
||||
languages?: string[];
|
||||
enableBreakpointsFor?: { languageIds: string[] };
|
||||
|
||||
// debug configuration support
|
||||
configurationAttributes?: any;
|
||||
initialConfigurations?: any[];
|
||||
configurationSnippets?: IJSONSchemaSnippet[];
|
||||
variables?: { [key: string]: string };
|
||||
}
|
||||
|
||||
export interface IDebugConfigurationProvider {
|
||||
@@ -412,6 +453,25 @@ export interface IDebugConfigurationProvider {
|
||||
debugAdapterExecutable(folderUri: uri | undefined): TPromise<IAdapterExecutable>;
|
||||
}
|
||||
|
||||
export interface ITerminalLauncher {
|
||||
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void>;
|
||||
}
|
||||
|
||||
export interface ITerminalSettings {
|
||||
external: {
|
||||
windowsExec: string,
|
||||
osxExec: string,
|
||||
linuxExec: string
|
||||
};
|
||||
integrated: {
|
||||
shell: {
|
||||
osx: string,
|
||||
windows: string,
|
||||
linux: string
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export interface IConfigurationManager {
|
||||
/**
|
||||
* Returns true if breakpoints can be set for a given editor model. Depends on mode.
|
||||
@@ -442,6 +502,11 @@ export interface IConfigurationManager {
|
||||
|
||||
resolveConfigurationByProviders(folderUri: uri | undefined, type: string | undefined, debugConfiguration: any): TPromise<any>;
|
||||
debugAdapterExecutable(folderUri: uri | undefined, type: string): TPromise<IAdapterExecutable | undefined>;
|
||||
|
||||
registerDebugAdapterProvider(debugTypes: string[], debugAdapterLauncher: IDebugAdapterProvider): IDisposable;
|
||||
createDebugAdapter(debugType: string, adapterExecutable: IAdapterExecutable | null): IDebugAdapter | undefined;
|
||||
substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig>;
|
||||
runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void>;
|
||||
}
|
||||
|
||||
export interface ILaunch {
|
||||
@@ -484,12 +549,6 @@ export interface ILaunch {
|
||||
*/
|
||||
getConfigurationNames(includeCompounds?: boolean): string[];
|
||||
|
||||
/**
|
||||
* Returns the resolved configuration.
|
||||
* Replaces os specific values, system variables, interactive variables.
|
||||
*/
|
||||
resolveConfiguration(config: IConfig): TPromise<IConfig>;
|
||||
|
||||
/**
|
||||
* Opens the launch.json file. Creates if it does not exist.
|
||||
*/
|
||||
@@ -545,7 +604,7 @@ export interface IDebugService {
|
||||
/**
|
||||
* Adds new breakpoints to the model for the file specified with the uri. Notifies debug adapter of breakpoint changes.
|
||||
*/
|
||||
addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise<void>;
|
||||
addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise<IBreakpoint[]>;
|
||||
|
||||
/**
|
||||
* Updates the breakpoints.
|
||||
@@ -627,7 +686,7 @@ export interface IDebugService {
|
||||
* Also saves all files, manages if compounds are present in the configuration
|
||||
* and resolveds configurations via DebugConfigurationProviders.
|
||||
*/
|
||||
startDebugging(launch: ILaunch, configOrName?: IConfig | string, noDebug?: boolean): TPromise<any>;
|
||||
startDebugging(launch: ILaunch, configOrName?: IConfig | string, noDebug?: boolean): TPromise<void>;
|
||||
|
||||
/**
|
||||
* Restarts a process or creates a new one if there is no active session.
|
||||
@@ -656,9 +715,14 @@ export interface IDebugService {
|
||||
}
|
||||
|
||||
// Editor interfaces
|
||||
export enum BreakpointWidgetContext {
|
||||
CONDITION = 0,
|
||||
HIT_COUNT = 1,
|
||||
LOG_MESSAGE = 2
|
||||
}
|
||||
export interface IDebugEditorContribution extends IEditorContribution {
|
||||
showHover(range: Range, focus: boolean): TPromise<void>;
|
||||
showBreakpointWidget(lineNumber: number, column: number): void;
|
||||
showBreakpointWidget(lineNumber: number, column: number, context?: BreakpointWidgetContext): void;
|
||||
closeBreakpointWidget(): void;
|
||||
addLaunchConfiguration(): TPromise<any>;
|
||||
}
|
||||
|
||||
@@ -8,19 +8,19 @@ import uri from 'vs/base/common/uri';
|
||||
import * as resources from 'vs/base/common/resources';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import Event, { Emitter } from 'vs/base/common/event';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { generateUuid } from 'vs/base/common/uuid';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import severity from 'vs/base/common/severity';
|
||||
import { isObject, isString } from 'vs/base/common/types';
|
||||
import { isObject, isString, isUndefinedOrNull } from 'vs/base/common/types';
|
||||
import { distinct } from 'vs/base/common/arrays';
|
||||
import { Range, IRange } from 'vs/editor/common/core/range';
|
||||
import { ISuggestion } from 'vs/editor/common/modes';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import {
|
||||
ITreeElement, IExpression, IExpressionContainer, IProcess, IStackFrame, IExceptionBreakpoint, IBreakpoint, IFunctionBreakpoint, IModel, IReplElementSource,
|
||||
IConfig, ISession, IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IBreakpointData, IExceptionInfo, IReplElement, ProcessState, IBreakpointsChangeEvent, IBreakpointUpdateData
|
||||
IConfig, ISession, IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IBreakpointData, IExceptionInfo, IReplElement, ProcessState, IBreakpointsChangeEvent, IBreakpointUpdateData, IBaseBreakpoint
|
||||
} from 'vs/workbench/parts/debug/common/debug';
|
||||
import { Source } from 'vs/workbench/parts/debug/common/debugSource';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
@@ -39,6 +39,7 @@ export abstract class AbstractReplElement implements IReplElement {
|
||||
return `replelement:${this.id}`;
|
||||
}
|
||||
|
||||
// Used by the copy all action in repl
|
||||
abstract toString(): string;
|
||||
}
|
||||
|
||||
@@ -97,7 +98,7 @@ export class RawObjectReplElement extends AbstractReplElement implements IExpres
|
||||
}
|
||||
|
||||
public toString(): string {
|
||||
return this.name ? `${this.name}: ${this.value}` : this.value;
|
||||
return `${this.name}\n${this.value}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -524,6 +525,10 @@ export class Thread implements IThread {
|
||||
return this.process.session.pause({ threadId: this.threadId });
|
||||
}
|
||||
|
||||
public terminate(): TPromise<any> {
|
||||
return this.process.session.terminateThreads({ threadIds: [this.threadId] });
|
||||
}
|
||||
|
||||
public reverseContinue(): TPromise<any> {
|
||||
return this.process.session.reverseContinue({ threadId: this.threadId });
|
||||
}
|
||||
@@ -531,8 +536,9 @@ export class Thread implements IThread {
|
||||
|
||||
export class Process implements IProcess {
|
||||
|
||||
public sources: Map<string, Source>;
|
||||
private sources: Map<string, Source>;
|
||||
private threads: Map<number, Thread>;
|
||||
|
||||
public inactive = true;
|
||||
|
||||
constructor(public configuration: IConfig, private _session: ISession & ITreeElement) {
|
||||
@@ -557,6 +563,10 @@ export class Process implements IProcess {
|
||||
return this.configuration.type === 'attach' ? ProcessState.ATTACH : ProcessState.LAUNCH;
|
||||
}
|
||||
|
||||
public getSourceForUri(modelUri: uri): Source {
|
||||
return this.sources.get(modelUri.toString());
|
||||
}
|
||||
|
||||
public getSource(raw: DebugProtocol.Source): Source {
|
||||
let source = new Source(raw, this.getId());
|
||||
if (this.sources.has(source.uri.toString())) {
|
||||
@@ -671,12 +681,48 @@ export class Process implements IProcess {
|
||||
return result;
|
||||
}, err => []);
|
||||
}
|
||||
|
||||
setNotAvailable(modelUri: uri) {
|
||||
const source = this.sources.get(modelUri.toString());
|
||||
if (source) {
|
||||
source.available = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class Breakpoint implements IBreakpoint {
|
||||
export class Enablement implements IEnablement {
|
||||
constructor(
|
||||
public enabled: boolean,
|
||||
private id: string
|
||||
) { }
|
||||
|
||||
public getId(): string {
|
||||
return this.id;
|
||||
}
|
||||
}
|
||||
|
||||
export class BaseBreakpoint extends Enablement implements IBaseBreakpoint {
|
||||
|
||||
public verified: boolean;
|
||||
public idFromAdapter: number;
|
||||
|
||||
constructor(
|
||||
enabled: boolean,
|
||||
public hitCondition: string,
|
||||
public condition: string,
|
||||
public logMessage: string,
|
||||
id: string
|
||||
) {
|
||||
super(enabled, id);
|
||||
if (enabled === undefined) {
|
||||
this.enabled = true;
|
||||
}
|
||||
this.verified = false;
|
||||
}
|
||||
}
|
||||
|
||||
export class Breakpoint extends BaseBreakpoint implements IBreakpoint {
|
||||
|
||||
public message: string;
|
||||
public endLineNumber: number;
|
||||
public endColumn: number;
|
||||
@@ -685,47 +731,34 @@ export class Breakpoint implements IBreakpoint {
|
||||
public uri: uri,
|
||||
public lineNumber: number,
|
||||
public column: number,
|
||||
public enabled: boolean,
|
||||
public condition: string,
|
||||
public hitCondition: string,
|
||||
enabled: boolean,
|
||||
condition: string,
|
||||
hitCondition: string,
|
||||
logMessage: string,
|
||||
public adapterData: any,
|
||||
private id = generateUuid()
|
||||
id = generateUuid()
|
||||
) {
|
||||
if (enabled === undefined) {
|
||||
this.enabled = true;
|
||||
}
|
||||
this.verified = false;
|
||||
}
|
||||
|
||||
public getId(): string {
|
||||
return this.id;
|
||||
super(enabled, hitCondition, condition, logMessage, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class FunctionBreakpoint implements IFunctionBreakpoint {
|
||||
export class FunctionBreakpoint extends BaseBreakpoint implements IFunctionBreakpoint {
|
||||
|
||||
public verified: boolean;
|
||||
public idFromAdapter: number;
|
||||
|
||||
constructor(public name: string, public enabled: boolean, public hitCondition: string, private id = generateUuid()) {
|
||||
this.verified = false;
|
||||
}
|
||||
|
||||
public getId(): string {
|
||||
return this.id;
|
||||
constructor(
|
||||
public name: string,
|
||||
enabled: boolean,
|
||||
hitCondition: string,
|
||||
condition: string,
|
||||
logMessage: string,
|
||||
id = generateUuid()) {
|
||||
super(enabled, hitCondition, condition, logMessage, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ExceptionBreakpoint implements IExceptionBreakpoint {
|
||||
export class ExceptionBreakpoint extends Enablement implements IExceptionBreakpoint {
|
||||
|
||||
private id: string;
|
||||
|
||||
constructor(public filter: string, public label: string, public enabled: boolean) {
|
||||
this.id = generateUuid();
|
||||
}
|
||||
|
||||
public getId(): string {
|
||||
return this.id;
|
||||
constructor(public filter: string, public label: string, enabled: boolean) {
|
||||
super(enabled, generateUuid());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -743,10 +776,10 @@ export class Model implements IModel {
|
||||
private toDispose: lifecycle.IDisposable[];
|
||||
private replElements: IReplElement[];
|
||||
private schedulers = new Map<string, RunOnceScheduler>();
|
||||
private _onDidChangeBreakpoints: Emitter<IBreakpointsChangeEvent>;
|
||||
private _onDidChangeCallStack: Emitter<void>;
|
||||
private _onDidChangeWatchExpressions: Emitter<IExpression>;
|
||||
private _onDidChangeREPLElements: Emitter<void>;
|
||||
private readonly _onDidChangeBreakpoints: Emitter<IBreakpointsChangeEvent>;
|
||||
private readonly _onDidChangeCallStack: Emitter<void>;
|
||||
private readonly _onDidChangeWatchExpressions: Emitter<IExpression>;
|
||||
private readonly _onDidChangeREPLElements: Emitter<void>;
|
||||
|
||||
constructor(
|
||||
private breakpoints: Breakpoint[],
|
||||
@@ -837,10 +870,23 @@ export class Model implements IModel {
|
||||
return thread.fetchCallStack();
|
||||
}
|
||||
|
||||
public getBreakpoints(): Breakpoint[] {
|
||||
public getBreakpoints(): IBreakpoint[] {
|
||||
return this.breakpoints;
|
||||
}
|
||||
|
||||
public getBreakpointsForResource(resource: uri): IBreakpoint[] {
|
||||
const uriString = resource.toString();
|
||||
return this.breakpoints.filter(bp => bp.uri.toString() === uriString);
|
||||
}
|
||||
|
||||
public getEnabledBreakpointsForResource(resource: uri): IBreakpoint[] {
|
||||
if (this.breakpointsActivated) {
|
||||
const uriString = resource.toString();
|
||||
return this.breakpoints.filter(bp => bp.uri.toString() === uriString && bp.enabled);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
public getFunctionBreakpoints(): IFunctionBreakpoint[] {
|
||||
return this.functionBreakpoints;
|
||||
}
|
||||
@@ -868,8 +914,8 @@ export class Model implements IModel {
|
||||
this._onDidChangeBreakpoints.fire();
|
||||
}
|
||||
|
||||
public addBreakpoints(uri: uri, rawData: IBreakpointData[], fireEvent = true): Breakpoint[] {
|
||||
const newBreakpoints = rawData.map(rawBp => new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition, undefined, rawBp.id));
|
||||
public addBreakpoints(uri: uri, rawData: IBreakpointData[], fireEvent = true): IBreakpoint[] {
|
||||
const newBreakpoints = rawData.map(rawBp => new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition, rawBp.logMessage, undefined, rawBp.id));
|
||||
this.breakpoints = this.breakpoints.concat(newBreakpoints);
|
||||
this.breakpointsActivated = true;
|
||||
this.sortAndDeDup();
|
||||
@@ -891,16 +937,28 @@ export class Model implements IModel {
|
||||
this.breakpoints.forEach(bp => {
|
||||
const bpData = data[bp.getId()];
|
||||
if (bpData) {
|
||||
bp.lineNumber = bpData.line ? bpData.line : bp.lineNumber;
|
||||
if (!isUndefinedOrNull(bpData.line)) {
|
||||
bp.lineNumber = bpData.line;
|
||||
}
|
||||
bp.endLineNumber = bpData.endLine;
|
||||
bp.column = bpData.column;
|
||||
bp.endColumn = bpData.endColumn;
|
||||
bp.verified = bp.verified || bpData.verified;
|
||||
if (!isUndefinedOrNull(bpData.verified)) {
|
||||
bp.verified = bpData.verified;
|
||||
}
|
||||
bp.idFromAdapter = bpData.id;
|
||||
bp.message = bpData.message;
|
||||
bp.adapterData = bpData.source ? bpData.source.adapterData : bp.adapterData;
|
||||
bp.condition = bpData.condition || bp.condition;
|
||||
bp.hitCondition = bpData.hitCondition || bp.hitCondition;
|
||||
|
||||
if (!isUndefinedOrNull(bpData.condition)) {
|
||||
bp.condition = bpData.condition;
|
||||
}
|
||||
if (!isUndefinedOrNull(bpData.hitCondition)) {
|
||||
bp.hitCondition = bpData.hitCondition;
|
||||
}
|
||||
if (!isUndefinedOrNull(bpData.logMessage)) {
|
||||
bp.logMessage = bpData.logMessage;
|
||||
}
|
||||
updated.push(bp);
|
||||
}
|
||||
});
|
||||
@@ -961,8 +1019,8 @@ export class Model implements IModel {
|
||||
this._onDidChangeBreakpoints.fire({ changed: changed });
|
||||
}
|
||||
|
||||
public addFunctionBreakpoint(functionName: string, id: string): FunctionBreakpoint {
|
||||
const newFunctionBreakpoint = new FunctionBreakpoint(functionName, true, null, id);
|
||||
public addFunctionBreakpoint(functionName: string, id: string): IFunctionBreakpoint {
|
||||
const newFunctionBreakpoint = new FunctionBreakpoint(functionName, true, undefined, undefined, undefined, id);
|
||||
this.functionBreakpoints.push(newFunctionBreakpoint);
|
||||
this._onDidChangeBreakpoints.fire({ added: [newFunctionBreakpoint] });
|
||||
|
||||
@@ -1082,11 +1140,7 @@ export class Model implements IModel {
|
||||
}
|
||||
|
||||
public sourceIsNotAvailable(uri: uri): void {
|
||||
this.processes.forEach(p => {
|
||||
if (p.sources.has(uri.toString())) {
|
||||
p.sources.get(uri.toString()).available = false;
|
||||
}
|
||||
});
|
||||
this.processes.forEach(p => p.setNotAvailable(uri));
|
||||
this._onDidChangeCallStack.fire();
|
||||
}
|
||||
|
||||
|
||||
@@ -82,6 +82,8 @@ declare module DebugProtocol {
|
||||
description?: string;
|
||||
/** The thread which was stopped. */
|
||||
threadId?: number;
|
||||
/** A value of true hints to the frontend that this event should not change the focus. */
|
||||
preserveFocusHint?: boolean;
|
||||
/** Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown in the UI. */
|
||||
text?: string;
|
||||
/** If allThreadsStopped is true, a debug adapter can announce that all threads have stopped.
|
||||
@@ -125,7 +127,7 @@ declare module DebugProtocol {
|
||||
// event: 'terminated';
|
||||
body?: {
|
||||
/** A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts the session.
|
||||
The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the launchRequest.
|
||||
The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch' and 'attach' requests.
|
||||
*/
|
||||
restart?: any;
|
||||
};
|
||||
@@ -295,6 +297,8 @@ declare module DebugProtocol {
|
||||
export interface InitializeRequestArguments {
|
||||
/** The ID of the (frontend) client using this adapter. */
|
||||
clientID?: string;
|
||||
/** The human readable name of the (frontend) client using this adapter. */
|
||||
clientName?: string;
|
||||
/** The ID of the debug adapter. */
|
||||
adapterID: string;
|
||||
/** The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH. */
|
||||
@@ -345,10 +349,15 @@ declare module DebugProtocol {
|
||||
arguments: LaunchRequestArguments;
|
||||
}
|
||||
|
||||
/** Arguments for 'launch' request. */
|
||||
/** Arguments for 'launch' request. Additional attributes are implementation specific. */
|
||||
export interface LaunchRequestArguments {
|
||||
/** If noDebug is true the launch request should launch the program without enabling debugging. */
|
||||
noDebug?: boolean;
|
||||
/** Optional data from the previous, restarted session.
|
||||
The data is sent as the 'restart' attribute of the 'terminated' event.
|
||||
The client should leave the data intact.
|
||||
*/
|
||||
__restart?: any;
|
||||
}
|
||||
|
||||
/** Response to 'launch' request. This is just an acknowledgement, so no body field is required. */
|
||||
@@ -361,10 +370,13 @@ declare module DebugProtocol {
|
||||
arguments: AttachRequestArguments;
|
||||
}
|
||||
|
||||
/** Arguments for 'attach' request.
|
||||
The attach request has no standardized attributes.
|
||||
*/
|
||||
/** Arguments for 'attach' request. Additional attributes are implementation specific. */
|
||||
export interface AttachRequestArguments {
|
||||
/** Optional data from the previous, restarted session.
|
||||
The data is sent as the 'restart' attribute of the 'terminated' event.
|
||||
The client should leave the data intact.
|
||||
*/
|
||||
__restart?: any;
|
||||
}
|
||||
|
||||
/** Response to 'attach' request. This is just an acknowledgement, so no body field is required. */
|
||||
@@ -588,7 +600,7 @@ declare module DebugProtocol {
|
||||
|
||||
/** Arguments for 'stepBack' request. */
|
||||
export interface StepBackArguments {
|
||||
/** Exceute 'stepBack' for this thread. */
|
||||
/** Execute 'stepBack' for this thread. */
|
||||
threadId: number;
|
||||
}
|
||||
|
||||
@@ -606,7 +618,7 @@ declare module DebugProtocol {
|
||||
|
||||
/** Arguments for 'reverseContinue' request. */
|
||||
export interface ReverseContinueArguments {
|
||||
/** Exceute 'reverseContinue' for this thread. */
|
||||
/** Execute 'reverseContinue' for this thread. */
|
||||
threadId: number;
|
||||
}
|
||||
|
||||
@@ -839,6 +851,24 @@ declare module DebugProtocol {
|
||||
};
|
||||
}
|
||||
|
||||
/** Terminate thread request; value of command field is 'terminateThreads'.
|
||||
The request terminates the threads with the given ids.
|
||||
*/
|
||||
export interface TerminateThreadsRequest extends Request {
|
||||
// command: 'terminateThreads';
|
||||
arguments: TerminateThreadsArguments;
|
||||
}
|
||||
|
||||
/** Arguments for 'terminateThreads' request. */
|
||||
export interface TerminateThreadsArguments {
|
||||
/** Ids of threads to be terminated. */
|
||||
threadIds?: number[];
|
||||
}
|
||||
|
||||
/** Response to 'terminateThreads' request. This is just an acknowledgement, so no body field is required. */
|
||||
export interface TerminateThreadsResponse extends Response {
|
||||
}
|
||||
|
||||
/** Modules can be retrieved from the debug adapter with the ModulesRequest which can either return all modules or a range of modules to support paging. */
|
||||
export interface ModulesRequest extends Request {
|
||||
// command: 'modules';
|
||||
@@ -932,6 +962,49 @@ declare module DebugProtocol {
|
||||
};
|
||||
}
|
||||
|
||||
/** SetExpression request; value of command field is 'setExpression'.
|
||||
Evaluates the given 'value' expression and assigns it to the 'expression' which must be a modifiable l-value.
|
||||
The expressions have access to any variables and arguments that are in scope of the specified frame.
|
||||
*/
|
||||
export interface SetExpressionRequest extends Request {
|
||||
// command: 'setExpression';
|
||||
arguments: SetExpressionArguments;
|
||||
}
|
||||
|
||||
/** Arguments for 'setExpression' request. */
|
||||
export interface SetExpressionArguments {
|
||||
/** The l-value expression to assign to. */
|
||||
expression: string;
|
||||
/** The value expression to assign to the l-value expression. */
|
||||
value: string;
|
||||
/** Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope. */
|
||||
frameId?: number;
|
||||
/** Specifies how the resulting value should be formatted. */
|
||||
format?: ValueFormat;
|
||||
}
|
||||
|
||||
/** Response to 'setExpression' request. */
|
||||
export interface SetExpressionResponse extends Response {
|
||||
body: {
|
||||
/** The new value of the expression. */
|
||||
value: string;
|
||||
/** The optional type of the value. */
|
||||
type?: string;
|
||||
/** Properties of a value that can be used to determine how to render the result in the UI. */
|
||||
presentationHint?: VariablePresentationHint;
|
||||
/** If variablesReference is > 0, the value is structured and its children can be retrieved by passing variablesReference to the VariablesRequest. */
|
||||
variablesReference?: number;
|
||||
/** The number of named child variables.
|
||||
The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
|
||||
*/
|
||||
namedVariables?: number;
|
||||
/** The number of indexed child variables.
|
||||
The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
|
||||
*/
|
||||
indexedVariables?: number;
|
||||
};
|
||||
}
|
||||
|
||||
/** StepInTargets request; value of command field is 'stepInTargets'.
|
||||
This request retrieves the possible stepIn targets for the specified stack frame.
|
||||
These targets can be used in the 'stepIn' request.
|
||||
@@ -1043,7 +1116,7 @@ declare module DebugProtocol {
|
||||
|
||||
/** Information about the capabilities of a debug adapter. */
|
||||
export interface Capabilities {
|
||||
/** The debug adapter supports the configurationDoneRequest. */
|
||||
/** The debug adapter supports the 'configurationDone' request. */
|
||||
supportsConfigurationDoneRequest?: boolean;
|
||||
/** The debug adapter supports function breakpoints. */
|
||||
supportsFunctionBreakpoints?: boolean;
|
||||
@@ -1055,31 +1128,31 @@ declare module DebugProtocol {
|
||||
supportsEvaluateForHovers?: boolean;
|
||||
/** Available filters or options for the setExceptionBreakpoints request. */
|
||||
exceptionBreakpointFilters?: ExceptionBreakpointsFilter[];
|
||||
/** The debug adapter supports stepping back via the stepBack and reverseContinue requests. */
|
||||
/** The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests. */
|
||||
supportsStepBack?: boolean;
|
||||
/** The debug adapter supports setting a variable to a value. */
|
||||
supportsSetVariable?: boolean;
|
||||
/** The debug adapter supports restarting a frame. */
|
||||
supportsRestartFrame?: boolean;
|
||||
/** The debug adapter supports the gotoTargetsRequest. */
|
||||
/** The debug adapter supports the 'gotoTargets' request. */
|
||||
supportsGotoTargetsRequest?: boolean;
|
||||
/** The debug adapter supports the stepInTargetsRequest. */
|
||||
/** The debug adapter supports the 'stepInTargets' request. */
|
||||
supportsStepInTargetsRequest?: boolean;
|
||||
/** The debug adapter supports the completionsRequest. */
|
||||
/** The debug adapter supports the 'completions' request. */
|
||||
supportsCompletionsRequest?: boolean;
|
||||
/** The debug adapter supports the modules request. */
|
||||
/** The debug adapter supports the 'modules' request. */
|
||||
supportsModulesRequest?: boolean;
|
||||
/** The set of additional module information exposed by the debug adapter. */
|
||||
additionalModuleColumns?: ColumnDescriptor[];
|
||||
/** Checksum algorithms supported by the debug adapter. */
|
||||
supportedChecksumAlgorithms?: ChecksumAlgorithm[];
|
||||
/** The debug adapter supports the RestartRequest. In this case a client should not implement 'restart' by terminating and relaunching the adapter but by calling the RestartRequest. */
|
||||
/** The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by terminating and relaunching the adapter but by calling the RestartRequest. */
|
||||
supportsRestartRequest?: boolean;
|
||||
/** The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request. */
|
||||
supportsExceptionOptions?: boolean;
|
||||
/** The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and evaluateRequest. */
|
||||
supportsValueFormattingOptions?: boolean;
|
||||
/** The debug adapter supports the exceptionInfo request. */
|
||||
/** The debug adapter supports the 'exceptionInfo' request. */
|
||||
supportsExceptionInfoRequest?: boolean;
|
||||
/** The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request. */
|
||||
supportTerminateDebuggee?: boolean;
|
||||
@@ -1089,6 +1162,10 @@ declare module DebugProtocol {
|
||||
supportsLoadedSourcesRequest?: boolean;
|
||||
/** The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint. */
|
||||
supportsLogPoints?: boolean;
|
||||
/** The debug adapter supports the 'terminateThreads' request. */
|
||||
supportsTerminateThreadsRequest?: boolean;
|
||||
/** The debug adapter supports the 'setExpression' request. */
|
||||
supportsSetExpression?: boolean;
|
||||
}
|
||||
|
||||
/** An ExceptionBreakpointsFilter is shown in the UI as an option for configuring how exceptions are dealt with. */
|
||||
|
||||
@@ -15,6 +15,20 @@ import { Schemas } from 'vs/base/common/network';
|
||||
|
||||
const UNKNOWN_SOURCE_LABEL = nls.localize('unknownSource', "Unknown Source");
|
||||
|
||||
/**
|
||||
* Debug URI format
|
||||
*
|
||||
* a debug URI represents a Source object and the debug session where the Source comes from.
|
||||
*
|
||||
* debug:arbitrary_path?session=123e4567-e89b-12d3-a456-426655440000&ref=1016
|
||||
* \___/ \____________/ \__________________________________________/ \______/
|
||||
* | | | |
|
||||
* scheme source.path session id source.reference
|
||||
*
|
||||
* the arbitrary_path and the session id are encoded with 'encodeURIComponent'
|
||||
*
|
||||
*/
|
||||
|
||||
export class Source {
|
||||
|
||||
public readonly uri: uri;
|
||||
@@ -30,8 +44,9 @@ export class Source {
|
||||
this.uri = uri.parse(`${DEBUG_SCHEME}:${encodeURIComponent(path)}?session=${encodeURIComponent(sessionId)}&ref=${this.raw.sourceReference}`);
|
||||
} else {
|
||||
if (paths.isAbsolute(path)) {
|
||||
this.uri = uri.file(path); // path should better be absolute!
|
||||
this.uri = uri.file(path);
|
||||
} else {
|
||||
// assume that path is a URI
|
||||
this.uri = uri.parse(path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import Event, { Emitter } from 'vs/base/common/event';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IProcess, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||
|
||||
@@ -14,9 +14,9 @@ export class ViewModel implements IViewModel {
|
||||
private _focusedThread: IThread;
|
||||
private selectedExpression: IExpression;
|
||||
private selectedFunctionBreakpoint: IFunctionBreakpoint;
|
||||
private _onDidFocusProcess: Emitter<IProcess | undefined>;
|
||||
private _onDidFocusStackFrame: Emitter<{ stackFrame: IStackFrame, explicit: boolean }>;
|
||||
private _onDidSelectExpression: Emitter<IExpression>;
|
||||
private readonly _onDidFocusProcess: Emitter<IProcess | undefined>;
|
||||
private readonly _onDidFocusStackFrame: Emitter<{ stackFrame: IStackFrame, explicit: boolean }>;
|
||||
private readonly _onDidSelectExpression: Emitter<IExpression>;
|
||||
private multiProcessView: boolean;
|
||||
private expressionSelectedContextKey: IContextKey<boolean>;
|
||||
private breakpointSelectedContextKey: IContextKey<boolean>;
|
||||
|
||||
@@ -0,0 +1,336 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import 'vs/css!../browser/media/breakpointWidget';
|
||||
import * as nls from 'vs/nls';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
||||
import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox';
|
||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
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, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, CONTEXT_IN_BREAKPOINT_WIDGET } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { SimpleDebugEditor } from 'vs/workbench/parts/debug/electron-browser/simpleDebugEditor';
|
||||
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';
|
||||
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
import uri from 'vs/base/common/uri';
|
||||
import { SuggestRegistry, ISuggestResult, SuggestContext } from 'vs/editor/common/modes';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { wireCancellationToken } from 'vs/base/common/async';
|
||||
import { provideSuggestionItems } from 'vs/editor/contrib/suggest/suggest';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
|
||||
import { transparent, editorForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
|
||||
import { IDecorationOptions } from 'vs/editor/common/editorCommon';
|
||||
|
||||
const $ = dom.$;
|
||||
const IPrivateBreakopintWidgetService = createDecorator<IPrivateBreakopintWidgetService>('privateBreakopintWidgetService');
|
||||
export interface IPrivateBreakopintWidgetService {
|
||||
_serviceBrand: any;
|
||||
close(success: boolean): void;
|
||||
}
|
||||
const DECORATION_KEY = 'breakpointwidgetdecoration';
|
||||
|
||||
export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWidgetService {
|
||||
public _serviceBrand: any;
|
||||
|
||||
private selectContainer: HTMLElement;
|
||||
private input: SimpleDebugEditor;
|
||||
private toDispose: lifecycle.IDisposable[];
|
||||
private conditionInput = '';
|
||||
private hitCountInput = '';
|
||||
private logMessageInput = '';
|
||||
private breakpoint: IBreakpoint;
|
||||
|
||||
constructor(editor: ICodeEditor, private lineNumber: number, private context: Context,
|
||||
@IContextViewService private contextViewService: IContextViewService,
|
||||
@IDebugService private debugService: IDebugService,
|
||||
@IThemeService private themeService: IThemeService,
|
||||
@IContextKeyService private contextKeyService: IContextKeyService,
|
||||
@IInstantiationService private instantiationService: IInstantiationService,
|
||||
@IModelService private modelService: IModelService,
|
||||
@ICodeEditorService private codeEditorService: ICodeEditorService,
|
||||
) {
|
||||
super(editor, { showFrame: true, showArrow: false, frameWidth: 1 });
|
||||
|
||||
this.toDispose = [];
|
||||
const uri = this.editor.getModel().uri;
|
||||
this.breakpoint = this.debugService.getModel().getBreakpoints().filter(bp => bp.lineNumber === this.lineNumber && bp.uri.toString() === uri.toString()).pop();
|
||||
|
||||
if (this.context === undefined) {
|
||||
if (this.breakpoint && !this.breakpoint.condition && !this.breakpoint.hitCondition && this.breakpoint.logMessage) {
|
||||
this.context = Context.LOG_MESSAGE;
|
||||
} else if (this.breakpoint && !this.breakpoint.condition && this.breakpoint.hitCondition) {
|
||||
this.context = Context.HIT_COUNT;
|
||||
} else {
|
||||
this.context = Context.CONDITION;
|
||||
}
|
||||
}
|
||||
|
||||
this.toDispose.push(this.debugService.getModel().onDidChangeBreakpoints(e => {
|
||||
if (this.breakpoint && e && e.removed && e.removed.indexOf(this.breakpoint) >= 0) {
|
||||
this.dispose();
|
||||
}
|
||||
}));
|
||||
this.codeEditorService.registerDecorationType(DECORATION_KEY, {});
|
||||
|
||||
this.create();
|
||||
}
|
||||
|
||||
private get placeholder(): string {
|
||||
switch (this.context) {
|
||||
case Context.LOG_MESSAGE:
|
||||
return nls.localize('breakpointWidgetLogMessagePlaceholder', "Message to log when breakpoint is hit. Expressions within {} are interpolated. 'Enter' to accept, 'esc' to cancel.");
|
||||
case Context.HIT_COUNT:
|
||||
return nls.localize('breakpointWidgetHitCountPlaceholder', "Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel.");
|
||||
default:
|
||||
return nls.localize('breakpointWidgetExpressionPlaceholder', "Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel.");
|
||||
}
|
||||
}
|
||||
|
||||
private getInputValue(breakpoint: IBreakpoint): string {
|
||||
switch (this.context) {
|
||||
case Context.LOG_MESSAGE:
|
||||
return breakpoint && breakpoint.logMessage ? breakpoint.logMessage : this.logMessageInput;
|
||||
case Context.HIT_COUNT:
|
||||
return breakpoint && breakpoint.hitCondition ? breakpoint.hitCondition : this.hitCountInput;
|
||||
default:
|
||||
return breakpoint && breakpoint.condition ? breakpoint.condition : this.conditionInput;
|
||||
}
|
||||
}
|
||||
|
||||
private rememberInput(): void {
|
||||
const value = this.input.getModel().getValue();
|
||||
switch (this.context) {
|
||||
case Context.LOG_MESSAGE:
|
||||
this.logMessageInput = value;
|
||||
break;
|
||||
case Context.HIT_COUNT:
|
||||
this.hitCountInput = value;
|
||||
break;
|
||||
default:
|
||||
this.conditionInput = value;
|
||||
}
|
||||
}
|
||||
|
||||
protected _fillContainer(container: HTMLElement): void {
|
||||
this.setCssClass('breakpoint-widget');
|
||||
const selectBox = new SelectBox([nls.localize('expression', "Expression"), nls.localize('hitCount', "Hit Count"), nls.localize('logMessage', "Log Message")], this.context, this.contextViewService);
|
||||
this.toDispose.push(attachSelectBoxStyler(selectBox, this.themeService));
|
||||
this.selectContainer = $('.breakpoint-select-container');
|
||||
selectBox.render(dom.append(container, this.selectContainer));
|
||||
selectBox.onDidSelect(e => {
|
||||
this.rememberInput();
|
||||
this.context = e.index;
|
||||
|
||||
const value = this.getInputValue(this.breakpoint);
|
||||
this.input.getModel().setValue(value);
|
||||
});
|
||||
|
||||
this.createBreakpointInput(dom.append(container, $('.inputContainer')));
|
||||
|
||||
this.input.getModel().setValue(this.getInputValue(this.breakpoint));
|
||||
this.input.setPosition({ lineNumber: 1, column: this.input.getModel().getLineMaxColumn(1) });
|
||||
// Due to an electron bug we have to do the timeout, otherwise we do not get focus
|
||||
setTimeout(() => this.input.focus(), 100);
|
||||
}
|
||||
|
||||
public close(success: boolean): void {
|
||||
if (success) {
|
||||
// if there is already a breakpoint on this location - remove it.
|
||||
|
||||
let condition = this.breakpoint && this.breakpoint.condition;
|
||||
let hitCondition = this.breakpoint && this.breakpoint.hitCondition;
|
||||
let logMessage = this.breakpoint && this.breakpoint.logMessage;
|
||||
this.rememberInput();
|
||||
|
||||
if (this.conditionInput || this.context === Context.CONDITION) {
|
||||
condition = this.conditionInput;
|
||||
}
|
||||
if (this.hitCountInput || this.context === Context.HIT_COUNT) {
|
||||
hitCondition = this.hitCountInput;
|
||||
}
|
||||
if (this.logMessageInput || this.context === Context.LOG_MESSAGE) {
|
||||
logMessage = this.logMessageInput;
|
||||
}
|
||||
|
||||
if (this.breakpoint) {
|
||||
this.debugService.updateBreakpoints(this.breakpoint.uri, {
|
||||
[this.breakpoint.getId()]: {
|
||||
condition,
|
||||
hitCondition,
|
||||
verified: this.breakpoint.verified,
|
||||
column: this.breakpoint.column,
|
||||
logMessage
|
||||
}
|
||||
}, false);
|
||||
} else {
|
||||
this.debugService.addBreakpoints(this.editor.getModel().uri, [{
|
||||
lineNumber: this.lineNumber,
|
||||
enabled: true,
|
||||
condition,
|
||||
hitCondition,
|
||||
logMessage
|
||||
}]).done(null, errors.onUnexpectedError);
|
||||
}
|
||||
}
|
||||
|
||||
this.dispose();
|
||||
}
|
||||
|
||||
protected _doLayout(heightInPixel: number, widthInPixel: number): void {
|
||||
this.input.layout({ height: 18, width: widthInPixel - 113 });
|
||||
}
|
||||
|
||||
private createBreakpointInput(container: HTMLElement): void {
|
||||
const scopedContextKeyService = this.contextKeyService.createScoped(container);
|
||||
this.toDispose.push(scopedContextKeyService);
|
||||
|
||||
const scopedInstatiationService = this.instantiationService.createChild(new ServiceCollection(
|
||||
[IContextKeyService, scopedContextKeyService], [IPrivateBreakopintWidgetService, this]));
|
||||
|
||||
const options = SimpleDebugEditor.getEditorOptions();
|
||||
this.input = scopedInstatiationService.createInstance(SimpleDebugEditor, container, options);
|
||||
CONTEXT_IN_BREAKPOINT_WIDGET.bindTo(scopedContextKeyService).set(true);
|
||||
const model = this.modelService.createModel('', null, uri.parse(`${DEBUG_SCHEME}:breakpointinput`), true);
|
||||
this.input.setModel(model);
|
||||
this.toDispose.push(model);
|
||||
const setDecorations = () => {
|
||||
const value = this.input.getModel().getValue();
|
||||
const decorations = !!value ? [] : this.createDecorations();
|
||||
this.input.setDecorations(DECORATION_KEY, decorations);
|
||||
};
|
||||
this.input.getModel().onDidChangeContent(() => setDecorations());
|
||||
this.themeService.onThemeChange(() => setDecorations());
|
||||
|
||||
this.toDispose.push(SuggestRegistry.register({ scheme: DEBUG_SCHEME, hasAccessToAllModels: true }, {
|
||||
provideCompletionItems: (model: ITextModel, position: Position, _context: SuggestContext, token: CancellationToken): Thenable<ISuggestResult> => {
|
||||
let suggestionsPromise: TPromise<ISuggestResult>;
|
||||
if (this.context === Context.CONDITION || this.context === Context.LOG_MESSAGE && this.isCurlyBracketOpen()) {
|
||||
suggestionsPromise = provideSuggestionItems(this.editor.getModel(), new Position(this.lineNumber, 1), 'none', undefined, _context).then(suggestions => {
|
||||
|
||||
let overwriteBefore = 0;
|
||||
if (this.context === Context.CONDITION) {
|
||||
overwriteBefore = position.column - 1;
|
||||
} else {
|
||||
// Inside the currly brackets, need to count how many useful characters are behind the position so they would all be taken into account
|
||||
const value = this.input.getModel().getValue();
|
||||
while ((position.column - 2 - overwriteBefore >= 0) && value[position.column - 2 - overwriteBefore] !== '{' && value[position.column - 2 - overwriteBefore] !== ' ') {
|
||||
overwriteBefore++;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
suggestions: suggestions.map(s => {
|
||||
s.suggestion.overwriteAfter = 0;
|
||||
s.suggestion.overwriteBefore = overwriteBefore;
|
||||
return s.suggestion;
|
||||
})
|
||||
};
|
||||
});
|
||||
} else {
|
||||
suggestionsPromise = TPromise.as({ suggestions: [] });
|
||||
}
|
||||
|
||||
return wireCancellationToken(token, suggestionsPromise);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private createDecorations(): IDecorationOptions[] {
|
||||
return [{
|
||||
range: {
|
||||
startLineNumber: 0,
|
||||
endLineNumber: 0,
|
||||
startColumn: 0,
|
||||
endColumn: 1
|
||||
},
|
||||
renderOptions: {
|
||||
after: {
|
||||
contentText: this.placeholder,
|
||||
color: transparent(editorForeground, 0.4)(this.themeService.getTheme()).toString()
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
private isCurlyBracketOpen(): boolean {
|
||||
const value = this.input.getModel().getValue();
|
||||
for (let i = this.input.getPosition().column - 2; i >= 0; i--) {
|
||||
if (value[i] === '{') {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (value[i] === '}') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
super.dispose();
|
||||
this.input.dispose();
|
||||
lifecycle.dispose(this.toDispose);
|
||||
setTimeout(() => this.editor.focus(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
class AcceptBreakpointWidgetInputAction extends EditorCommand {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'breakpointWidget.action.acceptInput',
|
||||
precondition: CONTEXT_BREAKPOINT_WIDGET_VISIBLE,
|
||||
kbOpts: {
|
||||
kbExpr: CONTEXT_IN_BREAKPOINT_WIDGET,
|
||||
primary: KeyCode.Enter
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor): void {
|
||||
accessor.get(IPrivateBreakopintWidgetService).close(true);
|
||||
}
|
||||
}
|
||||
|
||||
class CloseBreakpointWidgetCommand extends EditorCommand {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'closeBreakpointWidget',
|
||||
precondition: CONTEXT_BREAKPOINT_WIDGET_VISIBLE,
|
||||
kbOpts: {
|
||||
kbExpr: EditorContextKeys.textInputFocus,
|
||||
primary: KeyCode.Escape,
|
||||
secondary: [KeyMod.Shift | KeyCode.Escape]
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void {
|
||||
const debugContribution = editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID);
|
||||
if (debugContribution) {
|
||||
// if focus is in outer editor we need to use the debug contribution to close
|
||||
return debugContribution.closeBreakpointWidget();
|
||||
}
|
||||
|
||||
accessor.get(IPrivateBreakopintWidgetService).close(false);
|
||||
}
|
||||
}
|
||||
|
||||
registerEditorCommand(new AcceptBreakpointWidgetInputAction());
|
||||
registerEditorCommand(new CloseBreakpointWidgetCommand());
|
||||
@@ -18,7 +18,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { BaseDebugController, twistiePixels, renderViewTree } from 'vs/workbench/parts/debug/browser/baseDebugView';
|
||||
import { ITree, IActionProvider, IDataSource, IRenderer, IAccessibilityProvider } from 'vs/base/parts/tree/browser/tree';
|
||||
import { IAction, IActionItem } from 'vs/base/common/actions';
|
||||
import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction } from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction, TerminateThreadAction } from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { CopyStackTraceAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
@@ -27,6 +27,7 @@ import { basenameOrAuthority } from 'vs/base/common/resources';
|
||||
import { TreeResourceNavigator, WorkbenchTree } from 'vs/platform/list/browser/listService';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
|
||||
const $ = dom.$;
|
||||
|
||||
@@ -268,6 +269,9 @@ class CallStackActionProvider implements IActionProvider {
|
||||
} else {
|
||||
actions.push(new PauseAction(PauseAction.ID, PauseAction.LABEL, this.debugService, this.keybindingService));
|
||||
}
|
||||
|
||||
actions.push(new Separator());
|
||||
actions.push(new TerminateThreadAction(TerminateThreadAction.ID, TerminateThreadAction.LABEL, this.debugService, this.keybindingService));
|
||||
} else if (element instanceof StackFrame) {
|
||||
if (element.thread.process.session.capabilities.supportsRestartFrame) {
|
||||
actions.push(new RestartFrameAction(RestartFrameAction.ID, RestartFrameAction.LABEL, this.debugService, this.keybindingService));
|
||||
@@ -523,7 +527,7 @@ class CallStackRenderer implements IRenderer {
|
||||
|
||||
class CallstackAccessibilityProvider implements IAccessibilityProvider {
|
||||
|
||||
constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) {
|
||||
constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService) {
|
||||
// noop
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
|
||||
import { DebugEditorModelManager } from 'vs/workbench/parts/debug/browser/debugEditorModelManager';
|
||||
import {
|
||||
StepOverAction, ClearReplAction, FocusReplAction, StepIntoAction, StepOutAction, StartAction, RestartAction, ContinueAction, StopAction, DisconnectAction, PauseAction, AddFunctionBreakpointAction,
|
||||
ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction
|
||||
ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction, TerminateThreadAction
|
||||
} from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { DebugActionsWidget } from 'vs/workbench/parts/debug/browser/debugActionsWidget';
|
||||
import * as service from 'vs/workbench/parts/debug/electron-browser/debugService';
|
||||
@@ -86,7 +86,7 @@ Registry.as<ViewletRegistry>(ViewletExtensions.Viewlets).registerViewlet(new Vie
|
||||
VIEWLET_ID,
|
||||
nls.localize('debug', "Debug"),
|
||||
'debug',
|
||||
40
|
||||
3
|
||||
));
|
||||
|
||||
const openViewletKb: IKeybindings = {
|
||||
@@ -134,6 +134,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(StopAction, StopAction
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(DisconnectAction, DisconnectAction.ID, DisconnectAction.LABEL), 'Debug: Disconnect', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(ContinueAction, ContinueAction.ID, ContinueAction.LABEL, { primary: KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Continue', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(PauseAction, PauseAction.ID, PauseAction.LABEL, { primary: KeyCode.F6 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Pause', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(TerminateThreadAction, TerminateThreadAction.ID, TerminateThreadAction.LABEL, undefined, CONTEXT_IN_DEBUG_MODE), 'Debug: Terminate Thread', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL), 'Debug: Open launch.json', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(AddFunctionBreakpointAction, AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL), 'Debug: Add Function Breakpoint', debugCategory);
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(ReapplyBreakpointsAction, ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL), 'Debug: Reapply All Breakpoints', debugCategory);
|
||||
@@ -151,7 +152,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(FocusBreakpointsViewAc
|
||||
|
||||
|
||||
// Register Quick Open
|
||||
(<IQuickOpenRegistry>Registry.as(QuickOpenExtensions.Quickopen)).registerQuickOpenHandler(
|
||||
(Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen)).registerQuickOpenHandler(
|
||||
new QuickOpenHandlerDescriptor(
|
||||
DebugQuickOpenHandler,
|
||||
DebugQuickOpenHandler.ID,
|
||||
@@ -204,6 +205,11 @@ configurationRegistry.registerConfiguration({
|
||||
default: 'openOnFirstSessionStart',
|
||||
description: nls.localize('openDebug', "Controls whether debug view should be open on debugging session start.")
|
||||
},
|
||||
'debug.enableAllHovers': {
|
||||
type: 'boolean',
|
||||
description: nls.localize({ comment: ['This is the description for a setting'], key: 'enableAllHovers' }, "Controls if the non debug hovers should be enabled while debugging. If true the hover providers will be called to provide a hover. Regular hovers will not be shown even if this setting is true."),
|
||||
default: false
|
||||
},
|
||||
'launch': {
|
||||
type: 'object',
|
||||
description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"),
|
||||
|
||||
@@ -5,11 +5,9 @@
|
||||
|
||||
import * as nls from 'vs/nls';
|
||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import Event, { Emitter } from 'vs/base/common/event';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import { first } from 'vs/base/common/arrays';
|
||||
import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform';
|
||||
import * as objects from 'vs/base/common/objects';
|
||||
import uri from 'vs/base/common/uri';
|
||||
import * as paths from 'vs/base/common/paths';
|
||||
@@ -27,17 +25,18 @@ import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IDebugConfigurationProvider, IRawAdapter, ICompound, IDebugConfiguration, IConfig, IEnvConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { Adapter } from 'vs/workbench/parts/debug/node/debugAdapter';
|
||||
import { IDebugConfigurationProvider, IDebuggerContribution, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable, IDebugAdapterProvider, IDebugAdapter, ITerminalSettings, ITerminalLauncher } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { Debugger } from 'vs/workbench/parts/debug/node/debugger';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen';
|
||||
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
|
||||
import { isCodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration';
|
||||
import { IPreferencesService } from 'vs/workbench/parts/preferences/common/preferences';
|
||||
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
|
||||
import { TerminalLauncher } from 'vs/workbench/parts/debug/electron-browser/terminalSupport';
|
||||
|
||||
// debuggers extension point
|
||||
export const debuggersExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint<IRawAdapter[]>('debuggers', [], {
|
||||
export const debuggersExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint<IDebuggerContribution[]>('debuggers', [], {
|
||||
description: nls.localize('vscode.extension.contributes.debuggers', 'Contributes debug adapters.'),
|
||||
type: 'array',
|
||||
defaultSnippets: [{ body: [{ type: '', extensions: [] }] }],
|
||||
@@ -216,13 +215,13 @@ const schema: IJSONSchema = {
|
||||
}
|
||||
};
|
||||
|
||||
const jsonRegistry = <IJSONContributionRegistry>Registry.as(JSONExtensions.JSONContribution);
|
||||
const jsonRegistry = Registry.as<IJSONContributionRegistry>(JSONExtensions.JSONContribution);
|
||||
jsonRegistry.registerSchema(launchSchemaId, schema);
|
||||
const DEBUG_SELECTED_CONFIG_NAME_KEY = 'debug.selectedconfigname';
|
||||
const DEBUG_SELECTED_ROOT = 'debug.selectedroot';
|
||||
|
||||
export class ConfigurationManager implements IConfigurationManager {
|
||||
private adapters: Adapter[];
|
||||
private debuggers: Debugger[];
|
||||
private breakpointModeIdsSet = new Set<string>();
|
||||
private launches: ILaunch[];
|
||||
private selectedName: string;
|
||||
@@ -230,6 +229,9 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
private toDispose: IDisposable[];
|
||||
private _onDidSelectConfigurationName = new Emitter<void>();
|
||||
private providers: IDebugConfigurationProvider[];
|
||||
private debugAdapterProviders: Map<string, IDebugAdapterProvider>;
|
||||
private terminalLauncher: ITerminalLauncher;
|
||||
|
||||
|
||||
constructor(
|
||||
@IWorkspaceContextService private contextService: IWorkspaceContextService,
|
||||
@@ -240,16 +242,20 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
@ICommandService private commandService: ICommandService,
|
||||
@IStorageService private storageService: IStorageService,
|
||||
@ILifecycleService lifecycleService: ILifecycleService,
|
||||
@IExtensionService private extensionService: IExtensionService
|
||||
@IExtensionService private extensionService: IExtensionService,
|
||||
@IConfigurationResolverService private configurationResolverService: IConfigurationResolverService
|
||||
) {
|
||||
this.providers = [];
|
||||
this.adapters = [];
|
||||
this.debuggers = [];
|
||||
this.toDispose = [];
|
||||
this.registerListeners(lifecycleService);
|
||||
this.initLaunches();
|
||||
const previousSelectedRoot = this.storageService.get(DEBUG_SELECTED_ROOT, StorageScope.WORKSPACE);
|
||||
const filtered = this.launches.filter(l => l.uri.toString() === previousSelectedRoot);
|
||||
this.selectConfiguration(filtered.length ? filtered[0] : undefined, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE));
|
||||
const previousSelectedLaunch = this.launches.filter(l => l.uri.toString() === previousSelectedRoot).pop();
|
||||
if (previousSelectedLaunch) {
|
||||
this.selectConfiguration(previousSelectedLaunch, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE));
|
||||
}
|
||||
this.debugAdapterProviders = new Map<string, IDebugAdapterProvider>();
|
||||
}
|
||||
|
||||
public registerDebugConfigurationProvider(handle: number, debugConfigurationProvider: IDebugConfigurationProvider): void {
|
||||
@@ -260,10 +266,10 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
debugConfigurationProvider.handle = handle;
|
||||
this.providers = this.providers.filter(p => p.handle !== handle);
|
||||
this.providers.push(debugConfigurationProvider);
|
||||
const adapter = this.getAdapter(debugConfigurationProvider.type);
|
||||
const dbg = this.getDebugger(debugConfigurationProvider.type);
|
||||
// Check if the provider contributes provideDebugConfigurations method
|
||||
if (adapter && debugConfigurationProvider.provideDebugConfigurations) {
|
||||
adapter.hasConfigurationProvider = true;
|
||||
if (dbg && debugConfigurationProvider.provideDebugConfigurations) {
|
||||
dbg.hasConfigurationProvider = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,19 +278,21 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
}
|
||||
|
||||
public resolveConfigurationByProviders(folderUri: uri | undefined, type: string | undefined, debugConfiguration: IConfig): TPromise<IConfig> {
|
||||
// pipe the config through the promises sequentially. append at the end the '*' types
|
||||
const providers = this.providers.filter(p => p.type === type && p.resolveDebugConfiguration)
|
||||
.concat(this.providers.filter(p => p.type === '*' && p.resolveDebugConfiguration));
|
||||
return this.extensionService.activateByEvent(`onDebugResolve:${type}`).then(() => {
|
||||
// pipe the config through the promises sequentially. append at the end the '*' types
|
||||
const providers = this.providers.filter(p => p.type === type && p.resolveDebugConfiguration)
|
||||
.concat(this.providers.filter(p => p.type === '*' && p.resolveDebugConfiguration));
|
||||
|
||||
return providers.reduce((promise, provider) => {
|
||||
return promise.then(config => {
|
||||
if (config) {
|
||||
return provider.resolveDebugConfiguration(folderUri, config);
|
||||
} else {
|
||||
return Promise.resolve(config);
|
||||
}
|
||||
});
|
||||
}, TPromise.as(debugConfiguration));
|
||||
return providers.reduce((promise, provider) => {
|
||||
return promise.then(config => {
|
||||
if (config) {
|
||||
return provider.resolveDebugConfiguration(folderUri, config);
|
||||
} else {
|
||||
return Promise.resolve(config);
|
||||
}
|
||||
});
|
||||
}, TPromise.as(debugConfiguration));
|
||||
});
|
||||
}
|
||||
|
||||
public provideDebugConfigurations(folderUri: uri | undefined, type: string): TPromise<any[]> {
|
||||
@@ -300,12 +308,53 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
return TPromise.as(undefined);
|
||||
}
|
||||
|
||||
public registerDebugAdapterProvider(debugTypes: string[], debugAdapterLauncher: IDebugAdapterProvider): IDisposable {
|
||||
debugTypes.forEach(debugType => this.debugAdapterProviders.set(debugType, debugAdapterLauncher));
|
||||
return {
|
||||
dispose: () => {
|
||||
debugTypes.forEach(debugType => this.debugAdapterProviders.delete(debugType));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private getDebugAdapterProvider(type: string): IDebugAdapterProvider | undefined {
|
||||
return this.debugAdapterProviders.get(type);
|
||||
}
|
||||
|
||||
public createDebugAdapter(debugType: string, adapterExecutable: IAdapterExecutable): IDebugAdapter | undefined {
|
||||
let dap = this.getDebugAdapterProvider(debugType);
|
||||
if (dap) {
|
||||
return dap.createDebugAdapter(debugType, adapterExecutable);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig> {
|
||||
let dap = this.getDebugAdapterProvider(debugType);
|
||||
if (dap) {
|
||||
return dap.substituteVariables(folder, config);
|
||||
}
|
||||
return TPromise.as(config);
|
||||
}
|
||||
|
||||
public runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void> {
|
||||
|
||||
let tl: ITerminalLauncher = this.getDebugAdapterProvider(debugType);
|
||||
if (!tl) {
|
||||
if (!this.terminalLauncher) {
|
||||
this.terminalLauncher = this.instantiationService.createInstance(TerminalLauncher);
|
||||
}
|
||||
tl = this.terminalLauncher;
|
||||
}
|
||||
return tl.runInTerminal(args, config);
|
||||
}
|
||||
|
||||
private registerListeners(lifecycleService: ILifecycleService): void {
|
||||
debuggersExtPoint.setHandler((extensions) => {
|
||||
extensions.forEach(extension => {
|
||||
extension.value.forEach(rawAdapter => {
|
||||
if (!rawAdapter.type || (typeof rawAdapter.type !== 'string')) {
|
||||
extension.collector.error(nls.localize('debugNoType', "Debug adapter 'type' can not be omitted and must be of type 'string'."));
|
||||
extension.collector.error(nls.localize('debugNoType', "Debugger 'type' can not be omitted and must be of type 'string'."));
|
||||
}
|
||||
if (rawAdapter.enableBreakpointsFor) {
|
||||
rawAdapter.enableBreakpointsFor.languageIds.forEach(modeId => {
|
||||
@@ -313,17 +362,17 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
});
|
||||
}
|
||||
|
||||
const duplicate = this.adapters.filter(a => a.type === rawAdapter.type).pop();
|
||||
const duplicate = this.getDebugger(rawAdapter.type);
|
||||
if (duplicate) {
|
||||
duplicate.merge(rawAdapter, extension.description);
|
||||
} else {
|
||||
this.adapters.push(new Adapter(this, rawAdapter, extension.description, this.configurationService, this.commandService));
|
||||
this.debuggers.push(new Debugger(this, rawAdapter, extension.description, this.configurationService, this.commandService, this.configurationResolverService));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// update the schema to include all attributes, snippets and types from extensions.
|
||||
this.adapters.forEach(adapter => {
|
||||
this.debuggers.forEach(adapter => {
|
||||
const items = (<IJSONSchema>schema.properties['configurations'].items);
|
||||
const schemaAttributes = adapter.getSchemaAttributes();
|
||||
if (schemaAttributes) {
|
||||
@@ -348,12 +397,12 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
|
||||
this.toDispose.push(this.contextService.onDidChangeWorkspaceFolders(() => {
|
||||
this.initLaunches();
|
||||
this.selectConfiguration();
|
||||
this.selectConfiguration(this.selectedLaunch);
|
||||
this.setCompoundSchemaValues();
|
||||
}));
|
||||
this.toDispose.push(this.configurationService.onDidChangeConfiguration(e => {
|
||||
if (e.affectsConfiguration('launch')) {
|
||||
this.selectConfiguration();
|
||||
this.selectConfiguration(this.selectedLaunch);
|
||||
this.setCompoundSchemaValues();
|
||||
}
|
||||
}));
|
||||
@@ -417,14 +466,10 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public selectConfiguration(launch?: ILaunch, name?: string, debugStarted?: boolean): void {
|
||||
public selectConfiguration(launch: ILaunch, name?: string): void {
|
||||
const previousLaunch = this.selectedLaunch;
|
||||
const previousName = this.selectedName;
|
||||
|
||||
if (!launch) {
|
||||
launch = this.selectedLaunch && this.selectedLaunch.getConfigurationNames().length ? this.selectedLaunch : first(this.launches, l => !!l.getConfigurationNames().length, this.launches.length ? this.launches[0] : undefined);
|
||||
}
|
||||
|
||||
this.selectedLaunch = launch;
|
||||
const names = launch ? launch.getConfigurationNames() : [];
|
||||
if (name && names.indexOf(name) >= 0) {
|
||||
@@ -452,25 +497,26 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
return this.breakpointModeIdsSet.has(modeId);
|
||||
}
|
||||
|
||||
public getAdapter(type: string): Adapter {
|
||||
return this.adapters.filter(adapter => strings.equalsIgnoreCase(adapter.type, type)).pop();
|
||||
public getDebugger(type: string): Debugger {
|
||||
return this.debuggers.filter(dbg => strings.equalsIgnoreCase(dbg.type, type)).pop();
|
||||
}
|
||||
|
||||
public guessAdapter(type?: string): TPromise<Adapter> {
|
||||
return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug').then(() => {
|
||||
public guessDebugger(type?: string): TPromise<Debugger> {
|
||||
return this.activateDebuggers().then(() => {
|
||||
|
||||
if (type) {
|
||||
const adapter = this.getAdapter(type);
|
||||
const adapter = this.getDebugger(type);
|
||||
return TPromise.as(adapter);
|
||||
}
|
||||
|
||||
const editor = this.editorService.getActiveEditor();
|
||||
let candidates: Adapter[];
|
||||
let candidates: Debugger[];
|
||||
if (editor) {
|
||||
const codeEditor = editor.getControl();
|
||||
if (isCodeEditor(codeEditor)) {
|
||||
const model = codeEditor.getModel();
|
||||
const language = model ? model.getLanguageIdentifier().language : undefined;
|
||||
const adapters = this.adapters.filter(a => a.languages && a.languages.indexOf(language) >= 0);
|
||||
const adapters = this.debuggers.filter(a => a.languages && a.languages.indexOf(language) >= 0);
|
||||
if (adapters.length === 1) {
|
||||
return TPromise.as(adapters[0]);
|
||||
}
|
||||
@@ -481,11 +527,11 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
}
|
||||
|
||||
if (!candidates) {
|
||||
candidates = this.adapters.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider);
|
||||
candidates = this.debuggers.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider);
|
||||
}
|
||||
return this.quickOpenService.pick([...candidates, { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") })
|
||||
.then(picked => {
|
||||
if (picked instanceof Adapter) {
|
||||
if (picked instanceof Debugger) {
|
||||
return picked;
|
||||
}
|
||||
if (picked) {
|
||||
@@ -493,7 +539,11 @@ export class ConfigurationManager implements IConfigurationManager {
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
public activateDebuggers(): TPromise<void> {
|
||||
return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug'));
|
||||
}
|
||||
|
||||
private store(): void {
|
||||
@@ -516,8 +566,7 @@ class Launch implements ILaunch {
|
||||
@IFileService private fileService: IFileService,
|
||||
@IWorkbenchEditorService protected editorService: IWorkbenchEditorService,
|
||||
@IConfigurationService protected configurationService: IConfigurationService,
|
||||
@IConfigurationResolverService private configurationResolverService: IConfigurationResolverService,
|
||||
@IWorkspaceContextService protected contextService: IWorkspaceContextService
|
||||
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
|
||||
) {
|
||||
// noop
|
||||
}
|
||||
@@ -574,93 +623,60 @@ class Launch implements ILaunch {
|
||||
return config.configurations.filter(config => config && config.name === name).shift();
|
||||
}
|
||||
|
||||
protected getWorkspaceForResolving(): IWorkspaceFolder {
|
||||
if (this.workspace) {
|
||||
return this.workspace;
|
||||
}
|
||||
|
||||
if (this.contextService.getWorkspace().folders.length === 1) {
|
||||
return this.contextService.getWorkspace().folders[0];
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public resolveConfiguration(config: IConfig): TPromise<IConfig> {
|
||||
const result = objects.deepClone(config) as IConfig;
|
||||
// Set operating system specific properties #1873
|
||||
const setOSProperties = (flag: boolean, osConfig: IEnvConfig) => {
|
||||
if (flag && osConfig) {
|
||||
Object.keys(osConfig).forEach(key => {
|
||||
result[key] = osConfig[key];
|
||||
});
|
||||
}
|
||||
};
|
||||
setOSProperties(isWindows, result.windows);
|
||||
setOSProperties(isMacintosh, result.osx);
|
||||
setOSProperties(isLinux, result.linux);
|
||||
|
||||
// massage configuration attributes - append workspace path to relatvie paths, substitute variables in paths.
|
||||
Object.keys(result).forEach(key => {
|
||||
result[key] = this.configurationResolverService.resolveAny(this.getWorkspaceForResolving(), result[key]);
|
||||
});
|
||||
|
||||
const adapter = this.configurationManager.getAdapter(result.type);
|
||||
return this.configurationResolverService.resolveInteractiveVariables(result, adapter ? adapter.variables : null);
|
||||
}
|
||||
|
||||
public openConfigFile(sideBySide: boolean, type?: string): TPromise<IEditor> {
|
||||
const resource = this.uri;
|
||||
let pinned = false;
|
||||
return this.configurationManager.activateDebuggers().then(() => {
|
||||
const resource = this.uri;
|
||||
let pinned = false;
|
||||
|
||||
return this.fileService.resolveContent(resource).then(content => content.value, err => {
|
||||
return this.fileService.resolveContent(resource).then(content => content.value, err => {
|
||||
|
||||
// launch.json not found: create one by collecting launch configs from debugConfigProviders
|
||||
// launch.json not found: create one by collecting launch configs from debugConfigProviders
|
||||
|
||||
return this.configurationManager.guessAdapter(type).then(adapter => {
|
||||
if (adapter) {
|
||||
return this.configurationManager.provideDebugConfigurations(this.workspace.uri, adapter.type).then(initialConfigs => {
|
||||
return adapter.getInitialConfigurationContent(initialConfigs);
|
||||
return this.configurationManager.guessDebugger(type).then(adapter => {
|
||||
if (adapter) {
|
||||
return this.configurationManager.provideDebugConfigurations(this.workspace.uri, adapter.type).then(initialConfigs => {
|
||||
return adapter.getInitialConfigurationContent(initialConfigs);
|
||||
});
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}).then(content => {
|
||||
|
||||
if (!content) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
pinned = true; // pin only if config file is created #8727
|
||||
return this.fileService.updateContent(resource, content).then(() => {
|
||||
// convert string into IContent; see #32135
|
||||
return content;
|
||||
});
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
}).then(content => {
|
||||
|
||||
if (!content) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
pinned = true; // pin only if config file is created #8727
|
||||
return this.fileService.updateContent(resource, content).then(() => {
|
||||
// convert string into IContent; see #32135
|
||||
return content;
|
||||
});
|
||||
});
|
||||
}).then(content => {
|
||||
if (!content) {
|
||||
return undefined;
|
||||
}
|
||||
const index = content.indexOf(`"${this.configurationManager.selectedConfiguration.name}"`);
|
||||
let startLineNumber = 1;
|
||||
for (let i = 0; i < index; i++) {
|
||||
if (content.charAt(i) === '\n') {
|
||||
startLineNumber++;
|
||||
const index = content.indexOf(`"${this.configurationManager.selectedConfiguration.name}"`);
|
||||
let startLineNumber = 1;
|
||||
for (let i = 0; i < index; i++) {
|
||||
if (content.charAt(i) === '\n') {
|
||||
startLineNumber++;
|
||||
}
|
||||
}
|
||||
}
|
||||
const selection = startLineNumber > 1 ? { startLineNumber, startColumn: 4 } : undefined;
|
||||
const selection = startLineNumber > 1 ? { startLineNumber, startColumn: 4 } : undefined;
|
||||
|
||||
return this.editorService.openEditor({
|
||||
resource: resource,
|
||||
options: {
|
||||
forceOpen: true,
|
||||
selection,
|
||||
pinned,
|
||||
revealIfVisible: true
|
||||
},
|
||||
}, sideBySide);
|
||||
}, (error) => {
|
||||
throw new Error(nls.localize('DebugConfig.failed', "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", error));
|
||||
return this.editorService.openEditor({
|
||||
resource: resource,
|
||||
options: {
|
||||
forceOpen: true,
|
||||
selection,
|
||||
pinned,
|
||||
revealIfVisible: true
|
||||
},
|
||||
}, sideBySide);
|
||||
}, (error) => {
|
||||
throw new Error(nls.localize('DebugConfig.failed', "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", error));
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -673,9 +689,9 @@ class WorkspaceLaunch extends Launch implements ILaunch {
|
||||
@IWorkbenchEditorService editorService: IWorkbenchEditorService,
|
||||
@IConfigurationService configurationService: IConfigurationService,
|
||||
@IConfigurationResolverService configurationResolverService: IConfigurationResolverService,
|
||||
@IWorkspaceContextService contextService: IWorkspaceContextService
|
||||
@IWorkspaceContextService contextService: IWorkspaceContextService,
|
||||
) {
|
||||
super(configurationManager, undefined, fileService, editorService, configurationService, configurationResolverService, contextService);
|
||||
super(configurationManager, undefined, fileService, editorService, configurationService, contextService);
|
||||
}
|
||||
|
||||
get uri(): uri {
|
||||
@@ -706,7 +722,7 @@ class UserLaunch extends Launch implements ILaunch {
|
||||
@IPreferencesService private preferencesService: IPreferencesService,
|
||||
@IWorkspaceContextService contextService: IWorkspaceContextService
|
||||
) {
|
||||
super(configurationManager, undefined, fileService, editorService, configurationService, configurationResolverService, contextService);
|
||||
super(configurationManager, undefined, fileService, editorService, configurationService, contextService);
|
||||
}
|
||||
|
||||
get uri(): uri {
|
||||
|
||||
@@ -11,6 +11,7 @@ import * as lifecycle from 'vs/base/common/lifecycle';
|
||||
import * as env from 'vs/base/common/platform';
|
||||
import uri from 'vs/base/common/uri';
|
||||
import { visit } from 'vs/base/common/json';
|
||||
import severity from 'vs/base/common/severity';
|
||||
import { Constants } from 'vs/editor/common/core/uint';
|
||||
import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
@@ -30,9 +31,9 @@ import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { DebugHoverWidget } from 'vs/workbench/parts/debug/electron-browser/debugHover';
|
||||
import { RemoveBreakpointAction, EditConditionalBreakpointAction, EnableBreakpointAction, DisableBreakpointAction, AddConditionalBreakpointAction } from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { IDebugEditorContribution, IDebugService, State, IBreakpoint, EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, IStackFrame, IDebugConfiguration, IExpression, IExceptionInfo } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { BreakpointWidget } from 'vs/workbench/parts/debug/browser/breakpointWidget';
|
||||
import { RemoveBreakpointAction } from 'vs/workbench/parts/debug/browser/debugActions';
|
||||
import { IDebugEditorContribution, IDebugService, State, IBreakpoint, EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, IStackFrame, IDebugConfiguration, IExpression, IExceptionInfo, BreakpointWidgetContext } from 'vs/workbench/parts/debug/common/debug';
|
||||
import { BreakpointWidget } from 'vs/workbench/parts/debug/electron-browser/breakpointWidget';
|
||||
import { ExceptionWidget } from 'vs/workbench/parts/debug/browser/exceptionWidget';
|
||||
import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
@@ -42,10 +43,12 @@ import { first } from 'vs/base/common/arrays';
|
||||
import { IMarginData } from 'vs/editor/browser/controller/mouseTarget';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { ContextSubMenu } from 'vs/base/browser/contextmenu';
|
||||
import { memoize } from 'vs/base/common/decorators';
|
||||
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||
import { getHover } from 'vs/editor/contrib/hover/getHover';
|
||||
|
||||
const HOVER_DELAY = 300;
|
||||
const LAUNCH_JSON_REGEX = /launch\.json$/;
|
||||
const REMOVE_INLINE_VALUES_DELAY = 100;
|
||||
const INLINE_VALUE_DECORATION_KEY = 'inlinevaluedecoration';
|
||||
const MAX_NUM_INLINE_VALUES = 100; // JS Global scope can have 700+ entries. We want to limit ourselves for perf reasons
|
||||
const MAX_INLINE_DECORATOR_LENGTH = 150; // Max string length of each inline decorator when debugging. If exceeded ... is added
|
||||
@@ -55,9 +58,7 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
|
||||
private toDispose: lifecycle.IDisposable[];
|
||||
private hoverWidget: DebugHoverWidget;
|
||||
private showHoverScheduler: RunOnceScheduler;
|
||||
private hideHoverScheduler: RunOnceScheduler;
|
||||
private removeInlineValuesScheduler: RunOnceScheduler;
|
||||
private nonDebugHoverPosition: Position;
|
||||
private hoverRange: Range;
|
||||
|
||||
private breakpointHintDecoration: string[];
|
||||
@@ -80,14 +81,12 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
@ITelemetryService private telemetryService: ITelemetryService,
|
||||
@IConfigurationService private configurationService: IConfigurationService,
|
||||
@IThemeService themeService: IThemeService,
|
||||
@IKeybindingService private keybindingService: IKeybindingService
|
||||
@IKeybindingService private keybindingService: IKeybindingService,
|
||||
@IDialogService private dialogService: IDialogService,
|
||||
) {
|
||||
this.breakpointHintDecoration = [];
|
||||
this.hoverWidget = new DebugHoverWidget(this.editor, this.debugService, this.instantiationService, themeService);
|
||||
this.toDispose = [];
|
||||
this.showHoverScheduler = new RunOnceScheduler(() => this.showHover(this.hoverRange, false), HOVER_DELAY);
|
||||
this.hideHoverScheduler = new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY);
|
||||
this.removeInlineValuesScheduler = new RunOnceScheduler(() => this.editor.removeDecorations(INLINE_VALUE_DECORATION_KEY), REMOVE_INLINE_VALUES_DELAY);
|
||||
this.registerListeners();
|
||||
this.breakpointWidgetVisible = CONTEXT_BREAKPOINT_WIDGET_VISIBLE.bindTo(contextKeyService);
|
||||
this.updateConfigurationWidgetVisibility();
|
||||
@@ -98,13 +97,23 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
private getContextMenuActions(breakpoints: IBreakpoint[], uri: uri, lineNumber: number): TPromise<(IAction | ContextSubMenu)[]> {
|
||||
const actions: (IAction | ContextSubMenu)[] = [];
|
||||
if (breakpoints.length === 1) {
|
||||
actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService));
|
||||
actions.push(new EditConditionalBreakpointAction(EditConditionalBreakpointAction.ID, EditConditionalBreakpointAction.LABEL, this.editor, this.debugService, this.keybindingService));
|
||||
if (breakpoints[0].enabled) {
|
||||
actions.push(new DisableBreakpointAction(DisableBreakpointAction.ID, DisableBreakpointAction.LABEL, this.debugService, this.keybindingService));
|
||||
} else {
|
||||
actions.push(new EnableBreakpointAction(EnableBreakpointAction.ID, EnableBreakpointAction.LABEL, this.debugService, this.keybindingService));
|
||||
}
|
||||
const breakpointType = breakpoints[0].logMessage ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint");
|
||||
actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, nls.localize('removeBreakpoint', "Remove {0}", breakpointType), this.debugService, this.keybindingService));
|
||||
actions.push(new Action(
|
||||
'workbench.debug.action.editBreakpointAction',
|
||||
nls.localize('editBreakpoint', "Edit {0}...", breakpointType),
|
||||
undefined,
|
||||
true,
|
||||
() => TPromise.as(this.editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(breakpoints[0].lineNumber, breakpoints[0].column))
|
||||
));
|
||||
|
||||
actions.push(new Action(
|
||||
`workbench.debug.viewlet.action.toggleBreakpoint`,
|
||||
breakpoints[0].enabled ? nls.localize('disableBreakpoint', "Disable {0}", breakpointType) : nls.localize('enableBreakpoint', "Enable {0}", breakpointType),
|
||||
undefined,
|
||||
true,
|
||||
() => this.debugService.enableOrDisableBreakpoints(!breakpoints[0].enabled, breakpoints[0])
|
||||
));
|
||||
} else if (breakpoints.length > 1) {
|
||||
const sorted = breakpoints.sort((first, second) => first.column - second.column);
|
||||
actions.push(new ContextSubMenu(nls.localize('removeBreakpoints', "Remove Breakpoints"), sorted.map(bp => new Action(
|
||||
@@ -140,7 +149,20 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
true,
|
||||
() => this.debugService.addBreakpoints(uri, [{ lineNumber }])
|
||||
));
|
||||
actions.push(new AddConditionalBreakpointAction(AddConditionalBreakpointAction.ID, AddConditionalBreakpointAction.LABEL, this.editor, lineNumber, this.debugService, this.keybindingService));
|
||||
actions.push(new Action(
|
||||
'addConditionalBreakpoint',
|
||||
nls.localize('addConditionalBreakpoint', "Add Conditional Breakpoint..."),
|
||||
null,
|
||||
true,
|
||||
() => TPromise.as(this.editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(lineNumber, undefined))
|
||||
));
|
||||
actions.push(new Action(
|
||||
'addLogPoint',
|
||||
nls.localize('addLogPoint', "Add Logpoint..."),
|
||||
null,
|
||||
true,
|
||||
() => TPromise.as(this.editor.getContribution<IDebugEditorContribution>(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(lineNumber, undefined, BreakpointWidgetContext.LOG_MESSAGE))
|
||||
));
|
||||
}
|
||||
|
||||
return TPromise.as(actions);
|
||||
@@ -174,7 +196,25 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
.filter(bp => bp.uri.toString() === uri.toString() && bp.lineNumber === lineNumber);
|
||||
|
||||
if (breakpoints.length) {
|
||||
breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId()));
|
||||
if (breakpoints.some(bp => !!bp.condition || !!bp.logMessage || !!bp.hitCondition)) {
|
||||
const logPoint = breakpoints.every(bp => !!bp.logMessage);
|
||||
const breakpointType = logPoint ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint");
|
||||
this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a {1} that will get lost on remove. Consider disabling the {0} instead.",
|
||||
breakpointType.toLowerCase(), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [
|
||||
nls.localize('removeLogPoint', "Remove {0}", breakpointType),
|
||||
nls.localize('disableLogPoint', "Disable {0}", breakpointType),
|
||||
nls.localize('cancel', "Cancel")
|
||||
], { cancelId: 2 }).then(choice => {
|
||||
if (choice === 0) {
|
||||
breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId()));
|
||||
}
|
||||
if (choice === 1) {
|
||||
breakpoints.forEach(bp => this.debugService.enableOrDisableBreakpoints(false, bp));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId()));
|
||||
}
|
||||
} else if (canSetBreakpoints) {
|
||||
this.debugService.addBreakpoints(uri, [{ lineNumber }]);
|
||||
}
|
||||
@@ -201,6 +241,7 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
this.toDispose.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(e)));
|
||||
this.toDispose.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e)));
|
||||
this.toDispose.push(this.editor.onMouseLeave((e: IEditorMouseEvent) => {
|
||||
this.provideNonDebugHoverScheduler.cancel();
|
||||
const hoverDomNode = this.hoverWidget.getDomNode();
|
||||
if (!hoverDomNode) {
|
||||
return;
|
||||
@@ -215,17 +256,18 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
this.toDispose.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onKeyDown(e)));
|
||||
this.toDispose.push(this.editor.onDidChangeModelContent(() => {
|
||||
this.wordToLineNumbersMap = null;
|
||||
this.updateInlineValuesScheduler.schedule();
|
||||
}));
|
||||
this.toDispose.push(this.editor.onDidChangeModel(() => {
|
||||
const sf = this.debugService.getViewModel().focusedStackFrame;
|
||||
const stackFrame = this.debugService.getViewModel().focusedStackFrame;
|
||||
const model = this.editor.getModel();
|
||||
this.editor.updateOptions({ hover: !sf || !model || model.uri.toString() !== sf.source.uri.toString() });
|
||||
this.editor.updateOptions({ hover: !stackFrame || !model || model.uri.toString() !== stackFrame.source.uri.toString() });
|
||||
this.closeBreakpointWidget();
|
||||
this.toggleExceptionWidget();
|
||||
this.hideHoverWidget();
|
||||
this.updateConfigurationWidgetVisibility();
|
||||
this.wordToLineNumbersMap = null;
|
||||
this.updateInlineDecorations(sf);
|
||||
this.updateInlineValueDecorations(stackFrame);
|
||||
}));
|
||||
this.toDispose.push(this.editor.onDidScrollChange(() => this.hideHoverWidget));
|
||||
this.toDispose.push(this.debugService.onDidChangeState((state: State) => {
|
||||
@@ -288,7 +330,33 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
this.hideHoverWidget();
|
||||
}
|
||||
|
||||
this.updateInlineDecorations(sf);
|
||||
this.updateInlineValueDecorations(sf);
|
||||
}
|
||||
|
||||
@memoize
|
||||
private get showHoverScheduler(): RunOnceScheduler {
|
||||
const scheduler = new RunOnceScheduler(() => this.showHover(this.hoverRange, false), HOVER_DELAY);
|
||||
this.toDispose.push(scheduler);
|
||||
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
@memoize
|
||||
private get hideHoverScheduler(): RunOnceScheduler {
|
||||
const scheduler = new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY);
|
||||
this.toDispose.push(scheduler);
|
||||
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
@memoize
|
||||
private get provideNonDebugHoverScheduler(): RunOnceScheduler {
|
||||
const scheduler = new RunOnceScheduler(() => {
|
||||
getHover(this.editor.getModel(), this.nonDebugHoverPosition);
|
||||
}, HOVER_DELAY);
|
||||
this.toDispose.push(scheduler);
|
||||
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
private hideHoverWidget(): void {
|
||||
@@ -296,6 +364,7 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
this.hideHoverScheduler.schedule();
|
||||
}
|
||||
this.showHoverScheduler.cancel();
|
||||
this.provideNonDebugHoverScheduler.cancel();
|
||||
}
|
||||
|
||||
// hover business
|
||||
@@ -313,6 +382,10 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.configurationService.getValue<IDebugConfiguration>('debug').enableAllHovers) {
|
||||
this.nonDebugHoverPosition = mouseEvent.target.position;
|
||||
this.provideNonDebugHoverScheduler.schedule();
|
||||
}
|
||||
const targetType = mouseEvent.target.type;
|
||||
const stopKey = env.isMacintosh ? 'metaKey' : 'ctrlKey';
|
||||
|
||||
@@ -341,12 +414,12 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
// end hover business
|
||||
|
||||
// breakpoint widget
|
||||
public showBreakpointWidget(lineNumber: number, column: number): void {
|
||||
public showBreakpointWidget(lineNumber: number, column: number, context?: BreakpointWidgetContext): void {
|
||||
if (this.breakpointWidget) {
|
||||
this.breakpointWidget.dispose();
|
||||
}
|
||||
|
||||
this.breakpointWidget = this.instantiationService.createInstance(BreakpointWidget, this.editor, lineNumber, column);
|
||||
this.breakpointWidget = this.instantiationService.createInstance(BreakpointWidget, this.editor, lineNumber, context);
|
||||
this.breakpointWidget.show({ lineNumber, column: 1 }, 2);
|
||||
this.breakpointWidgetVisible.set(true);
|
||||
}
|
||||
@@ -474,7 +547,24 @@ export class DebugEditorContribution implements IDebugEditorContribution {
|
||||
};
|
||||
|
||||
// Inline Decorations
|
||||
private updateInlineDecorations(stackFrame: IStackFrame): void {
|
||||
|
||||
@memoize
|
||||
private get removeInlineValuesScheduler(): RunOnceScheduler {
|
||||
return new RunOnceScheduler(
|
||||
() => this.editor.removeDecorations(INLINE_VALUE_DECORATION_KEY),
|
||||
100
|
||||
);
|
||||
}
|
||||
|
||||
@memoize
|
||||
private get updateInlineValuesScheduler(): RunOnceScheduler {
|
||||
return new RunOnceScheduler(
|
||||
() => this.updateInlineValueDecorations(this.debugService.getViewModel().focusedStackFrame),
|
||||
200
|
||||
);
|
||||
}
|
||||
|
||||
private updateInlineValueDecorations(stackFrame: IStackFrame): void {
|
||||
const model = this.editor.getModel();
|
||||
if (!this.configurationService.getValue<IDebugConfiguration>('debug').inlineValues ||
|
||||
!model || !stackFrame || model.uri.toString() !== stackFrame.source.uri.toString()) {
|
||||
|
||||