From 5a4391b3b17089e2654c6726448e6c60c1e6248f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Geis?= Date: Tue, 10 Jul 2018 15:53:56 +0200 Subject: [PATCH 01/48] Added contrib extension to have focus follow mouse (fixes #25685). --- .../common/config/commonEditorConfig.ts | 5 ++ src/vs/editor/common/config/editorOptions.ts | 17 +++-- .../contrib/focusOnHover/focusOnHover.ts | 65 +++++++++++++++++++ src/vs/editor/editor.all.ts | 1 + src/vs/monaco.d.ts | 5 ++ 5 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/vs/editor/contrib/focusOnHover/focusOnHover.ts diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 9774ab0405b..c771bb7aeba 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -784,6 +784,11 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_MODEL_DEFAULTS.largeFileOptimizations, 'description': nls.localize('largeFileOptimizations', "Special handling for large files to disable certain memory intensive features.") }, + 'editor.focusOnHover': { + 'type': 'boolean', + 'default': false, + 'description': nls.localize('focusOnHover', 'Controls if editors should be focused when hovered.') + }, 'diffEditor.renderIndicators': { 'type': 'boolean', 'default': true, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 14365ee9925..26bafcc31a4 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -625,6 +625,10 @@ export interface IEditorOptions { * Controls fading out of unused variables. */ showUnused?: boolean; + /** + * Controls whether editors should be focused on hover. + */ + focusOnHover?: boolean; } /** @@ -936,6 +940,7 @@ export interface EditorContribOptions { readonly lightbulbEnabled: boolean; readonly codeActionsOnSave: ICodeActionsOnSaveOptions; readonly codeActionsOnSaveTimeout: number; + readonly focusOnHover: boolean; } /** @@ -1315,6 +1320,7 @@ export class InternalEditorOptions { && objects.equals(a.codeActionsOnSave, b.codeActionsOnSave) && a.codeActionsOnSaveTimeout === b.codeActionsOnSaveTimeout && a.lightbulbEnabled === b.lightbulbEnabled + && a.focusOnHover === b.focusOnHover ); } @@ -1676,7 +1682,7 @@ export class EditorOptionsValidator { accessibilitySupport: _stringSet<'auto' | 'on' | 'off'>(opts.accessibilitySupport, defaults.accessibilitySupport, ['auto', 'on', 'off']), showUnused: _boolean(opts.showUnused, defaults.showUnused), viewInfo: viewInfo, - contribInfo: contribInfo, + contribInfo: contribInfo }; } @@ -1909,7 +1915,8 @@ export class EditorOptionsValidator { colorDecorators: _boolean(opts.colorDecorators, defaults.colorDecorators), lightbulbEnabled: _boolean(opts.lightbulb ? opts.lightbulb.enabled : false, defaults.lightbulbEnabled), codeActionsOnSave: _booleanMap(opts.codeActionsOnSave, {}), - codeActionsOnSaveTimeout: _clampedInt(opts.codeActionsOnSaveTimeout, defaults.codeActionsOnSaveTimeout, 1, 10000) + codeActionsOnSaveTimeout: _clampedInt(opts.codeActionsOnSaveTimeout, defaults.codeActionsOnSaveTimeout, 1, 10000), + focusOnHover: _boolean(opts.focusOnHover, defaults.focusOnHover) }; } } @@ -2017,7 +2024,8 @@ export class InternalEditorOptionsFactory { colorDecorators: opts.contribInfo.colorDecorators, lightbulbEnabled: opts.contribInfo.lightbulbEnabled, codeActionsOnSave: opts.contribInfo.codeActionsOnSave, - codeActionsOnSaveTimeout: opts.contribInfo.codeActionsOnSaveTimeout + codeActionsOnSaveTimeout: opts.contribInfo.codeActionsOnSaveTimeout, + focusOnHover: opts.contribInfo.focusOnHover } }; } @@ -2496,6 +2504,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { colorDecorators: true, lightbulbEnabled: true, codeActionsOnSave: {}, - codeActionsOnSaveTimeout: 750 + codeActionsOnSaveTimeout: 750, + focusOnHover: false }, }; diff --git a/src/vs/editor/contrib/focusOnHover/focusOnHover.ts b/src/vs/editor/contrib/focusOnHover/focusOnHover.ts new file mode 100644 index 00000000000..239360c49d0 --- /dev/null +++ b/src/vs/editor/contrib/focusOnHover/focusOnHover.ts @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { IDisposable } from 'vs/base/common/lifecycle'; + +export class FocusOnHoverController implements IEditorContribution { + + private static readonly ID = 'editor.contrib.focusOnHover'; + + private _editorMouseMoveHandler?: IDisposable; + private _didChangeConfigurationHandler: IDisposable; + + static get(editor: ICodeEditor): FocusOnHoverController { + return editor.getContribution(FocusOnHoverController.ID); + } + + constructor(private readonly _editor: ICodeEditor) { + this._hookEvents(); + + this._didChangeConfigurationHandler = this._editor.onDidChangeConfiguration((e: IConfigurationChangedEvent) => { + if (e.contribInfo) { + this._unhookEvents(); + this._hookEvents(); + } + }); + } + + private _hookEvents(): void { + if (this._editor.getConfiguration().contribInfo.focusOnHover) { + this._editorMouseMoveHandler = this._editor.onMouseMove(_ => this._onEditorMouseMove()); + } + } + + private _unhookEvents(): void { + if (this._editorMouseMoveHandler) { + this._editorMouseMoveHandler.dispose(); + this._editorMouseMoveHandler = null; + } + } + + private _onEditorMouseMove(): void { + if (!this._editor.hasTextFocus()) { + this._editor.focus(); + } + } + + public getId(): string { + return FocusOnHoverController.ID; + } + + public dispose(): void { + this._unhookEvents(); + this._didChangeConfigurationHandler.dispose(); + } +} + +registerEditorContribution(FocusOnHoverController); diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index cc32769c6a6..85667363e86 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -21,6 +21,7 @@ import 'vs/editor/contrib/contextmenu/contextmenu'; import 'vs/editor/contrib/cursorUndo/cursorUndo'; import 'vs/editor/contrib/dnd/dnd'; import 'vs/editor/contrib/find/findController'; +import 'vs/editor/contrib/focusOnHover/focusOnHover'; import 'vs/editor/contrib/folding/folding'; import 'vs/editor/contrib/fontZoom/fontZoom'; import 'vs/editor/contrib/format/formatActions'; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index d176c102959..6e3f3758bf1 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2967,6 +2967,10 @@ declare namespace monaco.editor { * Controls fading out of unused variables. */ showUnused?: boolean; + /** + * Controls whether editors should be focused on hover. + */ + focusOnHover?: boolean; } /** @@ -3218,6 +3222,7 @@ declare namespace monaco.editor { readonly lightbulbEnabled: boolean; readonly codeActionsOnSave: ICodeActionsOnSaveOptions; readonly codeActionsOnSaveTimeout: number; + readonly focusOnHover: boolean; } /** From 208b205337f8e82fcc004e9cce8b4d45dd84922d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 6 Sep 2019 22:56:58 +0200 Subject: [PATCH 02/48] Remove unnecessary JSON schema --- src/vs/editor/common/config/commonEditorConfig.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index d2ee45b542a..af4f2074ea8 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -473,11 +473,6 @@ const editorConfiguration: IConfigurationNode = { default: true, description: nls.localize('ignoreTrimWhitespace', "Controls whether the diff editor shows changes in leading or trailing whitespace as diffs.") }, - 'editor.focusOnHover': { - 'type': 'boolean', - 'default': false, - 'description': nls.localize('focusOnHover', 'Controls if editors should be focused when hovered.') - }, 'diffEditor.renderIndicators': { type: 'boolean', default: true, From e642cad1a8b1ddd5ee8a7db91fd4b37f7fb92708 Mon Sep 17 00:00:00 2001 From: zhengjiaqi01 Date: Wed, 25 Dec 2019 11:02:11 +0800 Subject: [PATCH 03/48] editor action run support params --- src/vs/editor/standalone/browser/standaloneCodeEditor.ts | 8 ++++---- src/vs/monaco.d.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 86ce9f07ace..ecd84dda8b8 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -23,7 +23,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; -import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, optional, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -74,7 +74,7 @@ export interface IActionDescriptor { * Method that will be executed when the action is triggered. * @param editor The editor instance is passed in as a convenience */ - run(editor: ICodeEditor): void | Promise; + run(editor: ICodeEditor, param?: any): void | Promise; } /** @@ -226,8 +226,8 @@ export class StandaloneCodeEditor extends CodeEditorWidget implements IStandalon ); const contextMenuGroupId = _descriptor.contextMenuGroupId || null; const contextMenuOrder = _descriptor.contextMenuOrder || 0; - const run = (): Promise => { - return Promise.resolve(_descriptor.run(this)); + const run = (accessor?: ServicesAccessor, ...args: any[]): Promise => { + return Promise.resolve(_descriptor.run(this, ...args)); }; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 27cece82f20..02b818633f0 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1045,7 +1045,7 @@ declare namespace monaco.editor { * Method that will be executed when the action is triggered. * @param editor The editor instance is passed in as a convenience */ - run(editor: ICodeEditor): void | Promise; + run(editor: ICodeEditor, param?: any): void | Promise; } /** From 5e1d23320d0cd269631561c372e3ca815e42a815 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Fri, 10 Jan 2020 17:23:05 -0500 Subject: [PATCH 04/48] Allow for rulers to be individually colored This change set: adds an interface for Ruler Color Options, adds a union type of that interface and number, adjust the rulers type hint to use said union type, adds a mechanism to apply boxshadow to fastDomNode, and updates the way rulers are rendered to support individual colors. I've also ensured that descriptions are provided for settings.json. So now, all nodes will provide explanations. --- src/vs/base/browser/fastDomNode.ts | 10 ++++ .../editor/browser/viewParts/rulers/rulers.ts | 16 ++++-- src/vs/editor/common/config/editorOptions.ts | 51 +++++++++++++++---- src/vs/monaco.d.ts | 9 +++- 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/vs/base/browser/fastDomNode.ts b/src/vs/base/browser/fastDomNode.ts index 5c688bd3496..7d4711792d3 100644 --- a/src/vs/base/browser/fastDomNode.ts +++ b/src/vs/base/browser/fastDomNode.ts @@ -27,6 +27,7 @@ export class FastDomNode { private _visibility: string; private _layerHint: boolean; private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'; + private _boxShadow: string; constructor(domNode: T) { this.domNode = domNode; @@ -49,6 +50,7 @@ export class FastDomNode { this._visibility = ''; this._layerHint = false; this._contain = 'none'; + this._boxShadow = ''; } public setMaxWidth(maxWidth: number): void { @@ -208,6 +210,14 @@ export class FastDomNode { this.domNode.style.transform = this._layerHint ? 'translate3d(0px, 0px, 0px)' : ''; } + public setBoxShadow(boxShadow: string): void { + if (this._boxShadow === boxShadow) { + return; + } + this._boxShadow = boxShadow; + this.domNode.style.boxShadow = boxShadow; + } + public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void { if (this._contain === contain) { return; diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 0f22de06a73..9f0490762d7 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -11,13 +11,13 @@ import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/v import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { EditorOption, IRulerOption } from 'vs/editor/common/config/editorOptions'; export class Rulers extends ViewPart { public domNode: FastDomNode; private readonly _renderedRulers: FastDomNode[]; - private _rulers: number[]; + private _rulers: IRulerOption[]; private _typicalHalfwidthCharacterWidth: number; constructor(context: ViewContext) { @@ -92,9 +92,19 @@ export class Rulers extends ViewPart { for (let i = 0, len = this._rulers.length; i < len; i++) { const node = this._renderedRulers[i]; + const srcNode = this._rulers[i]; + let rulerSize, rulerColor = ''; + if (typeof srcNode === 'number') { + rulerSize = srcNode; + } else { + rulerSize = srcNode.size; + rulerColor = `1px 0 0 0 ${srcNode.color} inset`; + } + + node.setBoxShadow(rulerColor); node.setHeight(Math.min(ctx.scrollHeight, 1000000)); - node.setLeft(this._rulers[i] * this._typicalHalfwidthCharacterWidth); + node.setLeft(rulerSize * this._typicalHalfwidthCharacterWidth); } } } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 3adac8cf46b..b4222fb2804 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -59,7 +59,7 @@ export interface IEditorOptions { * Render vertical lines at the specified columns. * Defaults to empty array. */ - rulers?: number[]; + rulers?: IRulerOption[]; /** * A string containing the word separators used when doing word navigation. * Defaults to `~!@#$%^&*()-=+[{]}\\|;:\'",.<>/? @@ -2212,6 +2212,15 @@ class EditorQuickSuggestions extends BaseEditorOption string); @@ -2285,30 +2294,52 @@ class EditorRenderLineNumbersOption extends BaseEditorOption { +class EditorRulers extends SimpleEditorOption { constructor() { - const defaults: number[] = []; + const defaults: IRulerOption[] = []; + const sizeSchema: IJSONSchema = { type: 'number', description: nls.localize('rulers.size', "Number of monospace characters at which this editor ruler will render.") }; + super( EditorOption.rulers, 'rulers', defaults, { type: 'array', - items: { - type: 'number' - }, + items: [ + sizeSchema, + { + type: [ + 'object' + ], + properties: { + size: sizeSchema, + color: { + type: 'string', + description: nls.localize('rulers.color', "Color of this editor ruler."), + format: 'color-hex' + } + } + } + ], default: defaults, description: nls.localize('rulers', "Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.") } ); } - public validate(input: any): number[] { + public validate(input: any): IRulerOption[] { if (Array.isArray(input)) { - let rulers: number[] = []; + let rulers: IRulerOption[] = []; for (let value of input) { - rulers.push(EditorIntOption.clampedInt(value, 0, 0, 10000)); + let clamped; + if (typeof value === 'number') { + clamped = EditorIntOption.clampedInt(value, 0, 0, 10000); + } else { + clamped = value; + clamped.size = EditorIntOption.clampedInt(value.size, 0, 0, 10000); + } + rulers.push(clamped); } - rulers.sort((a, b) => a - b); + rulers.sort((a, b) => ((typeof a === 'number') ? a : a.size) - ((typeof b === 'number') ? b : b.size)); return rulers; } return this.defaultValue; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 38597bc5d3b..ec5911ecd43 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2504,7 +2504,7 @@ declare namespace monaco.editor { * Render vertical lines at the specified columns. * Defaults to empty array. */ - rulers?: number[]; + rulers?: IRulerOption[]; /** * A string containing the word separators used when doing word navigation. * Defaults to `~!@#$%^&*()-=+[{]}\\|;:\'",.<>/? @@ -3282,6 +3282,13 @@ declare namespace monaco.editor { strings: boolean; } + export interface IRulerColorOption { + readonly size: number; + readonly color: string; + } + + export type IRulerOption = number | IRulerColorOption; + export type LineNumbersType = 'on' | 'off' | 'relative' | 'interval' | ((lineNumber: number) => string); /** From fbec956fc43afee912a5222bca35714a7c787953 Mon Sep 17 00:00:00 2001 From: Konstantin Solomatov Date: Fri, 10 Jan 2020 15:15:34 -0800 Subject: [PATCH 05/48] Fix link handing in extension pseudoterminals --- src/vs/workbench/api/common/extHostTerminalService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index f5635b83d23..8834b1e585e 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -277,6 +277,7 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess { } this._pty.open(initialDimensions ? initialDimensions : undefined); + this._onProcessReady.fire({ pid: -1, cwd: '' }); } } From 2248fa1cbdf8e311fcea92d2fa786cd9326074c6 Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Fri, 10 Jan 2020 20:47:54 -0500 Subject: [PATCH 06/48] Move that to a spot that makes more sense --- src/vs/editor/common/config/editorOptions.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index b4222fb2804..e5dfc53e56e 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -2212,15 +2212,6 @@ class EditorQuickSuggestions extends BaseEditorOption string); @@ -2294,6 +2285,13 @@ class EditorRenderLineNumbersOption extends BaseEditorOption { constructor() { From 0b1798d2cc99c4ccf872594dab43563e4157501c Mon Sep 17 00:00:00 2001 From: Dan Pock Date: Fri, 10 Jan 2020 20:50:08 -0500 Subject: [PATCH 07/48] run yarn --- src/vs/monaco.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index ec5911ecd43..fa6e244f57a 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3282,6 +3282,8 @@ declare namespace monaco.editor { strings: boolean; } + export type LineNumbersType = 'on' | 'off' | 'relative' | 'interval' | ((lineNumber: number) => string); + export interface IRulerColorOption { readonly size: number; readonly color: string; @@ -3289,8 +3291,6 @@ declare namespace monaco.editor { export type IRulerOption = number | IRulerColorOption; - export type LineNumbersType = 'on' | 'off' | 'relative' | 'interval' | ((lineNumber: number) => string); - /** * Configuration options for editor scrollbars */ From 558664f8918e3cee10fb882ec842538e4546fb05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuzhan=20Ero=C4=9Flu?= Date: Wed, 15 Jan 2020 12:17:25 +0300 Subject: [PATCH 08/48] Added remembering end key state behaviour --- package.json | 1 + src/vs/editor/common/controller/cursorCommon.ts | 11 ++++++++--- .../common/controller/cursorMoveOperations.ts | 14 +++++++++++--- src/vs/editor/common/controller/oneCursor.ts | 6 +++--- yarn.lock | 15 +++++++++++++++ 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index cee5e193327..4adc271a857 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "applicationinsights": "1.0.8", "chokidar": "3.2.3", "graceful-fs": "4.1.11", + "gulp-bom": "^3.0.0", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", "iconv-lite": "0.5.0", diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index ac269997918..d981f26a0a0 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -277,18 +277,21 @@ export class SingleCursorState { public readonly position: Position; public readonly leftoverVisibleColumns: number; public readonly selection: Selection; + public readonly isEnd: boolean; constructor( selectionStart: Range, selectionStartLeftoverVisibleColumns: number, position: Position, leftoverVisibleColumns: number, + isEnd: boolean = false ) { this.selectionStart = selectionStart; this.selectionStartLeftoverVisibleColumns = selectionStartLeftoverVisibleColumns; this.position = position; this.leftoverVisibleColumns = leftoverVisibleColumns; this.selection = SingleCursorState._computeSelection(this.selectionStart, this.position); + this.isEnd = isEnd; } public equals(other: SingleCursorState) { @@ -304,14 +307,15 @@ export class SingleCursorState { return (!this.selection.isEmpty() || !this.selectionStart.isEmpty()); } - public move(inSelectionMode: boolean, lineNumber: number, column: number, leftoverVisibleColumns: number): SingleCursorState { + public move(inSelectionMode: boolean, lineNumber: number, column: number, leftoverVisibleColumns: number, isEnd: boolean = false): SingleCursorState { if (inSelectionMode) { // move just position return new SingleCursorState( this.selectionStart, this.selectionStartLeftoverVisibleColumns, new Position(lineNumber, column), - leftoverVisibleColumns + leftoverVisibleColumns, + isEnd ); } else { // move everything @@ -319,7 +323,8 @@ export class SingleCursorState { new Range(lineNumber, column, lineNumber, column), leftoverVisibleColumns, new Position(lineNumber, column), - leftoverVisibleColumns + leftoverVisibleColumns, + isEnd ); } } diff --git a/src/vs/editor/common/controller/cursorMoveOperations.ts b/src/vs/editor/common/controller/cursorMoveOperations.ts index 1d414dd1f32..8be77b1031c 100644 --- a/src/vs/editor/common/controller/cursorMoveOperations.ts +++ b/src/vs/editor/common/controller/cursorMoveOperations.ts @@ -122,9 +122,13 @@ export class MoveOperations { column = cursor.position.column; } + if (cursor.isEnd) { + column = model.getLineMaxColumn(lineNumber + 1); + } + let r = MoveOperations.down(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true); - return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); + return cursor.move(inSelectionMode, r.lineNumber, cursor.isEnd ? column : r.column, r.leftoverVisibleColumns, cursor.isEnd); } public static translateDown(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState): SingleCursorState { @@ -174,9 +178,13 @@ export class MoveOperations { column = cursor.position.column; } + if (cursor.isEnd) { + column = model.getLineMaxColumn(lineNumber - 1); + } + let r = MoveOperations.up(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true); - return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); + return cursor.move(inSelectionMode, r.lineNumber, cursor.isEnd ? column : r.column, r.leftoverVisibleColumns, cursor.isEnd); } public static translateUp(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState): SingleCursorState { @@ -214,7 +222,7 @@ export class MoveOperations { public static moveToEndOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { let lineNumber = cursor.position.lineNumber; let maxColumn = model.getLineMaxColumn(lineNumber); - return cursor.move(inSelectionMode, lineNumber, maxColumn, 0); + return cursor.move(inSelectionMode, lineNumber, maxColumn, 0, true); } public static moveToBeginningOfBuffer(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 2bb09583133..07716dbb5de 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -99,7 +99,7 @@ export class OneCursor { ); const leftoverVisibleColumns = modelState.position.equals(position) ? modelState.leftoverVisibleColumns : 0; - modelState = new SingleCursorState(selectionStart, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns); + modelState = new SingleCursorState(selectionStart, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns, modelState.isEnd); } if (!viewState) { @@ -108,12 +108,12 @@ export class OneCursor { const viewSelectionStart2 = context.convertModelPositionToViewPosition(new Position(modelState.selectionStart.endLineNumber, modelState.selectionStart.endColumn)); const viewSelectionStart = new Range(viewSelectionStart1.lineNumber, viewSelectionStart1.column, viewSelectionStart2.lineNumber, viewSelectionStart2.column); const viewPosition = context.convertModelPositionToViewPosition(modelState.position); - viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns, modelState.isEnd); } else { // Validate new view state const viewSelectionStart = context.validateViewRange(viewState.selectionStart, modelState.selectionStart); const viewPosition = context.validateViewPosition(viewState.position, modelState.position); - viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns, viewState.isEnd); } this.modelState = modelState; diff --git a/yarn.lock b/yarn.lock index 6ef2a9f7c77..1e16ef4ba3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3996,6 +3996,14 @@ gulp-azure-storage@^0.10.0: vinyl "^2.2.0" vinyl-fs "^3.0.3" +gulp-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-bom/-/gulp-bom-3.0.0.tgz#b2f1ab0ef304ff5e593665b776ba517ef7ffb4ad" + integrity sha512-iw/J94F+MVlxG64Q17BSkHsyjpY17qHl3N3A/jDdrL77zQBkhKtTiKLqM4di9CUX/qFToyyeDsOWwH+rESBgmA== + dependencies: + plugin-error "^1.0.1" + through2 "^3.0.1" + gulp-buffer@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/gulp-buffer/-/gulp-buffer-0.0.2.tgz#af81b4346101736b49942ec6c9fa867ffe737036" @@ -8924,6 +8932,13 @@ through2@^3.0.0: readable-stream "2 || 3" xtend "~4.0.1" +through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through2@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" From 082266298c6cc8c9c4283b6d3dd761edefffa489 Mon Sep 17 00:00:00 2001 From: Gustavo Cassel Date: Sun, 2 Feb 2020 19:32:27 -0300 Subject: [PATCH 09/48] Developed setting 'mouseOpensDefinitionInPeek' which controls whether the mouse click opens element definition in the peek widget. --- src/vs/editor/common/config/editorOptions.ts | 10 ++ .../common/standalone/standaloneEnums.ts | 89 ++++++++--------- .../link/goToDefinitionAtPosition.ts | 4 +- src/vs/monaco.d.ts | 95 ++++++++++--------- 4 files changed, 109 insertions(+), 89 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index e9df917949b..a436c18203d 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -555,6 +555,11 @@ export interface IEditorOptions { * Defaults to false. */ peekWidgetDefaultFocus?: 'tree' | 'editor'; + /** + * Controls whether the mouse click opens element definition in the peek widget. + * Defaults to false. + */ + mouseOpensDefinitionInPeek?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -3192,6 +3197,7 @@ export const enum EditorOption { overviewRulerLanes, parameterHints, peekWidgetDefaultFocus, + mouseOpensDefinitionInPeek, quickSuggestions, quickSuggestionsDelay, readOnly, @@ -3583,6 +3589,10 @@ export const EditorOptions = { description: nls.localize('peekWidgetDefaultFocus', "Controls whether to focus the inline editor or the tree in the peek widget.") } )), + mouseOpensDefinitionInPeek: register(new EditorBooleanOption( + EditorOption.mouseOpensDefinitionInPeek, 'mouseOpensDefinitionInPeek', false, + { description: nls.localize('mouseOpensDefinitionInPeek', "Controls whether the mouse click opens element definition in the peek widget.") } + )), quickSuggestions: register(new EditorQuickSuggestions()), quickSuggestionsDelay: register(new EditorIntOption( EditorOption.quickSuggestionsDelay, 'quickSuggestionsDelay', diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index a828c6bd946..919c871a8c1 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -231,50 +231,51 @@ export enum EditorOption { overviewRulerLanes = 63, parameterHints = 64, peekWidgetDefaultFocus = 65, - quickSuggestions = 66, - quickSuggestionsDelay = 67, - readOnly = 68, - renderControlCharacters = 69, - renderIndentGuides = 70, - renderFinalNewline = 71, - renderLineHighlight = 72, - renderValidationDecorations = 73, - renderWhitespace = 74, - revealHorizontalRightPadding = 75, - roundedSelection = 76, - rulers = 77, - scrollbar = 78, - scrollBeyondLastColumn = 79, - scrollBeyondLastLine = 80, - selectionClipboard = 81, - selectionHighlight = 82, - selectOnLineNumbers = 83, - semanticHighlighting = 84, - showFoldingControls = 85, - showUnused = 86, - snippetSuggestions = 87, - smoothScrolling = 88, - stopRenderingLineAfter = 89, - suggest = 90, - suggestFontSize = 91, - suggestLineHeight = 92, - suggestOnTriggerCharacters = 93, - suggestSelection = 94, - tabCompletion = 95, - useTabStops = 96, - wordSeparators = 97, - wordWrap = 98, - wordWrapBreakAfterCharacters = 99, - wordWrapBreakBeforeCharacters = 100, - wordWrapColumn = 101, - wordWrapMinified = 102, - wrappingIndent = 103, - wrappingStrategy = 104, - editorClassName = 105, - pixelRatio = 106, - tabFocusMode = 107, - layoutInfo = 108, - wrappingInfo = 109 + mouseOpensDefinitionInPeek = 66, + quickSuggestions = 67, + quickSuggestionsDelay = 68, + readOnly = 69, + renderControlCharacters = 70, + renderIndentGuides = 71, + renderFinalNewline = 72, + renderLineHighlight = 73, + renderValidationDecorations = 74, + renderWhitespace = 75, + revealHorizontalRightPadding = 76, + roundedSelection = 77, + rulers = 78, + scrollbar = 79, + scrollBeyondLastColumn = 80, + scrollBeyondLastLine = 81, + selectionClipboard = 82, + selectionHighlight = 83, + selectOnLineNumbers = 84, + semanticHighlighting = 85, + showFoldingControls = 86, + showUnused = 87, + snippetSuggestions = 88, + smoothScrolling = 89, + stopRenderingLineAfter = 90, + suggest = 91, + suggestFontSize = 92, + suggestLineHeight = 93, + suggestOnTriggerCharacters = 94, + suggestSelection = 95, + tabCompletion = 96, + useTabStops = 97, + wordSeparators = 98, + wordWrap = 99, + wordWrapBreakAfterCharacters = 100, + wordWrapBreakBeforeCharacters = 101, + wordWrapColumn = 102, + wordWrapMinified = 103, + wrappingIndent = 104, + wrappingStrategy = 105, + editorClassName = 106, + pixelRatio = 107, + tabFocusMode = 108, + layoutInfo = 109, + wrappingInfo = 110 } /** diff --git a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts b/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts index d3678e527d9..b609be4291e 100644 --- a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts +++ b/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts @@ -27,6 +27,7 @@ import { IWordAtPosition, IModelDeltaDecoration, ITextModel, IFoundBracket } fro import { Position } from 'vs/editor/common/core/position'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; export class GotoDefinitionAtPositionEditorContribution implements IEditorContribution { @@ -334,7 +335,8 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri private gotoDefinition(position: Position, openToSide: boolean): Promise { this.editor.setPosition(position); - const action = new DefinitionAction({ openToSide, openInPeek: false, muteMessage: true }, { alias: '', label: '', id: '', precondition: undefined }); + const openInPeek = this.editor.getOption(EditorOption.mouseOpensDefinitionInPeek); + const action = new DefinitionAction({ openToSide, openInPeek: openInPeek, muteMessage: true }, { alias: '', label: '', id: '', precondition: undefined }); return this.editor.invokeWithinContext(accessor => action.run(accessor, this.editor)); } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 24b9c882113..84522b4c21d 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3035,6 +3035,11 @@ declare namespace monaco.editor { * Defaults to false. */ peekWidgetDefaultFocus?: 'tree' | 'editor'; + /** + * Controls whether the mouse click opens element definition in the peek widget. + * Defaults to false. + */ + mouseOpensDefinitionInPeek?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -3761,50 +3766,51 @@ declare namespace monaco.editor { overviewRulerLanes = 63, parameterHints = 64, peekWidgetDefaultFocus = 65, - quickSuggestions = 66, - quickSuggestionsDelay = 67, - readOnly = 68, - renderControlCharacters = 69, - renderIndentGuides = 70, - renderFinalNewline = 71, - renderLineHighlight = 72, - renderValidationDecorations = 73, - renderWhitespace = 74, - revealHorizontalRightPadding = 75, - roundedSelection = 76, - rulers = 77, - scrollbar = 78, - scrollBeyondLastColumn = 79, - scrollBeyondLastLine = 80, - selectionClipboard = 81, - selectionHighlight = 82, - selectOnLineNumbers = 83, - semanticHighlighting = 84, - showFoldingControls = 85, - showUnused = 86, - snippetSuggestions = 87, - smoothScrolling = 88, - stopRenderingLineAfter = 89, - suggest = 90, - suggestFontSize = 91, - suggestLineHeight = 92, - suggestOnTriggerCharacters = 93, - suggestSelection = 94, - tabCompletion = 95, - useTabStops = 96, - wordSeparators = 97, - wordWrap = 98, - wordWrapBreakAfterCharacters = 99, - wordWrapBreakBeforeCharacters = 100, - wordWrapColumn = 101, - wordWrapMinified = 102, - wrappingIndent = 103, - wrappingStrategy = 104, - editorClassName = 105, - pixelRatio = 106, - tabFocusMode = 107, - layoutInfo = 108, - wrappingInfo = 109 + mouseOpensDefinitionInPeek = 66, + quickSuggestions = 67, + quickSuggestionsDelay = 68, + readOnly = 69, + renderControlCharacters = 70, + renderIndentGuides = 71, + renderFinalNewline = 72, + renderLineHighlight = 73, + renderValidationDecorations = 74, + renderWhitespace = 75, + revealHorizontalRightPadding = 76, + roundedSelection = 77, + rulers = 78, + scrollbar = 79, + scrollBeyondLastColumn = 80, + scrollBeyondLastLine = 81, + selectionClipboard = 82, + selectionHighlight = 83, + selectOnLineNumbers = 84, + semanticHighlighting = 85, + showFoldingControls = 86, + showUnused = 87, + snippetSuggestions = 88, + smoothScrolling = 89, + stopRenderingLineAfter = 90, + suggest = 91, + suggestFontSize = 92, + suggestLineHeight = 93, + suggestOnTriggerCharacters = 94, + suggestSelection = 95, + tabCompletion = 96, + useTabStops = 97, + wordSeparators = 98, + wordWrap = 99, + wordWrapBreakAfterCharacters = 100, + wordWrapBreakBeforeCharacters = 101, + wordWrapColumn = 102, + wordWrapMinified = 103, + wrappingIndent = 104, + wrappingStrategy = 105, + editorClassName = 106, + pixelRatio = 107, + tabFocusMode = 108, + layoutInfo = 109, + wrappingInfo = 110 } export const EditorOptions: { acceptSuggestionOnCommitCharacter: IEditorOption; @@ -3873,6 +3879,7 @@ declare namespace monaco.editor { overviewRulerLanes: IEditorOption; parameterHints: IEditorOption; peekWidgetDefaultFocus: IEditorOption; + mouseOpensDefinitionInPeek: IEditorOption; quickSuggestions: IEditorOption; quickSuggestionsDelay: IEditorOption; readOnly: IEditorOption; From 5f218e53a9c00de9699fc0832ce53763bf8c87de Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Mon, 3 Feb 2020 11:54:04 +0000 Subject: [PATCH 10/48] Fix #89900 - improve text on editor.showFoldingControls setting --- src/vs/editor/common/config/editorOptions.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 07200e8eb33..abae1f83f9e 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -3675,7 +3675,13 @@ export const EditorOptions = { EditorOption.showFoldingControls, 'showFoldingControls', 'mouseover' as 'always' | 'mouseover', ['always', 'mouseover'] as const, - { description: nls.localize('showFoldingControls', "Controls whether the fold controls on the gutter are automatically hidden.") } + { + enumDescriptions: [ + nls.localize('showFoldingControls.always', "Always show the folding controls."), + nls.localize('showFoldingControls.mouseover', "Only show the folding controls when the mouse is over the gutter."), + ], + description: nls.localize('showFoldingControls', "Controls when the folding controls on the gutter are shown.") + } )), showUnused: register(new EditorBooleanOption( EditorOption.showUnused, 'showUnused', true, From d79b7a418a5483e7b9be9641a79cfc57447067ae Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Mon, 3 Feb 2020 13:46:50 +0000 Subject: [PATCH 11/48] Fix 89899 - improve description of editor.foldingStrategy setting --- src/vs/editor/common/config/editorOptions.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 07200e8eb33..106cc059c6a 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -3440,7 +3440,13 @@ export const EditorOptions = { EditorOption.foldingStrategy, 'foldingStrategy', 'auto' as 'auto' | 'indentation', ['auto', 'indentation'] as const, - { markdownDescription: nls.localize('foldingStrategy', "Controls the strategy for computing folding ranges. `auto` uses a language specific folding strategy, if available. `indentation` uses the indentation based folding strategy.") } + { + enumDescriptions: [ + nls.localize('foldingStrategy.auto', "Use a language-specific folding strategy if available, else the indentation-based one."), + nls.localize('foldingStrategy.indentation', "Use the indentation-based folding strategy."), + ], + description: nls.localize('foldingStrategy', "Controls the strategy for computing folding ranges.") + } )), foldingHighlight: register(new EditorBooleanOption( EditorOption.foldingHighlight, 'foldingHighlight', true, From ee50ba7266dc518756a9b870775d2e66ec66efcd Mon Sep 17 00:00:00 2001 From: Gustavo Cassel Date: Mon, 3 Feb 2020 13:04:06 -0300 Subject: [PATCH 12/48] Renamed 'mouseOpensDefinitionInPeek' to 'definitionLinkOpensInPeek' --- src/vs/editor/common/config/editorOptions.ts | 12 ++++++------ src/vs/editor/common/standalone/standaloneEnums.ts | 2 +- .../gotoSymbol/link/goToDefinitionAtPosition.ts | 2 +- src/vs/monaco.d.ts | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index a436c18203d..f14f6687364 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -556,10 +556,10 @@ export interface IEditorOptions { */ peekWidgetDefaultFocus?: 'tree' | 'editor'; /** - * Controls whether the mouse click opens element definition in the peek widget. + * Controls whether the definition link opens element in the peek widget. * Defaults to false. */ - mouseOpensDefinitionInPeek?: boolean; + definitionLinkOpensInPeek?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -3197,7 +3197,7 @@ export const enum EditorOption { overviewRulerLanes, parameterHints, peekWidgetDefaultFocus, - mouseOpensDefinitionInPeek, + definitionLinkOpensInPeek, quickSuggestions, quickSuggestionsDelay, readOnly, @@ -3589,9 +3589,9 @@ export const EditorOptions = { description: nls.localize('peekWidgetDefaultFocus', "Controls whether to focus the inline editor or the tree in the peek widget.") } )), - mouseOpensDefinitionInPeek: register(new EditorBooleanOption( - EditorOption.mouseOpensDefinitionInPeek, 'mouseOpensDefinitionInPeek', false, - { description: nls.localize('mouseOpensDefinitionInPeek', "Controls whether the mouse click opens element definition in the peek widget.") } + definitionLinkOpensInPeek: register(new EditorBooleanOption( + EditorOption.definitionLinkOpensInPeek, 'definitionLinkOpensInPeek', false, + { description: nls.localize('definitionLinkOpensInPeek', "Controls whether the definition link opens element in the peek widget.") } )), quickSuggestions: register(new EditorQuickSuggestions()), quickSuggestionsDelay: register(new EditorIntOption( diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 919c871a8c1..5041c28367c 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -231,7 +231,7 @@ export enum EditorOption { overviewRulerLanes = 63, parameterHints = 64, peekWidgetDefaultFocus = 65, - mouseOpensDefinitionInPeek = 66, + definitionLinkOpensInPeek = 66, quickSuggestions = 67, quickSuggestionsDelay = 68, readOnly = 69, diff --git a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts b/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts index b609be4291e..64ae38189a0 100644 --- a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts +++ b/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts @@ -335,7 +335,7 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri private gotoDefinition(position: Position, openToSide: boolean): Promise { this.editor.setPosition(position); - const openInPeek = this.editor.getOption(EditorOption.mouseOpensDefinitionInPeek); + const openInPeek = this.editor.getOption(EditorOption.definitionLinkOpensInPeek); const action = new DefinitionAction({ openToSide, openInPeek: openInPeek, muteMessage: true }, { alias: '', label: '', id: '', precondition: undefined }); return this.editor.invokeWithinContext(accessor => action.run(accessor, this.editor)); } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 84522b4c21d..9b2a0613025 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3036,10 +3036,10 @@ declare namespace monaco.editor { */ peekWidgetDefaultFocus?: 'tree' | 'editor'; /** - * Controls whether the mouse click opens element definition in the peek widget. + * Controls whether the definition link opens element in the peek widget. * Defaults to false. */ - mouseOpensDefinitionInPeek?: boolean; + definitionLinkOpensInPeek?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -3766,7 +3766,7 @@ declare namespace monaco.editor { overviewRulerLanes = 63, parameterHints = 64, peekWidgetDefaultFocus = 65, - mouseOpensDefinitionInPeek = 66, + definitionLinkOpensInPeek = 66, quickSuggestions = 67, quickSuggestionsDelay = 68, readOnly = 69, @@ -3879,7 +3879,7 @@ declare namespace monaco.editor { overviewRulerLanes: IEditorOption; parameterHints: IEditorOption; peekWidgetDefaultFocus: IEditorOption; - mouseOpensDefinitionInPeek: IEditorOption; + definitionLinkOpensInPeek: IEditorOption; quickSuggestions: IEditorOption; quickSuggestionsDelay: IEditorOption; readOnly: IEditorOption; From dffdccf821a10c52f2417eb41d9d0845e15a8290 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 11:44:33 +0100 Subject: [PATCH 13/48] Adopt API changes --- .../common/standalone/standaloneEnums.ts | 161 ++++++++--------- .../contrib/focusOnHover/focusOnHover.ts | 29 ++-- src/vs/monaco.d.ts | 162 +++++++++--------- 3 files changed, 173 insertions(+), 179 deletions(-) diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index a828c6bd946..b508fcb05e4 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -195,86 +195,87 @@ export enum EditorOption { fastScrollSensitivity = 27, find = 28, fixedOverflowWidgets = 29, - folding = 30, - foldingStrategy = 31, - foldingHighlight = 32, - fontFamily = 33, - fontInfo = 34, - fontLigatures = 35, - fontSize = 36, - fontWeight = 37, - formatOnPaste = 38, - formatOnType = 39, - glyphMargin = 40, - gotoLocation = 41, - hideCursorInOverviewRuler = 42, - highlightActiveIndentGuide = 43, - hover = 44, - inDiffEditor = 45, - letterSpacing = 46, - lightbulb = 47, - lineDecorationsWidth = 48, - lineHeight = 49, - lineNumbers = 50, - lineNumbersMinChars = 51, - links = 52, - matchBrackets = 53, - minimap = 54, - mouseStyle = 55, - mouseWheelScrollSensitivity = 56, - mouseWheelZoom = 57, - multiCursorMergeOverlapping = 58, - multiCursorModifier = 59, - multiCursorPaste = 60, - occurrencesHighlight = 61, - overviewRulerBorder = 62, - overviewRulerLanes = 63, - parameterHints = 64, - peekWidgetDefaultFocus = 65, - quickSuggestions = 66, - quickSuggestionsDelay = 67, - readOnly = 68, - renderControlCharacters = 69, - renderIndentGuides = 70, - renderFinalNewline = 71, - renderLineHighlight = 72, - renderValidationDecorations = 73, - renderWhitespace = 74, - revealHorizontalRightPadding = 75, - roundedSelection = 76, - rulers = 77, - scrollbar = 78, - scrollBeyondLastColumn = 79, - scrollBeyondLastLine = 80, - selectionClipboard = 81, - selectionHighlight = 82, - selectOnLineNumbers = 83, - semanticHighlighting = 84, - showFoldingControls = 85, - showUnused = 86, - snippetSuggestions = 87, - smoothScrolling = 88, - stopRenderingLineAfter = 89, - suggest = 90, - suggestFontSize = 91, - suggestLineHeight = 92, - suggestOnTriggerCharacters = 93, - suggestSelection = 94, - tabCompletion = 95, - useTabStops = 96, - wordSeparators = 97, - wordWrap = 98, - wordWrapBreakAfterCharacters = 99, - wordWrapBreakBeforeCharacters = 100, - wordWrapColumn = 101, - wordWrapMinified = 102, - wrappingIndent = 103, - wrappingStrategy = 104, - editorClassName = 105, - pixelRatio = 106, - tabFocusMode = 107, - layoutInfo = 108, - wrappingInfo = 109 + focusOnHover = 30, + folding = 31, + foldingStrategy = 32, + foldingHighlight = 33, + fontFamily = 34, + fontInfo = 35, + fontLigatures = 36, + fontSize = 37, + fontWeight = 38, + formatOnPaste = 39, + formatOnType = 40, + glyphMargin = 41, + gotoLocation = 42, + hideCursorInOverviewRuler = 43, + highlightActiveIndentGuide = 44, + hover = 45, + inDiffEditor = 46, + letterSpacing = 47, + lightbulb = 48, + lineDecorationsWidth = 49, + lineHeight = 50, + lineNumbers = 51, + lineNumbersMinChars = 52, + links = 53, + matchBrackets = 54, + minimap = 55, + mouseStyle = 56, + mouseWheelScrollSensitivity = 57, + mouseWheelZoom = 58, + multiCursorMergeOverlapping = 59, + multiCursorModifier = 60, + multiCursorPaste = 61, + occurrencesHighlight = 62, + overviewRulerBorder = 63, + overviewRulerLanes = 64, + parameterHints = 65, + peekWidgetDefaultFocus = 66, + quickSuggestions = 67, + quickSuggestionsDelay = 68, + readOnly = 69, + renderControlCharacters = 70, + renderIndentGuides = 71, + renderFinalNewline = 72, + renderLineHighlight = 73, + renderValidationDecorations = 74, + renderWhitespace = 75, + revealHorizontalRightPadding = 76, + roundedSelection = 77, + rulers = 78, + scrollbar = 79, + scrollBeyondLastColumn = 80, + scrollBeyondLastLine = 81, + selectionClipboard = 82, + selectionHighlight = 83, + selectOnLineNumbers = 84, + semanticHighlighting = 85, + showFoldingControls = 86, + showUnused = 87, + snippetSuggestions = 88, + smoothScrolling = 89, + stopRenderingLineAfter = 90, + suggest = 91, + suggestFontSize = 92, + suggestLineHeight = 93, + suggestOnTriggerCharacters = 94, + suggestSelection = 95, + tabCompletion = 96, + useTabStops = 97, + wordSeparators = 98, + wordWrap = 99, + wordWrapBreakAfterCharacters = 100, + wordWrapBreakBeforeCharacters = 101, + wordWrapColumn = 102, + wordWrapMinified = 103, + wrappingIndent = 104, + wrappingStrategy = 105, + editorClassName = 106, + pixelRatio = 107, + tabFocusMode = 108, + layoutInfo = 109, + wrappingInfo = 110 } /** diff --git a/src/vs/editor/contrib/focusOnHover/focusOnHover.ts b/src/vs/editor/contrib/focusOnHover/focusOnHover.ts index d715017fd0c..81509872010 100644 --- a/src/vs/editor/contrib/focusOnHover/focusOnHover.ts +++ b/src/vs/editor/contrib/focusOnHover/focusOnHover.ts @@ -3,34 +3,29 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -export class FocusOnHoverController implements IEditorContribution { +export class FocusOnHoverController extends Disposable implements IEditorContribution { - private static readonly ID = 'editor.contrib.focusOnHover'; + public static readonly ID = 'editor.contrib.focusOnHover'; private _editorMouseMoveHandler: IDisposable | null; - private _didChangeConfigurationHandler: IDisposable; - - static get(editor: ICodeEditor): FocusOnHoverController { - return editor.getContribution(FocusOnHoverController.ID); - } constructor(private readonly _editor: ICodeEditor) { - this._hookEvents(); + super(); + this._editorMouseMoveHandler = null; - this._didChangeConfigurationHandler = this._editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => { + this._hookEvents(); + this._register(this._editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => { if (e.hasChanged(EditorOption.focusOnHover)) { this._unhookEvents(); this._hookEvents(); } - }); + })); } private _hookEvents(): void { @@ -52,14 +47,10 @@ export class FocusOnHoverController implements IEditorContribution { } } - public getId(): string { - return FocusOnHoverController.ID; - } - public dispose(): void { + super.dispose(); this._unhookEvents(); - this._didChangeConfigurationHandler.dispose(); } } -registerEditorContribution(FocusOnHoverController); +registerEditorContribution(FocusOnHoverController.ID, FocusOnHoverController); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 5650a1bc6e1..1b6ec0079ee 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3729,86 +3729,87 @@ declare namespace monaco.editor { fastScrollSensitivity = 27, find = 28, fixedOverflowWidgets = 29, - folding = 30, - foldingStrategy = 31, - foldingHighlight = 32, - fontFamily = 33, - fontInfo = 34, - fontLigatures = 35, - fontSize = 36, - fontWeight = 37, - formatOnPaste = 38, - formatOnType = 39, - glyphMargin = 40, - gotoLocation = 41, - hideCursorInOverviewRuler = 42, - highlightActiveIndentGuide = 43, - hover = 44, - inDiffEditor = 45, - letterSpacing = 46, - lightbulb = 47, - lineDecorationsWidth = 48, - lineHeight = 49, - lineNumbers = 50, - lineNumbersMinChars = 51, - links = 52, - matchBrackets = 53, - minimap = 54, - mouseStyle = 55, - mouseWheelScrollSensitivity = 56, - mouseWheelZoom = 57, - multiCursorMergeOverlapping = 58, - multiCursorModifier = 59, - multiCursorPaste = 60, - occurrencesHighlight = 61, - overviewRulerBorder = 62, - overviewRulerLanes = 63, - parameterHints = 64, - peekWidgetDefaultFocus = 65, - quickSuggestions = 66, - quickSuggestionsDelay = 67, - readOnly = 68, - renderControlCharacters = 69, - renderIndentGuides = 70, - renderFinalNewline = 71, - renderLineHighlight = 72, - renderValidationDecorations = 73, - renderWhitespace = 74, - revealHorizontalRightPadding = 75, - roundedSelection = 76, - rulers = 77, - scrollbar = 78, - scrollBeyondLastColumn = 79, - scrollBeyondLastLine = 80, - selectionClipboard = 81, - selectionHighlight = 82, - selectOnLineNumbers = 83, - semanticHighlighting = 84, - showFoldingControls = 85, - showUnused = 86, - snippetSuggestions = 87, - smoothScrolling = 88, - stopRenderingLineAfter = 89, - suggest = 90, - suggestFontSize = 91, - suggestLineHeight = 92, - suggestOnTriggerCharacters = 93, - suggestSelection = 94, - tabCompletion = 95, - useTabStops = 96, - wordSeparators = 97, - wordWrap = 98, - wordWrapBreakAfterCharacters = 99, - wordWrapBreakBeforeCharacters = 100, - wordWrapColumn = 101, - wordWrapMinified = 102, - wrappingIndent = 103, - wrappingStrategy = 104, - editorClassName = 105, - pixelRatio = 106, - tabFocusMode = 107, - layoutInfo = 108, - wrappingInfo = 109 + focusOnHover = 30, + folding = 31, + foldingStrategy = 32, + foldingHighlight = 33, + fontFamily = 34, + fontInfo = 35, + fontLigatures = 36, + fontSize = 37, + fontWeight = 38, + formatOnPaste = 39, + formatOnType = 40, + glyphMargin = 41, + gotoLocation = 42, + hideCursorInOverviewRuler = 43, + highlightActiveIndentGuide = 44, + hover = 45, + inDiffEditor = 46, + letterSpacing = 47, + lightbulb = 48, + lineDecorationsWidth = 49, + lineHeight = 50, + lineNumbers = 51, + lineNumbersMinChars = 52, + links = 53, + matchBrackets = 54, + minimap = 55, + mouseStyle = 56, + mouseWheelScrollSensitivity = 57, + mouseWheelZoom = 58, + multiCursorMergeOverlapping = 59, + multiCursorModifier = 60, + multiCursorPaste = 61, + occurrencesHighlight = 62, + overviewRulerBorder = 63, + overviewRulerLanes = 64, + parameterHints = 65, + peekWidgetDefaultFocus = 66, + quickSuggestions = 67, + quickSuggestionsDelay = 68, + readOnly = 69, + renderControlCharacters = 70, + renderIndentGuides = 71, + renderFinalNewline = 72, + renderLineHighlight = 73, + renderValidationDecorations = 74, + renderWhitespace = 75, + revealHorizontalRightPadding = 76, + roundedSelection = 77, + rulers = 78, + scrollbar = 79, + scrollBeyondLastColumn = 80, + scrollBeyondLastLine = 81, + selectionClipboard = 82, + selectionHighlight = 83, + selectOnLineNumbers = 84, + semanticHighlighting = 85, + showFoldingControls = 86, + showUnused = 87, + snippetSuggestions = 88, + smoothScrolling = 89, + stopRenderingLineAfter = 90, + suggest = 91, + suggestFontSize = 92, + suggestLineHeight = 93, + suggestOnTriggerCharacters = 94, + suggestSelection = 95, + tabCompletion = 96, + useTabStops = 97, + wordSeparators = 98, + wordWrap = 99, + wordWrapBreakAfterCharacters = 100, + wordWrapBreakBeforeCharacters = 101, + wordWrapColumn = 102, + wordWrapMinified = 103, + wrappingIndent = 104, + wrappingStrategy = 105, + editorClassName = 106, + pixelRatio = 107, + tabFocusMode = 108, + layoutInfo = 109, + wrappingInfo = 110 } export const EditorOptions: { acceptSuggestionOnCommitCharacter: IEditorOption; @@ -3841,6 +3842,7 @@ declare namespace monaco.editor { fastScrollSensitivity: IEditorOption; find: IEditorOption; fixedOverflowWidgets: IEditorOption; + focusOnHover: IEditorOption; folding: IEditorOption; foldingStrategy: IEditorOption; foldingHighlight: IEditorOption; From b790d7af218629bc3955d8a5f7c333caff705001 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 11:51:26 +0100 Subject: [PATCH 14/48] Revert "Merge pull request #53963 from 71/focus-on-hover" This reverts commit 5f58ff53438a55a64dbf81370ac3607319307937, reversing changes made to 6346697d9d46acb109a885853cd0d5c210876a61. --- src/vs/editor/common/config/editorOptions.ts | 9 - .../common/standalone/standaloneEnums.ts | 161 +++++++++-------- .../contrib/focusOnHover/focusOnHover.ts | 56 ------ src/vs/editor/editor.all.ts | 1 - src/vs/monaco.d.ts | 166 +++++++++--------- 5 files changed, 160 insertions(+), 233 deletions(-) delete mode 100644 src/vs/editor/contrib/focusOnHover/focusOnHover.ts diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index aa0c4de1164..163833a04d3 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -550,10 +550,6 @@ export interface IEditorOptions { * Controls fading out of unused variables. */ showUnused?: boolean; - /** - * Controls whether editors should be focused on hover. - */ - focusOnHover?: boolean; /** * Controls whether to focus the inline editor in the peek widget by default. * Defaults to false. @@ -3160,7 +3156,6 @@ export const enum EditorOption { fastScrollSensitivity, find, fixedOverflowWidgets, - focusOnHover, folding, foldingStrategy, foldingHighlight, @@ -3437,10 +3432,6 @@ export const EditorOptions = { fixedOverflowWidgets: register(new EditorBooleanOption( EditorOption.fixedOverflowWidgets, 'fixedOverflowWidgets', false, )), - focusOnHover: register(new EditorBooleanOption( - EditorOption.focusOnHover, 'focusOnHover', false, - { description: nls.localize('focusOnHover', "Controls whether editors should be focused when hovered.") } - )), folding: register(new EditorBooleanOption( EditorOption.folding, 'folding', true, { description: nls.localize('folding', "Controls whether the editor has code folding enabled.") } diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index b508fcb05e4..a828c6bd946 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -195,87 +195,86 @@ export enum EditorOption { fastScrollSensitivity = 27, find = 28, fixedOverflowWidgets = 29, - focusOnHover = 30, - folding = 31, - foldingStrategy = 32, - foldingHighlight = 33, - fontFamily = 34, - fontInfo = 35, - fontLigatures = 36, - fontSize = 37, - fontWeight = 38, - formatOnPaste = 39, - formatOnType = 40, - glyphMargin = 41, - gotoLocation = 42, - hideCursorInOverviewRuler = 43, - highlightActiveIndentGuide = 44, - hover = 45, - inDiffEditor = 46, - letterSpacing = 47, - lightbulb = 48, - lineDecorationsWidth = 49, - lineHeight = 50, - lineNumbers = 51, - lineNumbersMinChars = 52, - links = 53, - matchBrackets = 54, - minimap = 55, - mouseStyle = 56, - mouseWheelScrollSensitivity = 57, - mouseWheelZoom = 58, - multiCursorMergeOverlapping = 59, - multiCursorModifier = 60, - multiCursorPaste = 61, - occurrencesHighlight = 62, - overviewRulerBorder = 63, - overviewRulerLanes = 64, - parameterHints = 65, - peekWidgetDefaultFocus = 66, - quickSuggestions = 67, - quickSuggestionsDelay = 68, - readOnly = 69, - renderControlCharacters = 70, - renderIndentGuides = 71, - renderFinalNewline = 72, - renderLineHighlight = 73, - renderValidationDecorations = 74, - renderWhitespace = 75, - revealHorizontalRightPadding = 76, - roundedSelection = 77, - rulers = 78, - scrollbar = 79, - scrollBeyondLastColumn = 80, - scrollBeyondLastLine = 81, - selectionClipboard = 82, - selectionHighlight = 83, - selectOnLineNumbers = 84, - semanticHighlighting = 85, - showFoldingControls = 86, - showUnused = 87, - snippetSuggestions = 88, - smoothScrolling = 89, - stopRenderingLineAfter = 90, - suggest = 91, - suggestFontSize = 92, - suggestLineHeight = 93, - suggestOnTriggerCharacters = 94, - suggestSelection = 95, - tabCompletion = 96, - useTabStops = 97, - wordSeparators = 98, - wordWrap = 99, - wordWrapBreakAfterCharacters = 100, - wordWrapBreakBeforeCharacters = 101, - wordWrapColumn = 102, - wordWrapMinified = 103, - wrappingIndent = 104, - wrappingStrategy = 105, - editorClassName = 106, - pixelRatio = 107, - tabFocusMode = 108, - layoutInfo = 109, - wrappingInfo = 110 + folding = 30, + foldingStrategy = 31, + foldingHighlight = 32, + fontFamily = 33, + fontInfo = 34, + fontLigatures = 35, + fontSize = 36, + fontWeight = 37, + formatOnPaste = 38, + formatOnType = 39, + glyphMargin = 40, + gotoLocation = 41, + hideCursorInOverviewRuler = 42, + highlightActiveIndentGuide = 43, + hover = 44, + inDiffEditor = 45, + letterSpacing = 46, + lightbulb = 47, + lineDecorationsWidth = 48, + lineHeight = 49, + lineNumbers = 50, + lineNumbersMinChars = 51, + links = 52, + matchBrackets = 53, + minimap = 54, + mouseStyle = 55, + mouseWheelScrollSensitivity = 56, + mouseWheelZoom = 57, + multiCursorMergeOverlapping = 58, + multiCursorModifier = 59, + multiCursorPaste = 60, + occurrencesHighlight = 61, + overviewRulerBorder = 62, + overviewRulerLanes = 63, + parameterHints = 64, + peekWidgetDefaultFocus = 65, + quickSuggestions = 66, + quickSuggestionsDelay = 67, + readOnly = 68, + renderControlCharacters = 69, + renderIndentGuides = 70, + renderFinalNewline = 71, + renderLineHighlight = 72, + renderValidationDecorations = 73, + renderWhitespace = 74, + revealHorizontalRightPadding = 75, + roundedSelection = 76, + rulers = 77, + scrollbar = 78, + scrollBeyondLastColumn = 79, + scrollBeyondLastLine = 80, + selectionClipboard = 81, + selectionHighlight = 82, + selectOnLineNumbers = 83, + semanticHighlighting = 84, + showFoldingControls = 85, + showUnused = 86, + snippetSuggestions = 87, + smoothScrolling = 88, + stopRenderingLineAfter = 89, + suggest = 90, + suggestFontSize = 91, + suggestLineHeight = 92, + suggestOnTriggerCharacters = 93, + suggestSelection = 94, + tabCompletion = 95, + useTabStops = 96, + wordSeparators = 97, + wordWrap = 98, + wordWrapBreakAfterCharacters = 99, + wordWrapBreakBeforeCharacters = 100, + wordWrapColumn = 101, + wordWrapMinified = 102, + wrappingIndent = 103, + wrappingStrategy = 104, + editorClassName = 105, + pixelRatio = 106, + tabFocusMode = 107, + layoutInfo = 108, + wrappingInfo = 109 } /** diff --git a/src/vs/editor/contrib/focusOnHover/focusOnHover.ts b/src/vs/editor/contrib/focusOnHover/focusOnHover.ts deleted file mode 100644 index 81509872010..00000000000 --- a/src/vs/editor/contrib/focusOnHover/focusOnHover.ts +++ /dev/null @@ -1,56 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; - -export class FocusOnHoverController extends Disposable implements IEditorContribution { - - public static readonly ID = 'editor.contrib.focusOnHover'; - - private _editorMouseMoveHandler: IDisposable | null; - - constructor(private readonly _editor: ICodeEditor) { - super(); - this._editorMouseMoveHandler = null; - - this._hookEvents(); - this._register(this._editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => { - if (e.hasChanged(EditorOption.focusOnHover)) { - this._unhookEvents(); - this._hookEvents(); - } - })); - } - - private _hookEvents(): void { - if (this._editor.getOption(EditorOption.focusOnHover)) { - this._editorMouseMoveHandler = this._editor.onMouseMove(_ => this._onEditorMouseMove()); - } - } - - private _unhookEvents(): void { - if (this._editorMouseMoveHandler) { - this._editorMouseMoveHandler.dispose(); - this._editorMouseMoveHandler = null; - } - } - - private _onEditorMouseMove(): void { - if (!this._editor.hasTextFocus()) { - this._editor.focus(); - } - } - - public dispose(): void { - super.dispose(); - this._unhookEvents(); - } -} - -registerEditorContribution(FocusOnHoverController.ID, FocusOnHoverController); diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index b5b83c3ed61..31a6ad0497b 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -19,7 +19,6 @@ import 'vs/editor/contrib/contextmenu/contextmenu'; import 'vs/editor/contrib/cursorUndo/cursorUndo'; import 'vs/editor/contrib/dnd/dnd'; import 'vs/editor/contrib/find/findController'; -import 'vs/editor/contrib/focusOnHover/focusOnHover'; import 'vs/editor/contrib/folding/folding'; import 'vs/editor/contrib/fontZoom/fontZoom'; import 'vs/editor/contrib/format/formatActions'; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 1b6ec0079ee..35f5ded808f 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3030,10 +3030,6 @@ declare namespace monaco.editor { * Controls fading out of unused variables. */ showUnused?: boolean; - /** - * Controls whether editors should be focused on hover. - */ - focusOnHover?: boolean; /** * Controls whether to focus the inline editor in the peek widget by default. * Defaults to false. @@ -3729,87 +3725,86 @@ declare namespace monaco.editor { fastScrollSensitivity = 27, find = 28, fixedOverflowWidgets = 29, - focusOnHover = 30, - folding = 31, - foldingStrategy = 32, - foldingHighlight = 33, - fontFamily = 34, - fontInfo = 35, - fontLigatures = 36, - fontSize = 37, - fontWeight = 38, - formatOnPaste = 39, - formatOnType = 40, - glyphMargin = 41, - gotoLocation = 42, - hideCursorInOverviewRuler = 43, - highlightActiveIndentGuide = 44, - hover = 45, - inDiffEditor = 46, - letterSpacing = 47, - lightbulb = 48, - lineDecorationsWidth = 49, - lineHeight = 50, - lineNumbers = 51, - lineNumbersMinChars = 52, - links = 53, - matchBrackets = 54, - minimap = 55, - mouseStyle = 56, - mouseWheelScrollSensitivity = 57, - mouseWheelZoom = 58, - multiCursorMergeOverlapping = 59, - multiCursorModifier = 60, - multiCursorPaste = 61, - occurrencesHighlight = 62, - overviewRulerBorder = 63, - overviewRulerLanes = 64, - parameterHints = 65, - peekWidgetDefaultFocus = 66, - quickSuggestions = 67, - quickSuggestionsDelay = 68, - readOnly = 69, - renderControlCharacters = 70, - renderIndentGuides = 71, - renderFinalNewline = 72, - renderLineHighlight = 73, - renderValidationDecorations = 74, - renderWhitespace = 75, - revealHorizontalRightPadding = 76, - roundedSelection = 77, - rulers = 78, - scrollbar = 79, - scrollBeyondLastColumn = 80, - scrollBeyondLastLine = 81, - selectionClipboard = 82, - selectionHighlight = 83, - selectOnLineNumbers = 84, - semanticHighlighting = 85, - showFoldingControls = 86, - showUnused = 87, - snippetSuggestions = 88, - smoothScrolling = 89, - stopRenderingLineAfter = 90, - suggest = 91, - suggestFontSize = 92, - suggestLineHeight = 93, - suggestOnTriggerCharacters = 94, - suggestSelection = 95, - tabCompletion = 96, - useTabStops = 97, - wordSeparators = 98, - wordWrap = 99, - wordWrapBreakAfterCharacters = 100, - wordWrapBreakBeforeCharacters = 101, - wordWrapColumn = 102, - wordWrapMinified = 103, - wrappingIndent = 104, - wrappingStrategy = 105, - editorClassName = 106, - pixelRatio = 107, - tabFocusMode = 108, - layoutInfo = 109, - wrappingInfo = 110 + folding = 30, + foldingStrategy = 31, + foldingHighlight = 32, + fontFamily = 33, + fontInfo = 34, + fontLigatures = 35, + fontSize = 36, + fontWeight = 37, + formatOnPaste = 38, + formatOnType = 39, + glyphMargin = 40, + gotoLocation = 41, + hideCursorInOverviewRuler = 42, + highlightActiveIndentGuide = 43, + hover = 44, + inDiffEditor = 45, + letterSpacing = 46, + lightbulb = 47, + lineDecorationsWidth = 48, + lineHeight = 49, + lineNumbers = 50, + lineNumbersMinChars = 51, + links = 52, + matchBrackets = 53, + minimap = 54, + mouseStyle = 55, + mouseWheelScrollSensitivity = 56, + mouseWheelZoom = 57, + multiCursorMergeOverlapping = 58, + multiCursorModifier = 59, + multiCursorPaste = 60, + occurrencesHighlight = 61, + overviewRulerBorder = 62, + overviewRulerLanes = 63, + parameterHints = 64, + peekWidgetDefaultFocus = 65, + quickSuggestions = 66, + quickSuggestionsDelay = 67, + readOnly = 68, + renderControlCharacters = 69, + renderIndentGuides = 70, + renderFinalNewline = 71, + renderLineHighlight = 72, + renderValidationDecorations = 73, + renderWhitespace = 74, + revealHorizontalRightPadding = 75, + roundedSelection = 76, + rulers = 77, + scrollbar = 78, + scrollBeyondLastColumn = 79, + scrollBeyondLastLine = 80, + selectionClipboard = 81, + selectionHighlight = 82, + selectOnLineNumbers = 83, + semanticHighlighting = 84, + showFoldingControls = 85, + showUnused = 86, + snippetSuggestions = 87, + smoothScrolling = 88, + stopRenderingLineAfter = 89, + suggest = 90, + suggestFontSize = 91, + suggestLineHeight = 92, + suggestOnTriggerCharacters = 93, + suggestSelection = 94, + tabCompletion = 95, + useTabStops = 96, + wordSeparators = 97, + wordWrap = 98, + wordWrapBreakAfterCharacters = 99, + wordWrapBreakBeforeCharacters = 100, + wordWrapColumn = 101, + wordWrapMinified = 102, + wrappingIndent = 103, + wrappingStrategy = 104, + editorClassName = 105, + pixelRatio = 106, + tabFocusMode = 107, + layoutInfo = 108, + wrappingInfo = 109 } export const EditorOptions: { acceptSuggestionOnCommitCharacter: IEditorOption; @@ -3842,7 +3837,6 @@ declare namespace monaco.editor { fastScrollSensitivity: IEditorOption; find: IEditorOption; fixedOverflowWidgets: IEditorOption; - focusOnHover: IEditorOption; folding: IEditorOption; foldingStrategy: IEditorOption; foldingHighlight: IEditorOption; From f86418ac57dd63a7047141245f8558a55e5598db Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 12:14:55 +0100 Subject: [PATCH 15/48] Fix bad merge --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 30ccf466b08..4c94e8b0512 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "dependencies": { "applicationinsights": "1.0.8", "chokidar": "3.2.3", - "graceful-fs": "4.1.11", + "graceful-fs": "4.2.3", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", "iconv-lite": "0.5.0", From d60bf2357cacd342ce9882ed0f8fdf7600433377 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Feb 2020 12:25:19 +0100 Subject: [PATCH 16/48] #89993 Enhance views service - register viewlets and panels for containers - events when view visibility has changed - small refactorings --- .../browser/parts/views/viewPaneContainer.ts | 25 +++- src/vs/workbench/browser/parts/views/views.ts | 115 ++++++++++++++++-- .../browser/parts/views/viewsViewlet.ts | 4 +- .../browser/workbench.contribution.ts | 86 ------------- src/vs/workbench/common/views.ts | 13 +- .../extensions/browser/extensionsViewlet.ts | 4 +- .../contrib/remote/browser/remote.ts | 4 +- 7 files changed, 141 insertions(+), 110 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index 9ae27329a50..c314a406254 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -293,6 +293,14 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { private readonly _onDidChangeVisibility = this._register(new Emitter()); readonly onDidChangeVisibility = this._onDidChangeVisibility.event; + private readonly _onDidAddViews = this._register(new Emitter()); + readonly onDidAddViews = this._onDidAddViews.event; + + private readonly _onDidRemoveViews = this._register(new Emitter()); + readonly onDidRemoveViews = this._onDidRemoveViews.event; + + private readonly _onDidChangeViewVisibility = this._register(new Emitter()); + readonly onDidChangeViewVisibility = this._onDidChangeViewVisibility.event; get onDidSashChange(): Event { return assertIsDefined(this.paneview).onDidSashChange; @@ -347,15 +355,15 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { this._register(addDisposableListener(parent, EventType.CONTEXT_MENU, (e: MouseEvent) => this.showContextMenu(new StandardMouseEvent(e)))); this._register(this.onDidSashChange(() => this.saveViewSizes())); - this.viewsModel.onDidAdd(added => this.onDidAddViews(added)); - this.viewsModel.onDidRemove(removed => this.onDidRemoveViews(removed)); + this.viewsModel.onDidAdd(added => this.onDidAddViewDescriptors(added)); + this.viewsModel.onDidRemove(removed => this.onDidRemoveViewDescriptors(removed)); const addedViews: IAddedViewDescriptorRef[] = this.viewsModel.visibleViewDescriptors.map((viewDescriptor, index) => { const size = this.viewsModel.getSize(viewDescriptor.id); const collapsed = this.viewsModel.isCollapsed(viewDescriptor.id); return ({ viewDescriptor, index, size, collapsed }); }); if (addedViews.length) { - this.onDidAddViews(addedViews); + this.onDidAddViewDescriptors(addedViews); } // Update headers after and title contributed views after available, since we read from cache in the beginning to know if the viewlet has single view or not. Ref #29609 @@ -503,6 +511,8 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { if (this.isViewMergedWithContainer() !== wasMerged) { this.updateTitleArea(); } + + this._onDidAddViews.fire(panes.map(({ pane }) => pane)); } setVisible(visible: boolean): void { @@ -606,7 +616,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return view; } - protected onDidAddViews(added: IAddedViewDescriptorRef[]): ViewPane[] { + protected onDidAddViewDescriptors(added: IAddedViewDescriptorRef[]): ViewPane[] { const panesToAdd: { pane: ViewPane, size: number, index: number }[] = []; for (const { viewDescriptor, collapsed, index, size } of added) { @@ -653,7 +663,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return this.actionRunner; } - private onDidRemoveViews(removed: IViewDescriptorRef[]): void { + private onDidRemoveViewDescriptors(removed: IViewDescriptorRef[]): void { removed = removed.sort((a, b) => b.index - a.index); const panesToRemove: ViewPane[] = []; for (const { index } of removed) { @@ -682,6 +692,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { this.updateTitleArea(); } }); + const onDidChangeVisibility = pane.onDidChangeBodyVisibility(() => this._onDidChangeViewVisibility.fire(pane)); const onDidChange = pane.onDidChange(() => { if (pane === this.lastFocusedPane && !pane.isExpanded()) { this.lastFocusedPane = undefined; @@ -695,7 +706,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { headerBorder: SIDE_BAR_SECTION_HEADER_BORDER, dropBackground: SIDE_BAR_DRAG_AND_DROP_BACKGROUND }, pane); - const disposable = combinedDisposable(onDidFocus, onDidChangeTitleArea, paneStyler, onDidChange); + const disposable = combinedDisposable(onDidFocus, onDidChangeTitleArea, paneStyler, onDidChange, onDidChangeVisibility); const paneItem: IViewPaneItem = { pane: pane, disposable }; this.paneItems.splice(index, 0, paneItem); @@ -711,6 +722,8 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { if (wasMerged !== this.isViewMergedWithContainer()) { this.updateTitleArea(); } + + this._onDidRemoveViews.fire(panes); } private removePane(pane: ViewPane): void { diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 83706144b5a..52ecfe80c29 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -12,7 +12,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { Event, Emitter } from 'vs/base/common/event'; import { firstIndex, move } from 'vs/base/common/arrays'; -import { isUndefinedOrNull, isUndefined } from 'vs/base/common/types'; +import { isUndefinedOrNull, isUndefined, isString } from 'vs/base/common/types'; import { MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { localize } from 'vs/nls'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -22,9 +22,19 @@ import { toggleClass, addClass } from 'vs/base/browser/dom'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import type { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { PaneComposite } from 'vs/workbench/browser/panecomposite'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { VIEW_ID as SEARCH_VIEW_ID } from 'vs/workbench/services/search/common/search'; +import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; +import { PaneCompositePanel, PanelRegistry, PanelDescriptor, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { Viewlet, ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; +import { URI } from 'vs/base/common/uri'; export interface IViewState { visibleGlobal: boolean | undefined; @@ -451,10 +461,14 @@ export class ViewsService extends Disposable implements IViewsService { private readonly viewContainersRegistry: IViewContainersRegistry; private readonly viewDisposable: Map; + private readonly _onDidChangeViewVisibility: Emitter<{ id: string, visible: boolean }> = this._register(new Emitter<{ id: string, visible: boolean }>()); + readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }> = this._onDidChangeViewVisibility.event; + constructor( @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, @IPanelService private readonly panelService: IPanelService, - @IViewletService private readonly viewletService: IViewletService + @IViewletService private readonly viewletService: IViewletService, + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); @@ -466,11 +480,11 @@ export class ViewsService extends Disposable implements IViewsService { this.viewDisposable.clear(); })); - this.viewContainersRegistry.all.forEach(viewContainer => this.onViewContainerRegistered(viewContainer)); - this._register(this.viewContainersRegistry.onDidRegister(({ viewContainer }) => this.onViewContainerRegistered(viewContainer))); + this.viewContainersRegistry.all.forEach(viewContainer => this.onDidRegisterViewContainer(viewContainer, this.viewContainersRegistry.getViewContainerLocation(viewContainer))); + this._register(this.viewContainersRegistry.onDidRegister(({ viewContainer, viewContainerLocation }) => this.onDidRegisterViewContainer(viewContainer, viewContainerLocation))); } - private onViewContainerRegistered(viewContainer: ViewContainer): void { + private onDidRegisterViewContainer(viewContainer: ViewContainer, location: ViewContainerLocation): void { const viewDescriptorCollection = this.viewDescriptorService.getViewDescriptors(viewContainer); this.onViewsAdded(viewDescriptorCollection.allViewDescriptors, viewContainer); this._register(viewDescriptorCollection.onDidChangeViews(({ added, removed }) => { @@ -577,7 +591,7 @@ export class ViewsService extends Disposable implements IViewsService { return undefined; } - getActiveViewWithId(id: string): IView | null { + getActiveViewWithId(id: string): T | null { const viewContainer = this.viewDescriptorService.getViewContainer(id); if (viewContainer) { const location = this.viewContainersRegistry.getViewContainerLocation(viewContainer); @@ -585,12 +599,12 @@ export class ViewsService extends Disposable implements IViewsService { if (location === ViewContainerLocation.Sidebar) { const activeViewlet = this.viewletService.getActiveViewlet(); if (activeViewlet?.getId() === viewContainer.id) { - return activeViewlet.getViewPaneContainer().getView(id) ?? null; + return activeViewlet.getViewPaneContainer().getView(id) as T ?? null; } } else if (location === ViewContainerLocation.Panel) { const activePanel = this.panelService.getActivePanel(); - if (activePanel?.getId() === viewContainer.id && activePanel instanceof PaneComposite) { - return activePanel.getViewPaneContainer().getView(id) ?? null; + if (activePanel?.getId() === viewContainer.id) { + return (activePanel as IPaneComposite).getViewPaneContainer().getView(id) as T ?? null; } } } @@ -613,6 +627,14 @@ export class ViewsService extends Disposable implements IViewsService { return null; } + + createContainer(container: ViewContainer): ViewPaneContainer { + const viewPaneContainer: ViewPaneContainer = this._register((this.instantiationService as any).createInstance(container.ctorDescriptor!.ctor, ...(container.ctorDescriptor!.staticArguments || []))); + this._register(viewPaneContainer.onDidAddViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() })))); + this._register(viewPaneContainer.onDidChangeViewVisibility(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() }))); + this._register(viewPaneContainer.onDidRemoveViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: false })))); + return viewPaneContainer; + } } export function createFileIconThemableTreeContainerScope(container: HTMLElement, themeService: IWorkbenchThemeService): IDisposable { @@ -629,3 +651,74 @@ export function createFileIconThemableTreeContainerScope(container: HTMLElement, } registerSingleton(IViewsService, ViewsService); + +// Viewlets & Panels +(function registerViewletsAndPanels(): void { + const registerPanel = (viewContainer: ViewContainer): void => { + class PaneContainerPanel extends PaneCompositePanel { + constructor( + @ITelemetryService telemetryService: ITelemetryService, + @IStorageService storageService: IStorageService, + @IInstantiationService instantiationService: IInstantiationService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IViewsService viewsService: ViewsService + ) { + super(viewContainer.id, viewsService.createContainer(viewContainer), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); + } + } + Registry.as(PanelExtensions.Panels).registerPanel(PanelDescriptor.create( + PaneContainerPanel, + viewContainer.id, + viewContainer.name, + isString(viewContainer.icon) ? viewContainer.icon : undefined, + viewContainer.order, + viewContainer.focusCommand?.id, + )); + }; + + const registerViewlet = (viewContainer: ViewContainer): void => { + class PaneContainerViewlet extends Viewlet { + constructor( + @IConfigurationService configurationService: IConfigurationService, + @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, + @ITelemetryService telemetryService: ITelemetryService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IStorageService storageService: IStorageService, + @IInstantiationService instantiationService: IInstantiationService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService + ) { + super(viewContainer.id, (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); + } + } + const viewletDescriptor = ViewletDescriptor.create( + PaneContainerViewlet, + viewContainer.id, + viewContainer.name, + isString(viewContainer.icon) ? viewContainer.icon : undefined, + viewContainer.order, + viewContainer.icon instanceof URI ? viewContainer.icon : undefined + ); + + Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); + }; + + const viewContainerRegistry = Registry.as(ViewExtensions.ViewContainersRegistry); + viewContainerRegistry.getViewContainers(ViewContainerLocation.Panel).forEach(viewContainer => registerPanel(viewContainer)); + viewContainerRegistry.onDidRegister(({ viewContainer, viewContainerLocation }) => { + switch (viewContainerLocation) { + case ViewContainerLocation.Panel: + registerPanel(viewContainer); + return; + case ViewContainerLocation.Sidebar: + if (viewContainer.ctorDescriptor) { + registerViewlet(viewContainer); + } + return; + } + }); +})(); diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 3ededdd5bf7..b3a0ef0e024 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -130,8 +130,8 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer { return views; } - onDidAddViews(added: IAddedViewDescriptorRef[]): ViewPane[] { - const panes: ViewPane[] = super.onDidAddViews(added); + onDidAddViewDescriptors(added: IAddedViewDescriptorRef[]): ViewPane[] { + const panes: ViewPane[] = super.onDidAddViewDescriptors(added); for (let i = 0; i < added.length; i++) { if (this.constantViewDescriptors.has(added[i].viewDescriptor.id)) { panes[i].setExpanded(false); diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 1da60908997..83d6b8821a7 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -8,21 +8,6 @@ import * as nls from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { isMacintosh, isWindows, isLinux, isWeb, isNative } from 'vs/base/common/platform'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; -import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor, PaneCompositePanel } from 'vs/workbench/browser/panel'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation } from 'vs/workbench/common/views'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { Viewlet, ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { isString } from 'vs/base/common/types'; -import { URI } from 'vs/base/common/uri'; // Configuration (function registerConfiguration(): void { @@ -393,74 +378,3 @@ import { URI } from 'vs/base/common/uri'; } }); })(); - -// Viewlets & Panels -(function registerViewletsAndPanels(): void { - const registerPanel = (viewContainer: ViewContainer): void => { - class PaneContainerPanel extends PaneCompositePanel { - constructor( - @ITelemetryService telemetryService: ITelemetryService, - @IStorageService storageService: IStorageService, - @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super(viewContainer.id, (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); - } - } - Registry.as(PanelExtensions.Panels).registerPanel(PanelDescriptor.create( - PaneContainerPanel, - viewContainer.id, - viewContainer.name, - isString(viewContainer.icon) ? viewContainer.icon : undefined, - viewContainer.order, - viewContainer.focusCommand?.id, - )); - }; - - const registerViewlet = (viewContainer: ViewContainer): void => { - class PaneContainerViewlet extends Viewlet { - constructor( - @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @ITelemetryService telemetryService: ITelemetryService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IStorageService storageService: IStorageService, - @IEditorService editorService: IEditorService, - @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService - ) { - super(viewContainer.id, (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); - } - } - const viewletDescriptor = ViewletDescriptor.create( - PaneContainerViewlet, - viewContainer.id, - viewContainer.name, - isString(viewContainer.icon) ? viewContainer.icon : undefined, - viewContainer.order, - viewContainer.icon instanceof URI ? viewContainer.icon : undefined - ); - - Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); - }; - - const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); - viewContainerRegistry.getViewContainers(ViewContainerLocation.Panel).forEach(viewContainer => registerPanel(viewContainer)); - viewContainerRegistry.onDidRegister(({ viewContainer, viewContainerLocation }) => { - switch (viewContainerLocation) { - case ViewContainerLocation.Panel: - registerPanel(viewContainer); - return; - case ViewContainerLocation.Sidebar: - if (viewContainer.ctorDescriptor) { - registerViewlet(viewContainer); - } - return; - } - }); -})(); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 3b43c26044e..fbede54b565 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -341,6 +341,10 @@ export interface IView { readonly id: string; + isVisible(): boolean; + + isBodyVisible(): boolean; + } export interface IViewsViewlet extends IViewlet { @@ -354,9 +358,12 @@ export const IViewsService = createDecorator('viewsService'); export interface IViewsService { _serviceBrand: undefined; - getActiveViewWithId(id: string): IView | null; + readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }>; + + getActiveViewWithId(id: string): T | null; openView(id: string, focus?: boolean): Promise; + } export const IViewDescriptorService = createDecorator('viewDescriptorService'); @@ -512,6 +519,10 @@ export interface IEditableData { } export interface IViewPaneContainer { + onDidAddViews: Event; + onDidRemoveViews: Event; + onDidChangeViewVisibility: Event; + setVisible(visible: boolean): void; isVisible(): boolean; focus(): void; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index f0741bcf4f5..97cc84812cb 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -536,8 +536,8 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE ))).then(() => undefined); } - protected onDidAddViews(added: IAddedViewDescriptorRef[]): ViewPane[] { - const addedViews = super.onDidAddViews(added); + protected onDidAddViewDescriptors(added: IAddedViewDescriptorRef[]): ViewPane[] { + const addedViews = super.onDidAddViewDescriptors(added); this.progress(Promise.all(addedViews.map(addedView => (addedView).show(this.normalizedQuery()) .then(model => this.alertSearchResult(model.length, addedView.id)) diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index a6f5e8b4cae..5feb009f368 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -512,9 +512,9 @@ export class RemoteViewPaneContainer extends FilterViewPaneContainer implements return title; } - onDidAddViews(added: IAddedViewDescriptorRef[]): ViewPane[] { + onDidAddViewDescriptors(added: IAddedViewDescriptorRef[]): ViewPane[] { // Call to super MUST be first, since registering the additional view will cause this to be called again. - const panels: ViewPane[] = super.onDidAddViews(added); + const panels: ViewPane[] = super.onDidAddViewDescriptors(added); // This context key is set to false in the constructor, but is expected to be changed by resolver extensions to enable the forwarded ports view. const viewEnabled: boolean = !!forwardedPortsViewEnabled.getValue(this.contextKeyService); if (this.environmentService.configuration.remoteAuthority && !this.tunnelPanelDescriptor && viewEnabled) { From c606dd95e1e83436fe2d650bf1011930c8c3b77c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:10:26 +0100 Subject: [PATCH 17/48] fix git tests --- extensions/git/src/test/git.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/extensions/git/src/test/git.test.ts b/extensions/git/src/test/git.test.ts index 1d4c4ebe161..12946a2c5fb 100644 --- a/extensions/git/src/test/git.test.ts +++ b/extensions/git/src/test/git.test.ts @@ -189,7 +189,9 @@ suite('git', () => { suite('parseGitCommit', () => { test('single parent commit', function () { const GIT_OUTPUT_SINGLE_PARENT = `52c293a05038d865604c2284aa8698bd087915a1 +John Doe john.doe@mail.com +1580811030 8e5a374372b8393906c7e380dbb09349c5385554 This is a commit message.\x00`; @@ -197,13 +199,17 @@ This is a commit message.\x00`; hash: '52c293a05038d865604c2284aa8698bd087915a1', message: 'This is a commit message.', parents: ['8e5a374372b8393906c7e380dbb09349c5385554'], + authorDate: new Date(1580811030000), + authorName: 'John Doe', authorEmail: 'john.doe@mail.com', }]); }); test('multiple parent commits', function () { const GIT_OUTPUT_MULTIPLE_PARENTS = `52c293a05038d865604c2284aa8698bd087915a1 +John Doe john.doe@mail.com +1580811030 8e5a374372b8393906c7e380dbb09349c5385554 df27d8c75b129ab9b178b386077da2822101b217 This is a commit message.\x00`; @@ -211,13 +217,17 @@ This is a commit message.\x00`; hash: '52c293a05038d865604c2284aa8698bd087915a1', message: 'This is a commit message.', parents: ['8e5a374372b8393906c7e380dbb09349c5385554', 'df27d8c75b129ab9b178b386077da2822101b217'], + authorDate: new Date(1580811030000), + authorName: 'John Doe', authorEmail: 'john.doe@mail.com', }]); }); test('no parent commits', function () { const GIT_OUTPUT_NO_PARENTS = `52c293a05038d865604c2284aa8698bd087915a1 +John Doe john.doe@mail.com +1580811030 This is a commit message.\x00`; @@ -225,6 +235,8 @@ This is a commit message.\x00`; hash: '52c293a05038d865604c2284aa8698bd087915a1', message: 'This is a commit message.', parents: [], + authorDate: new Date(1580811030000), + authorName: 'John Doe', authorEmail: 'john.doe@mail.com', }]); }); From 1dd16ab72892ca30547da6008eae584faee0c5de Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:10:54 +0100 Subject: [PATCH 18/48] setup git integration tests --- extensions/git/package.json | 3 +- extensions/git/src/test/index.ts | 30 ++ extensions/git/yarn.lock | 511 ++++++++++++++++++++++++++++++- 3 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 extensions/git/src/test/index.ts diff --git a/extensions/git/package.json b/extensions/git/package.json index a98b7ed6c95..b3a7fa221be 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1780,6 +1780,7 @@ "@types/mocha": "2.2.43", "@types/node": "^12.11.7", "@types/which": "^1.0.28", - "mocha": "^3.2.0" + "mocha": "^3.2.0", + "vscode": "^1.1.36" } } diff --git a/extensions/git/src/test/index.ts b/extensions/git/src/test/index.ts new file mode 100644 index 00000000000..747c4562e8a --- /dev/null +++ b/extensions/git/src/test/index.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const path = require('path'); +const testRunner = require('vscode/lib/testrunner'); + +const suite = 'Integration Git Tests'; + +const options: any = { + ui: 'tdd', + useColors: (!process.env.BUILD_ARTIFACTSTAGINGDIRECTORY && process.platform !== 'win32'), + timeout: 60000 +}; + +if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) { + options.reporter = 'mocha-multi-reporters'; + options.reporterOptions = { + reporterEnabled: 'spec, mocha-junit-reporter', + mochaJunitReporterReporterOptions: { + testsuitesTitle: `${suite} ${process.platform}`, + mochaFile: path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${suite.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) + } + }; +} + +testRunner.configure(options); + +export = testRunner; diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index a0d7edf8c69..ae873ebd83a 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -36,6 +36,23 @@ resolved "https://registry.yarnpkg.com/@types/which/-/which-1.0.28.tgz#016e387629b8817bed653fe32eab5d11279c8df6" integrity sha1-AW44dim4gXvtZT/jLqtdESecjfY= +agent-base@4, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +ajv@^6.5.5: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + applicationinsights@1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.8.tgz#db6e3d983cf9f9405fe1ee5ba30ac6e1914537b5" @@ -45,11 +62,45 @@ applicationinsights@1.0.8: diagnostic-channel-publishers "0.2.1" zone.js "0.7.6" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -63,11 +114,38 @@ browser-stdout@1.3.0: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -80,6 +158,18 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + dayjs@1.8.19: version "1.8.19" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.19.tgz#5117dc390d8f8e586d53891dbff3fa308f51abfe" @@ -92,6 +182,25 @@ debug@2.6.8: dependencies: ms "2.0.0" +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + diagnostic-channel-publishers@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3" @@ -109,21 +218,92 @@ diff@3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escape-string-regexp@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + file-type@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.2.0.tgz#113cfed52e1d6959ab80248906e2f25a8cdccb74" integrity sha1-ETz+1S4daVmrgCSJBuLyWozcy3Q= +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -136,26 +316,98 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.2: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -176,21 +428,61 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jschardet@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.1.1.tgz#af6f8fd0b3b0f5d46a8fd9614a4fce490575c184" integrity sha512-pA5qG9Zwm8CBpGlK/lo2GE9jPxwqRgMV7Lzc/1iaPccw6v4Rhj8Zg2BTyrdmHmxlJojnbLupLeRnaPLsq03x6Q== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -247,7 +539,19 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -minimatch@^3.0.2: +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -284,11 +588,38 @@ mocha@^3.2.0: mkdirp "0.5.1" supports-color "3.1.2" +mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -301,7 +632,73 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -"safer-buffer@>= 2.1.2 < 3": +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -311,6 +708,39 @@ semver@^5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +source-map-support@^0.5.0: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" @@ -318,6 +748,62 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" +supports-color@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + dependencies: + has-flag "^3.0.0" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +url-parse@^1.4.4: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vscode-extension-telemetry@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz#91387e06b33400c57abd48979b0e790415ae110b" @@ -330,11 +816,32 @@ vscode-nls@^4.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.0.0.tgz#4001c8a6caba5cedb23a9c5ce1090395c0e44002" integrity sha512-qCfdzcH+0LgQnBpZA53bA32kzp9rpq/f66Som577ObeuDlFIrtbEJ+A/+CCxjIh4G8dpJYNCKIsxpRAHIfsbNw== +vscode-test@^0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-0.4.3.tgz#461ebf25fc4bc93d77d982aed556658a2e2b90b8" + integrity sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w== + dependencies: + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + vscode-uri@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.0.0.tgz#2df704222f72b8a71ff266ba0830ed6c51ac1542" integrity sha512-lWXWofDSYD8r/TIyu64MdwB4FaSirQ608PP/TzUyslyOeHGwQ0eTHUZeJrK1ILOmwUHaJtV693m2JoUYroUDpw== +vscode@^1.1.36: + version "1.1.36" + resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.36.tgz#5e1a0d1bf4977d0c7bc5159a9a13d5b104d4b1b6" + integrity sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ== + dependencies: + glob "^7.1.2" + mocha "^5.2.0" + request "^2.88.0" + semver "^5.4.1" + source-map-support "^0.5.0" + url-parse "^1.4.4" + vscode-test "^0.4.1" + which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" From e8cb0173719a880ffb60c2762b8a06d683d7dc20 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:22:20 +0100 Subject: [PATCH 19/48] Register mkdtemp command --- .../contrib/files/electron-browser/files.contribution.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts b/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts index eda8317d40d..13d6cff9e2e 100644 --- a/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts @@ -10,6 +10,10 @@ import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileE import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { NativeTextFileEditor } from 'vs/workbench/contrib/files/electron-browser/textFileEditor'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import * as os from 'os'; +import * as fs from 'fs'; +import * as path from 'path'; // Register file editor Registry.as(EditorExtensions.Editors).registerEditor( @@ -22,3 +26,8 @@ Registry.as(EditorExtensions.Editors).registerEditor( new SyncDescriptor(FileEditorInput) ] ); + +// Register mkdtemp command +CommandsRegistry.registerCommand('mkdtemp', function () { + return fs.promises.mkdtemp(path.join(os.tmpdir(), 'vscodetmp-')); +}); From 765a8e1f010852cf7fd1be8dceb4360062919baf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:32:02 +0100 Subject: [PATCH 20/48] simplify integration script --- scripts/test-integration.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 89851e48908..0bd4e22e7c5 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -4,13 +4,12 @@ set -e if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } ROOT=$(dirname $(dirname $(realpath "$0"))) - VSCODEUSERDATADIR=`mktemp -d -t 'myuserdatadir'` else ROOT=$(dirname $(dirname $(readlink -f $0))) - VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` LINUX_NO_SANDBOX="--no-sandbox" # Electron 6 introduces a chrome-sandbox that requires root to run. This can fail. Disable sandbox via --no-sandbox. fi +VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` cd $ROOT # Figure out which Electron to use for running tests From de3513578c6932cd6f4bc774fc33899490810237 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:35:16 +0100 Subject: [PATCH 21/48] add git to integration tests --- scripts/test-integration.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 0bd4e22e7c5..a6b98ca8413 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -45,6 +45,7 @@ fi "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --skip-getting-started --user-data-dir=$VSCODEUSERDATADIR "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --skip-getting-started --user-data-dir=$VSCODEUSERDATADIR "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --skip-getting-started --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --skip-getting-started --user-data-dir=$VSCODEUSERDATADIR mkdir -p $ROOT/extensions/emmet/test-fixtures "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --skip-getting-started --user-data-dir=$VSCODEUSERDATADIR From aeb205903a7bf87379cdcdf520ac667f1989c305 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:35:22 +0100 Subject: [PATCH 22/48] add git tests launch config --- .vscode/launch.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 13c87d635f3..2f7b572faec 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -79,6 +79,24 @@ "order": 6 } }, + { + "type": "extensionHost", + "request": "launch", + "name": "VS Code Git Tests", + "runtimeExecutable": "${execPath}", + "args": [ + "/tmp/my4g9l", + "--extensionDevelopmentPath=${workspaceFolder}/extensions/git", + "--extensionTestsPath=${workspaceFolder}/extensions/git/out/test" + ], + "outFiles": [ + "${workspaceFolder}/extensions/git/out/**/*.js" + ], + "presentation": { + "group": "5_tests", + "order": 6 + } + }, { "type": "extensionHost", "request": "launch", @@ -167,7 +185,9 @@ "webRoot": "${workspaceFolder}", // Settings for js-debug: "pauseForSourceMap": false, - "outFiles": ["${workspaceFolder}/out/**/*.js"], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], }, { "type": "node", From 4945918d221b2026e96b098daf74c951157b2a02 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 4 Feb 2020 12:43:57 +0100 Subject: [PATCH 23/48] Add min and max to devcontainer.json forwardedPorts values Fixes https://github.com/microsoft/vscode-remote-release/issues/2218 --- .../configuration-editing/schemas/devContainer.schema.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/configuration-editing/schemas/devContainer.schema.json b/extensions/configuration-editing/schemas/devContainer.schema.json index b1ed32ab9f2..0d47b27bec9 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.json @@ -29,7 +29,9 @@ "type": "array", "description": "Ports that are forwarded from the container to the local machine.", "items": { - "type": "integer" + "type": "integer", + "maximum": 65535, + "minimum": 0 } }, "remoteEnv": { From ce183bc3489fc4f029da20aff24c4fef3f8c4d59 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:46:15 +0100 Subject: [PATCH 24/48] add git to windows integration tests --- scripts/test-integration.bat | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 695f1c940fe..505faa7e629 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -49,6 +49,9 @@ if %errorlevel% neq 0 exit /b %errorlevel% call "%INTEGRATION_TEST_ELECTRON_PATH%" $%~dp0\..\extensions\emmet\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . if %errorlevel% neq 0 exit /b %errorlevel% +call "%INTEGRATION_TEST_ELECTRON_PATH%" %TMP%\git-%RANDOM%-%TIME:~6,5% --extensionDevelopmentPath=%~dp0\..\extensions\git --extensionTestsPath=%~dp0\..\extensions\git\out\test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . +if %errorlevel% neq 0 exit /b %errorlevel% + :: Tests in commonJS (HTML, CSS, JSON language server tests...) call .\scripts\node-electron.bat .\node_modules\mocha\bin\_mocha .\extensions\*\server\out\test\**\*.test.js if %errorlevel% neq 0 exit /b %errorlevel% From a2defb0625cfb25738a467aa917d5694b49c27ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 12:49:59 +0100 Subject: [PATCH 25/48] fix build --- extensions/git/src/timelineProvider.ts | 4 ++-- extensions/git/src/util.ts | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/extensions/git/src/timelineProvider.ts b/extensions/git/src/timelineProvider.ts index 211b1cd1502..5559d785a27 100644 --- a/extensions/git/src/timelineProvider.ts +++ b/extensions/git/src/timelineProvider.ts @@ -85,7 +85,7 @@ export class GitTimelineProvider implements TimelineProvider { return { id: c.hash, timestamp: c.authorDate?.getTime() ?? 0, - iconPath: new ThemeIcon('git-commit'), + iconPath: new (ThemeIcon as any)('git-commit'), label: message, description: `${dateFormatter.fromNow()} \u2022 ${c.authorName}`, detail: `${c.authorName} (${c.authorEmail}) \u2014 ${c.hash.substr(0, 8)}\n${dateFormatter.fromNow()} (${dateFormatter.format('MMMM Do, YYYY h:mma')})\n\n${c.message}`, @@ -129,7 +129,7 @@ export class GitTimelineProvider implements TimelineProvider { id: '~', timestamp: date.getTime(), // TODO[ECA]: Replace with a better icon -- reflecting its status maybe? - iconPath: new ThemeIcon('git-commit'), + iconPath: new (ThemeIcon as any)('git-commit'), label: 'Staged Changes', description: `${dateFormatter.fromNow()} \u2022 You`, detail: `You \u2014 Index\n${dateFormatter.fromNow()} (${dateFormatter.format('MMMM Do, YYYY h:mma')})\n${status}`, diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index 3110168343b..74b353f518a 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vscode'; +import { Event, Disposable } from 'vscode'; import { dirname, sep } from 'path'; import { Readable } from 'stream'; import { promises as fs, createReadStream } from 'fs'; @@ -33,15 +33,15 @@ export function combinedDisposable(disposables: IDisposable[]): IDisposable { export const EmptyDisposable = toDisposable(() => null); export function fireEvent(event: Event): Event { - return (listener, thisArgs = null, disposables?) => event(_ => (listener as any).call(thisArgs), null, disposables); + return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => event(_ => (listener as any).call(thisArgs), null, disposables); } export function mapEvent(event: Event, map: (i: I) => O): Event { - return (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables); + return (listener: (e: O) => any, thisArgs?: any, disposables?: Disposable[]) => event(i => listener.call(thisArgs, map(i)), null, disposables); } export function filterEvent(event: Event, filter: (e: T) => boolean): Event { - return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); + return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } export function latchEvent(event: Event): Event { @@ -57,7 +57,7 @@ export function latchEvent(event: Event): Event { } export function anyEvent(...events: Event[]): Event { - return (listener, thisArgs = null, disposables?) => { + return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => { const result = combinedDisposable(events.map(event => event(i => listener.call(thisArgs, i)))); if (disposables) { @@ -73,7 +73,7 @@ export function done(promise: Promise): Promise { } export function onceEvent(event: Event): Event { - return (listener, thisArgs = null, disposables?) => { + return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => { const result = event(e => { result.dispose(); return listener.call(thisArgs, e); @@ -84,7 +84,7 @@ export function onceEvent(event: Event): Event { } export function debounceEvent(event: Event, delay: number): Event { - return (listener, thisArgs = null, disposables?) => { + return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => { let timer: NodeJS.Timer; return event(e => { clearTimeout(timer); From df3b99ba4515f9a2dc4b2b8bfa4008cd4040d638 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 12:51:45 +0100 Subject: [PATCH 26/48] Just use `leftoverVisibleColumns` for having the cursor always go to the end of line --- src/vs/editor/common/controller/cursorCommon.ts | 11 +++-------- .../common/controller/cursorMoveOperations.ts | 15 ++++----------- src/vs/editor/common/controller/oneCursor.ts | 6 +++--- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index d981f26a0a0..ac269997918 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -277,21 +277,18 @@ export class SingleCursorState { public readonly position: Position; public readonly leftoverVisibleColumns: number; public readonly selection: Selection; - public readonly isEnd: boolean; constructor( selectionStart: Range, selectionStartLeftoverVisibleColumns: number, position: Position, leftoverVisibleColumns: number, - isEnd: boolean = false ) { this.selectionStart = selectionStart; this.selectionStartLeftoverVisibleColumns = selectionStartLeftoverVisibleColumns; this.position = position; this.leftoverVisibleColumns = leftoverVisibleColumns; this.selection = SingleCursorState._computeSelection(this.selectionStart, this.position); - this.isEnd = isEnd; } public equals(other: SingleCursorState) { @@ -307,15 +304,14 @@ export class SingleCursorState { return (!this.selection.isEmpty() || !this.selectionStart.isEmpty()); } - public move(inSelectionMode: boolean, lineNumber: number, column: number, leftoverVisibleColumns: number, isEnd: boolean = false): SingleCursorState { + public move(inSelectionMode: boolean, lineNumber: number, column: number, leftoverVisibleColumns: number): SingleCursorState { if (inSelectionMode) { // move just position return new SingleCursorState( this.selectionStart, this.selectionStartLeftoverVisibleColumns, new Position(lineNumber, column), - leftoverVisibleColumns, - isEnd + leftoverVisibleColumns ); } else { // move everything @@ -323,8 +319,7 @@ export class SingleCursorState { new Range(lineNumber, column, lineNumber, column), leftoverVisibleColumns, new Position(lineNumber, column), - leftoverVisibleColumns, - isEnd + leftoverVisibleColumns ); } } diff --git a/src/vs/editor/common/controller/cursorMoveOperations.ts b/src/vs/editor/common/controller/cursorMoveOperations.ts index 8be77b1031c..df45d78e9f9 100644 --- a/src/vs/editor/common/controller/cursorMoveOperations.ts +++ b/src/vs/editor/common/controller/cursorMoveOperations.ts @@ -7,6 +7,7 @@ import { CursorColumns, CursorConfiguration, ICursorSimpleModel, SingleCursorSta import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import * as strings from 'vs/base/common/strings'; +import { Constants } from 'vs/base/common/uint'; export class CursorPosition { _cursorPositionBrand: void; @@ -122,13 +123,9 @@ export class MoveOperations { column = cursor.position.column; } - if (cursor.isEnd) { - column = model.getLineMaxColumn(lineNumber + 1); - } - let r = MoveOperations.down(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true); - return cursor.move(inSelectionMode, r.lineNumber, cursor.isEnd ? column : r.column, r.leftoverVisibleColumns, cursor.isEnd); + return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); } public static translateDown(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState): SingleCursorState { @@ -178,13 +175,9 @@ export class MoveOperations { column = cursor.position.column; } - if (cursor.isEnd) { - column = model.getLineMaxColumn(lineNumber - 1); - } - let r = MoveOperations.up(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true); - return cursor.move(inSelectionMode, r.lineNumber, cursor.isEnd ? column : r.column, r.leftoverVisibleColumns, cursor.isEnd); + return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); } public static translateUp(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState): SingleCursorState { @@ -222,7 +215,7 @@ export class MoveOperations { public static moveToEndOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { let lineNumber = cursor.position.lineNumber; let maxColumn = model.getLineMaxColumn(lineNumber); - return cursor.move(inSelectionMode, lineNumber, maxColumn, 0, true); + return cursor.move(inSelectionMode, lineNumber, maxColumn, Constants.MAX_SAFE_SMALL_INTEGER - maxColumn); } public static moveToBeginningOfBuffer(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 07716dbb5de..2bb09583133 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -99,7 +99,7 @@ export class OneCursor { ); const leftoverVisibleColumns = modelState.position.equals(position) ? modelState.leftoverVisibleColumns : 0; - modelState = new SingleCursorState(selectionStart, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns, modelState.isEnd); + modelState = new SingleCursorState(selectionStart, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns); } if (!viewState) { @@ -108,12 +108,12 @@ export class OneCursor { const viewSelectionStart2 = context.convertModelPositionToViewPosition(new Position(modelState.selectionStart.endLineNumber, modelState.selectionStart.endColumn)); const viewSelectionStart = new Range(viewSelectionStart1.lineNumber, viewSelectionStart1.column, viewSelectionStart2.lineNumber, viewSelectionStart2.column); const viewPosition = context.convertModelPositionToViewPosition(modelState.position); - viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns, modelState.isEnd); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); } else { // Validate new view state const viewSelectionStart = context.validateViewRange(viewState.selectionStart, modelState.selectionStart); const viewPosition = context.validateViewPosition(viewState.position, modelState.position); - viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns, viewState.isEnd); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); } this.modelState = modelState; From aad809c0552eca5628f49c3c275dd13889553d7b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Feb 2020 12:49:22 +0100 Subject: [PATCH 27/48] #89993 use composite's instantiation service --- src/vs/workbench/browser/parts/views/views.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 52ecfe80c29..9945355961e 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -467,8 +467,7 @@ export class ViewsService extends Disposable implements IViewsService { constructor( @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, @IPanelService private readonly panelService: IPanelService, - @IViewletService private readonly viewletService: IViewletService, - @IInstantiationService private readonly instantiationService: IInstantiationService, + @IViewletService private readonly viewletService: IViewletService ) { super(); @@ -628,8 +627,7 @@ export class ViewsService extends Disposable implements IViewsService { return null; } - createContainer(container: ViewContainer): ViewPaneContainer { - const viewPaneContainer: ViewPaneContainer = this._register((this.instantiationService as any).createInstance(container.ctorDescriptor!.ctor, ...(container.ctorDescriptor!.staticArguments || []))); + registerViewPaneContainer(viewPaneContainer: ViewPaneContainer): ViewPaneContainer { this._register(viewPaneContainer.onDidAddViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() })))); this._register(viewPaneContainer.onDidChangeViewVisibility(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() }))); this._register(viewPaneContainer.onDidRemoveViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: false })))); @@ -666,7 +664,9 @@ registerSingleton(IViewsService, ViewsService); @IWorkspaceContextService contextService: IWorkspaceContextService, @IViewsService viewsService: ViewsService ) { - super(viewContainer.id, viewsService.createContainer(viewContainer), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); + // Use composite's instantiation service to get the editor progress service for any editors instantiated within the composite + const viewPaneContainer = viewsService.registerViewPaneContainer((instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || []))); + super(viewContainer.id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); } } Registry.as(PanelExtensions.Panels).registerPanel(PanelDescriptor.create( @@ -690,9 +690,12 @@ registerSingleton(IViewsService, ViewsService); @IInstantiationService instantiationService: IInstantiationService, @IThemeService themeService: IThemeService, @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService + @IExtensionService extensionService: IExtensionService, + @IViewsService viewsService: ViewsService ) { - super(viewContainer.id, (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])), telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); + // Use composite's instantiation service to get the editor progress service for any editors instantiated within the composite + const viewPaneContainer = viewsService.registerViewPaneContainer((instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || []))); + super(viewContainer.id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); } } const viewletDescriptor = ViewletDescriptor.create( From 19de7a566cbcafcae82c3949c04c479b7404fc3b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 13:04:16 +0100 Subject: [PATCH 28/48] add proper git dev dependencies --- extensions/git/package.json | 2 + extensions/git/yarn.lock | 74 ++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index b3a7fa221be..c1cd8b5135c 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1781,6 +1781,8 @@ "@types/node": "^12.11.7", "@types/which": "^1.0.28", "mocha": "^3.2.0", + "mocha-junit-reporter": "^1.23.3", + "mocha-multi-reporters": "^1.1.7", "vscode": "^1.1.36" } } diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index ae873ebd83a..af5b10127dc 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -53,6 +53,11 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + applicationinsights@1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.8.tgz#db6e3d983cf9f9405fe1ee5ba30ac6e1914537b5" @@ -134,6 +139,11 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -163,6 +173,11 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -189,6 +204,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -428,6 +450,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -539,6 +566,20 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash@^4.16.4: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + mime-db@1.43.0: version "1.43.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" @@ -563,13 +604,32 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -mkdirp@0.5.1: +mkdirp@0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +mocha-junit-reporter@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz#941e219dd759ed732f8641e165918aa8b167c981" + integrity sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA== + dependencies: + debug "^2.2.0" + md5 "^2.1.0" + mkdirp "~0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.0" + +mocha-multi-reporters@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz#cc7f3f4d32f478520941d852abb64d9988587d82" + integrity sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI= + dependencies: + debug "^3.1.0" + lodash "^4.16.4" + mocha@^3.2.0: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" @@ -741,6 +801,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" @@ -854,6 +921,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +xml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + zone.js@0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" From acd2c6f387b3cf9f5cbdc02f87b34f2c6aa823a8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 13:04:38 +0100 Subject: [PATCH 29/48] fix tests --- scripts/test-integration.bat | 1 + scripts/test-integration.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 505faa7e629..9d439a2d191 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -22,6 +22,7 @@ if "%INTEGRATION_TEST_ELECTRON_PATH%"=="" ( call yarn gulp compile-extension:css-language-features-server call yarn gulp compile-extension:html-language-features-server call yarn gulp compile-extension:json-language-features-server + call yarn gulp compile-extension:git :: Configuration for more verbose output set VSCODE_CLI=1 diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index a6b98ca8413..18741689645 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -28,6 +28,7 @@ else yarn gulp compile-extension:css-language-features-server yarn gulp compile-extension:html-language-features-server yarn gulp compile-extension:json-language-features-server + yarn gulp compile-extension:git # Configuration for more verbose output export VSCODE_CLI=1 From cfc452e466b2169e277fd8a9ba10a81d20088f74 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Feb 2020 12:06:50 +0100 Subject: [PATCH 30/48] smoketest - use element ID for status item selectors --- test/automation/src/statusbar.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/test/automation/src/statusbar.ts b/test/automation/src/statusbar.ts index d090e9938a7..362562c38bc 100644 --- a/test/automation/src/statusbar.ts +++ b/test/automation/src/statusbar.ts @@ -20,8 +20,6 @@ export const enum StatusBarElement { export class StatusBar { private readonly mainSelector = 'div[id="workbench.parts.statusbar"]'; - private readonly leftSelector = '.statusbar-item.left'; - private readonly rightSelector = '.statusbar-item.right'; constructor(private code: Code) { } @@ -44,23 +42,23 @@ export class StatusBar { private getSelector(element: StatusBarElement): string { switch (element) { case StatusBarElement.BRANCH_STATUS: - return `${this.mainSelector} ${this.leftSelector} .codicon.codicon-git-branch`; + return `.statusbar-item[id="status.scm"] .codicon.codicon-git-branch`; case StatusBarElement.SYNC_STATUS: - return `${this.mainSelector} ${this.leftSelector} .codicon.codicon-sync`; + return `.statusbar-item[id="status.scm"] .codicon.codicon-sync`; case StatusBarElement.PROBLEMS_STATUS: - return `${this.mainSelector} ${this.leftSelector} .codicon.codicon-error`; + return `.statusbar-item[id="status.problems"]`; case StatusBarElement.SELECTION_STATUS: - return `${this.mainSelector} ${this.rightSelector}[title="Go to Line"]`; + return `.statusbar-item[id="status.editor.selection"]`; case StatusBarElement.INDENTATION_STATUS: - return `${this.mainSelector} ${this.rightSelector}[title="Select Indentation"]`; + return `.statusbar-item[id="status.editor.indentation"]`; case StatusBarElement.ENCODING_STATUS: - return `${this.mainSelector} ${this.rightSelector}[title="Select Encoding"]`; + return `.statusbar-item[id="status.editor.encoding"]`; case StatusBarElement.EOL_STATUS: - return `${this.mainSelector} ${this.rightSelector}[title="Select End of Line Sequence"]`; + return `.statusbar-item[id="status.editor.eol"]`; case StatusBarElement.LANGUAGE_STATUS: - return `${this.mainSelector} ${this.rightSelector}[title="Select Language Mode"]`; + return `.statusbar-item[id="status.editor.mode"]`; case StatusBarElement.FEEDBACK_ICON: - return `${this.mainSelector} .statusbar-item.right[id="status.feedback"]`; + return `.statusbar-item[id="status.feedback"]`; default: throw new Error(element); } From a15803b9e740f50b7d5a7bb05b724654332b9a0b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Feb 2020 14:50:47 +0100 Subject: [PATCH 31/48] smoke test - add attribute for tabs to simplify lookup --- .../browser/parts/editor/tabsTitleControl.ts | 11 ++++++++++- test/automation/src/editors.ts | 18 +++++++++--------- .../src/areas/workbench/data-loss.test.ts | 6 +++--- .../src/areas/workbench/data-migration.test.ts | 4 ++-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 54a71784d29..94711974ea8 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -42,6 +42,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { withNullAsUndefined, assertAllDefined, assertIsDefined } from 'vs/base/common/types'; import { ILabelService } from 'vs/platform/label/common/label'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { basenameOrAuthority } from 'vs/base/common/resources'; interface IEditorInputLabel { name?: string; @@ -941,7 +942,15 @@ export class TabsTitleControl extends TitleControl { tabContainer.title = title; // Label - tabLabelWidget.setResource({ name, description, resource: toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }) }, { title, extraClasses: ['tab-label'], italic: !this.group.isPinned(editor) }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + tabLabelWidget.setResource({ name, description, resource }, { title, extraClasses: ['tab-label'], italic: !this.group.isPinned(editor) }); + + // Tests helper + if (resource) { + tabContainer.setAttribute('data-resource-name', basenameOrAuthority(resource)); + } else { + tabContainer.removeAttribute('data-resource-name'); + } } private redrawEditorActiveAndDirty(isGroupActive: boolean, editor: IEditorInput, tabContainer: HTMLElement, tabLabelWidget: IResourceLabel): void { diff --git a/test/automation/src/editors.ts b/test/automation/src/editors.ts index ef088e464d2..dac1f1e40df 100644 --- a/test/automation/src/editors.ts +++ b/test/automation/src/editors.ts @@ -17,27 +17,27 @@ export class Editors { } } - async selectTab(tabName: string, untitled: boolean = false): Promise { - await this.code.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); - await this.waitForEditorFocus(tabName, untitled); + async selectTab(fileName: string): Promise { + await this.code.waitAndClick(`.tabs-container div.tab[data-resource-name$="${fileName}"]`); + await this.waitForEditorFocus(fileName); } - async waitForActiveEditor(filename: string): Promise { - const selector = `.editor-instance .monaco-editor[data-uri$="${filename}"] textarea`; + async waitForActiveEditor(fileName: string): Promise { + const selector = `.editor-instance .monaco-editor[data-uri$="${fileName}"] textarea`; return this.code.waitForActiveElement(selector); } - async waitForEditorFocus(fileName: string, untitled: boolean = false): Promise { + async waitForEditorFocus(fileName: string): Promise { await this.waitForActiveTab(fileName); await this.waitForActiveEditor(fileName); } async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { - await this.code.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); + await this.code.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][data-resource-name$="${fileName}"]`); } async waitForTab(fileName: string, isDirty: boolean = false): Promise { - await this.code.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); + await this.code.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[data-resource-name$="${fileName}"]`); } async newUntitledFile(): Promise { @@ -47,6 +47,6 @@ export class Editors { await this.code.dispatchKeybinding('ctrl+n'); } - await this.waitForEditorFocus('Untitled-1', true); + await this.waitForEditorFocus('Untitled-1'); } } diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index cb049e59ad3..07ca7f83886 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -12,7 +12,7 @@ export function setup() { await app.workbench.editors.newUntitledFile(); const untitled = 'Untitled-1'; - const textToTypeInUntitled = untitled; + const textToTypeInUntitled = 'Hello from Untitled'; await app.workbench.editor.waitForTypeInEditor(untitled, textToTypeInUntitled); const readmeMd = 'readme.md'; @@ -25,8 +25,8 @@ export function setup() { await app.workbench.editors.waitForActiveTab(readmeMd, true); await app.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); - await app.workbench.editors.waitForTab(untitled, true); - await app.workbench.editors.selectTab(untitled, true); + await app.workbench.editors.waitForTab(untitled); + await app.workbench.editors.selectTab(untitled); await app.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); }); }); diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index e455105ed4d..0a403bef78d 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -66,7 +66,7 @@ export function setup(stableCodePath: string, testDataPath: string) { await stableApp.workbench.editors.newUntitledFile(); const untitled = 'Untitled-1'; - const textToTypeInUntitled = untitled; + const textToTypeInUntitled = 'Hello from Untitled'; await stableApp.workbench.editor.waitForTypeInEditor(untitled, textToTypeInUntitled); const readmeMd = 'readme.md'; @@ -86,7 +86,7 @@ export function setup(stableCodePath: string, testDataPath: string) { await insidersApp.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); await insidersApp.workbench.editors.waitForTab(untitled, true); - await insidersApp.workbench.editors.selectTab(untitled, true); + await insidersApp.workbench.editors.selectTab(untitled); await insidersApp.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); await insidersApp.stop(); From 8066726b2752fee926dbc4d4b3ba1a9a3968c09d Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 4 Feb 2020 15:00:56 +0100 Subject: [PATCH 32/48] Allow both : an . as time separators in tsc problem pattern Fixes https://github.com/microsoft/vscode/issues/89273 --- extensions/typescript-language-features/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index a964fcfb712..7f2f202e926 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -882,10 +882,10 @@ "background": { "activeOnStart": true, "beginsPattern": { - "regexp": "^\\s*(?:message TS6032:|\\[?\\D*\\d{1,2}:\\d{1,2}:\\d{1,2}\\D*(?:\\]| -)) File change detected\\. Starting incremental compilation\\.\\.\\." + "regexp": "^\\s*(?:message TS6032:|\\[?\\D*\\d{1,2}[:.]\\d{1,2}[:.]\\d{1,2}\\D*(?:\\]| -)) File change detected\\. Starting incremental compilation\\.\\.\\." }, "endsPattern": { - "regexp": "^\\s*(?:message TS6042:|\\[?\\D*\\d{1,2}:\\d{1,2}:\\d{1,2}\\D*(?:\\]| -)) (?:Compilation complete\\.|Found \\d+ errors?\\.) Watching for file changes\\." + "regexp": "^\\s*(?:message TS6042:|\\[?\\D*\\d{1,2}[:.]\\d{1,2}[:.]\\d{1,2}\\D*(?:\\]| -)) (?:Compilation complete\\.|Found \\d+ errors?\\.) Watching for file changes\\." } } } From 3900de53e044b5417a8fb4bf2ba21a6ea0453f88 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Feb 2020 15:43:23 +0100 Subject: [PATCH 33/48] debug: introduce intregration tests --- .../src/singlefolder-tests/debug.test.ts | 130 ++++++++++++++++++ .../testWorkspace/.vscode/launch.json | 15 ++ .../vscode-api-tests/testWorkspace/debug.js | 10 ++ 3 files changed, 155 insertions(+) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts create mode 100644 extensions/vscode-api-tests/testWorkspace/.vscode/launch.json create mode 100644 extensions/vscode-api-tests/testWorkspace/debug.js diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts new file mode 100644 index 00000000000..97eca08bc71 --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts @@ -0,0 +1,130 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { debug, workspace, commands, window, Disposable } from 'vscode'; +import { basename } from 'path'; +import { disposeAll, createRandomFile } from '../utils'; + +suite('Debug', function () { + + test('breakpoints', async function () { + assert.equal(debug.breakpoints.length, 0); + let onDidChangeBreakpointsCounter = 0; + const toDispose: Disposable[] = []; + let onBreakpointsChange: () => void; + + toDispose.push(debug.onDidChangeBreakpoints(() => { + onDidChangeBreakpointsCounter++; + if (onBreakpointsChange) { + onBreakpointsChange(); + } + })); + + debug.addBreakpoints([{ id: '1', enabled: true }, { id: '2', enabled: false, condition: '2 < 5' }]); + assert.equal(onDidChangeBreakpointsCounter, 1); + assert.equal(debug.breakpoints.length, 2); + assert.equal(debug.breakpoints[0].id, '1'); + assert.equal(debug.breakpoints[1].id, '2'); + assert.equal(debug.breakpoints[1].condition, '2 < 5'); + + debug.removeBreakpoints([{ id: '1', enabled: true }]); + assert.equal(onDidChangeBreakpointsCounter, 2); + assert.equal(debug.breakpoints.length, 1); + + debug.removeBreakpoints([{ id: '2', enabled: false }]); + assert.equal(onDidChangeBreakpointsCounter, 3); + assert.equal(debug.breakpoints.length, 0); + + const file = await createRandomFile('let i = 5;', undefined, '.js'); + const doc = await workspace.openTextDocument(file); + await window.showTextDocument(doc, undefined, false); + + const breakpointsChanged = new Promise(resolve => onBreakpointsChange = resolve); + await commands.executeCommand('editor.debug.action.toggleBreakpoint'); + await breakpointsChanged; + assert.equal(debug.breakpoints.length, 1); + assert.equal(debug.breakpoints[0].enabled, true); + + const breakpointsChangedSecond = new Promise(resolve => onBreakpointsChange = resolve); + await commands.executeCommand('editor.debug.action.toggleBreakpoint'); + await breakpointsChangedSecond; + assert.equal(debug.breakpoints.length, 0); + + disposeAll(toDispose); + }); + + test('start debugging', async function () { + assert.equal(debug.activeDebugSession, undefined); + let stoppedEvents = 0; + let variablesRetrieved: () => void; + const firstVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + const toDispose: Disposable[] = []; + toDispose.push(debug.registerDebugAdapterTrackerFactory('node2', { + createDebugAdapterTracker: () => ({ + onDidSendMessage: m => { + if (m.event === 'stopped') { + stoppedEvents++; + } + if (m.type === 'response' && m.command === 'variables') { + variablesRetrieved(); + } + } + }) + })); + + const success = await debug.startDebugging(workspace.workspaceFolders![0], 'Launch debug.js'); + assert.equal(success, true); + assert.notEqual(debug.activeDebugSession, undefined); + assert.equal(debug.activeDebugSession?.name, 'Launch debug.js'); + + await firstVariablesRetrieved; + assert.equal(stoppedEvents, 1); + + const secondVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + await commands.executeCommand('workbench.action.debug.stepOver'); + await secondVariablesRetrieved; + assert.equal(stoppedEvents, 2); + const editor = window.activeTextEditor; + assert.notEqual(editor, undefined); + assert.equal(basename(editor!.document.fileName), 'debug.js'); + + const thirdVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + await commands.executeCommand('workbench.action.debug.stepOver'); + await thirdVariablesRetrieved; + assert.equal(stoppedEvents, 3); + + const fourthVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + await commands.executeCommand('workbench.action.debug.stepInto'); + await fourthVariablesRetrieved; + assert.equal(stoppedEvents, 4); + + const fifthVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + await commands.executeCommand('workbench.action.debug.stepOut'); + await fifthVariablesRetrieved; + assert.equal(stoppedEvents, 5); + + let sessionTerminated: () => void; + toDispose.push(debug.onDidTerminateDebugSession(() => { + sessionTerminated(); + })); + const sessionTerminatedPromise = new Promise(resolve => sessionTerminated = resolve); + await commands.executeCommand('workbench.action.debug.stop'); + await sessionTerminatedPromise; + assert.equal(debug.activeDebugSession, undefined); + + disposeAll(toDispose); + }); + + test('start debugging failure', async function () { + let errorCount = 0; + try { + await debug.startDebugging(workspace.workspaceFolders![0], 'non existent'); + } catch (e) { + errorCount++; + } + assert.equal(errorCount, 1); + }); +}); diff --git a/extensions/vscode-api-tests/testWorkspace/.vscode/launch.json b/extensions/vscode-api-tests/testWorkspace/.vscode/launch.json new file mode 100644 index 00000000000..aab0367ea2b --- /dev/null +++ b/extensions/vscode-api-tests/testWorkspace/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch debug.js", + "stopOnEntry": true, + "program": "${workspaceFolder}/debug.js" + } + ] +} diff --git a/extensions/vscode-api-tests/testWorkspace/debug.js b/extensions/vscode-api-tests/testWorkspace/debug.js new file mode 100644 index 00000000000..1ca212281c7 --- /dev/null +++ b/extensions/vscode-api-tests/testWorkspace/debug.js @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +let y = 0; +for (let i = 0; i < 100; i++) { + console.log(y); + y = y + i; +} From 46d1d77dc7ace7a64745d7cc3388f66d6275696c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Feb 2020 15:49:51 +0100 Subject: [PATCH 34/48] debt - use "correct" context key for focused view --- .../contrib/bulkEdit/browser/bulkEdit.contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts index d5e503165f4..660b56fd9b4 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts @@ -10,7 +10,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { WorkspaceEdit } from 'vs/editor/common/modes'; import { BulkEditPane } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPane'; -import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; +import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, FocusedViewContext } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; import { ViewPaneContainer, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { PaneCompositePanel } from 'vs/workbench/browser/panel'; @@ -168,7 +168,7 @@ registerAction2(class ApplyAction extends Action2 { }], keybinding: { weight: KeybindingWeight.EditorContrib - 10, - when: ContextKeyExpr.and(BulkEditPreviewContribution.ctxEnabled, ContextKeyExpr.equals('activePanel', BulkEditPane.ID), ContextKeyExpr.has('panelFocus')), + when: ContextKeyExpr.and(BulkEditPreviewContribution.ctxEnabled, FocusedViewContext.isEqualTo(BulkEditPane.ID)), primary: KeyMod.Shift + KeyCode.Enter, } }); From d9b6ba716ec9e69f776d52c55cdb887ef511defc Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 15:59:45 +0100 Subject: [PATCH 35/48] Fix schema, use column instead of size & normalize options --- .../editor/browser/viewParts/rulers/rulers.ts | 14 +--- src/vs/editor/common/config/editorOptions.ts | 67 ++++++++++--------- src/vs/monaco.d.ts | 10 ++- 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 9f0490762d7..68621081a8e 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -92,19 +92,11 @@ export class Rulers extends ViewPart { for (let i = 0, len = this._rulers.length; i < len; i++) { const node = this._renderedRulers[i]; - const srcNode = this._rulers[i]; + const ruler = this._rulers[i]; - let rulerSize, rulerColor = ''; - if (typeof srcNode === 'number') { - rulerSize = srcNode; - } else { - rulerSize = srcNode.size; - rulerColor = `1px 0 0 0 ${srcNode.color} inset`; - } - - node.setBoxShadow(rulerColor); + node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``); node.setHeight(Math.min(ctx.scrollHeight, 1000000)); - node.setLeft(rulerSize * this._typicalHalfwidthCharacterWidth); + node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth); } } } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 16908e47dd9..73c30dd221b 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -58,7 +58,7 @@ export interface IEditorOptions { * Render vertical lines at the specified columns. * Defaults to empty array. */ - rulers?: IRulerOption[]; + rulers?: (number | IRulerOption)[]; /** * A string containing the word separators used when doing word navigation. * Defaults to `~!@#$%^&*()-=+[{]}\\|;:\'",.<>/? @@ -2361,39 +2361,38 @@ export function filterValidationDecorations(options: IComputedEditorOptions): bo //#region rulers -export interface IRulerColorOption { - readonly size: number; - readonly color: string; +export interface IRulerOption { + readonly column: number; + readonly color: string | null; } -export type IRulerOption = number | IRulerColorOption; - -class EditorRulers extends SimpleEditorOption { +class EditorRulers extends BaseEditorOption { constructor() { const defaults: IRulerOption[] = []; - const sizeSchema: IJSONSchema = { type: 'number', description: nls.localize('rulers.size', "Number of monospace characters at which this editor ruler will render.") }; - + const columnSchema: IJSONSchema = { type: 'number', description: nls.localize('rulers.size', "Number of monospace characters at which this editor ruler will render.") }; super( EditorOption.rulers, 'rulers', defaults, { type: 'array', - items: [ - sizeSchema, - { - type: [ - 'object' - ], - properties: { - size: sizeSchema, - color: { - type: 'string', - description: nls.localize('rulers.color', "Color of this editor ruler."), - format: 'color-hex' + items: { + anyOf: [ + columnSchema, + { + type: [ + 'object' + ], + properties: { + column: columnSchema, + color: { + type: 'string', + description: nls.localize('rulers.color', "Color of this editor ruler."), + format: 'color-hex' + } } } - } - ], + ] + }, default: defaults, description: nls.localize('rulers', "Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.") } @@ -2403,17 +2402,21 @@ class EditorRulers extends SimpleEditorOption ((typeof a === 'number') ? a : a.size) - ((typeof b === 'number') ? b : b.size)); + rulers.sort((a, b) => a.column - b.column); return rulers; } return this.defaultValue; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index f11a4d8bd7f..766b1d38f71 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2538,7 +2538,7 @@ declare namespace monaco.editor { * Render vertical lines at the specified columns. * Defaults to empty array. */ - rulers?: IRulerOption[]; + rulers?: (number | IRulerOption)[]; /** * A string containing the word separators used when doing word navigation. * Defaults to `~!@#$%^&*()-=+[{]}\\|;:\'",.<>/? @@ -3445,13 +3445,11 @@ declare namespace monaco.editor { readonly renderFn: ((lineNumber: number) => string) | null; } - export interface IRulerColorOption { - readonly size: number; - readonly color: string; + export interface IRulerOption { + readonly column: number; + readonly color: string | null; } - export type IRulerOption = number | IRulerColorOption; - /** * Configuration options for editor scrollbars */ From 8f90e851c557ed7dd1233573874e2f4db5f5e69b Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Feb 2020 16:13:56 +0100 Subject: [PATCH 36/48] remode debug smoke tests --- test/smoke/src/areas/debug/debug.test.ts | 122 ----------------------- test/smoke/src/main.ts | 2 - 2 files changed, 124 deletions(-) delete mode 100644 test/smoke/src/areas/debug/debug.test.ts diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts deleted file mode 100644 index ee19ff9fd16..00000000000 --- a/test/smoke/src/areas/debug/debug.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as assert from 'assert'; -import * as http from 'http'; -import * as path from 'path'; -import * as fs from 'fs'; -import * as stripJsonComments from 'strip-json-comments'; -import { Application } from '../../../../automation'; - -export function setup() { - describe('Debug', () => { - it('configure launch json', async function () { - const app = this.app as Application; - - await app.workbench.debug.openDebugViewlet(); - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.quickopen.runCommand('Debug: Open launch.json'); - - const launchJsonPath = path.join(app.workspacePathOrFolder, '.vscode', 'launch.json'); - const content = fs.readFileSync(launchJsonPath, 'utf8'); - const config = JSON.parse(stripJsonComments(content)); - config.configurations[0].protocol = 'inspector'; - fs.writeFileSync(launchJsonPath, JSON.stringify(config, undefined, 4), 'utf8'); - - // force load from disk since file events are sometimes missing - await app.workbench.quickopen.runCommand('File: Revert File'); - await app.workbench.editor.waitForEditorContents('launch.json', contents => /"protocol": "inspector"/.test(contents)); - - assert.equal(config.configurations[0].request, 'launch'); - assert.equal(config.configurations[0].type, 'node'); - if (process.platform === 'win32') { - assert.equal(config.configurations[0].program, '${workspaceFolder}\\bin\\www'); - } else { - assert.equal(config.configurations[0].program, '${workspaceFolder}/bin/www'); - } - }); - - it('breakpoints', async function () { - const app = this.app as Application; - - await app.workbench.quickopen.openFile('index.js'); - await app.workbench.debug.setBreakpointOnLine(6); - }); - - let port: number; - it('start debugging', async function () { - const app = this.app as Application; - - port = await app.workbench.debug.startDebugging(); - - await new Promise((c, e) => { - const request = http.get(`http://localhost:${port}`); - request.on('error', e); - app.workbench.debug.waitForStackFrame(sf => /index\.js$/.test(sf.name) && sf.lineNumber === 6, 'looking for index.js and line 6').then(c, e); - }); - }); - - it('focus stack frames and variables', async function () { - const app = this.app as Application; - - await app.workbench.debug.waitForVariableCount(4, 5); - - await app.workbench.debug.focusStackFrame('layer.js', 'looking for layer.js'); - await app.workbench.debug.waitForVariableCount(5, 6); - - await app.workbench.debug.focusStackFrame('route.js', 'looking for route.js'); - await app.workbench.debug.waitForVariableCount(3, 4); - - await app.workbench.debug.focusStackFrame('index.js', 'looking for index.js'); - await app.workbench.debug.waitForVariableCount(4, 5); - }); - - it('stepOver, stepIn, stepOut', async function () { - const app = this.app as Application; - - await app.workbench.debug.stepIn(); - - const first = await app.workbench.debug.waitForStackFrame(sf => /response\.js$/.test(sf.name), 'looking for response.js'); - await app.workbench.debug.stepOver(); - - await app.workbench.debug.waitForStackFrame(sf => /response\.js$/.test(sf.name) && sf.lineNumber === first.lineNumber + 1, `looking for response.js and line ${first.lineNumber + 1}`); - await app.workbench.debug.stepOut(); - - await app.workbench.debug.waitForStackFrame(sf => /index\.js$/.test(sf.name) && sf.lineNumber === 7, `looking for index.js and line 7`); - }); - - it('continue', async function () { - const app = this.app as Application; - - await app.workbench.debug.continue(); - - await new Promise((c, e) => { - const request = http.get(`http://localhost:${port}`); - request.on('error', e); - app.workbench.debug.waitForStackFrame(sf => /index\.js$/.test(sf.name) && sf.lineNumber === 6, `looking for index.js and line 6`).then(c, e); - }); - - }); - - it('debug console', async function () { - const app = this.app as Application; - - await app.workbench.debug.waitForReplCommand('2 + 2', r => r === '4'); - }); - - it('debug console link', async function () { - const app = this.app as Application; - - await app.workbench.debug.waitForReplCommand('"./app.js:5:1"', r => r.includes('app.js')); - await app.workbench.debug.waitForLink(); - }); - - it('stop debugging', async function () { - const app = this.app as Application; - - await app.workbench.debug.stopDebugging(); - }); - }); -} diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 1d84795e1b9..a6095fa6fa5 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -28,7 +28,6 @@ import { setup as setupDataPreferencesTests } from './areas/preferences/preferen import { setup as setupDataSearchTests } from './areas/search/search.test'; import { setup as setupDataCSSTests } from './areas/css/css.test'; import { setup as setupDataEditorTests } from './areas/editor/editor.test'; -import { setup as setupDataDebugTests } from './areas/debug/debug.test'; import { setup as setupDataGitTests } from './areas/git/git.test'; import { setup as setupDataStatusbarTests } from './areas/statusbar/statusbar.test'; import { setup as setupDataExtensionTests } from './areas/extensions/extensions.test'; @@ -303,7 +302,6 @@ describe('Running Code', () => { setupDataSearchTests(); setupDataCSSTests(); setupDataEditorTests(); - if (!opts.web) { setupDataDebugTests(); } setupDataGitTests(); setupDataStatusbarTests(!!opts.web); setupDataExtensionTests(); From 5df43457e8e9638741add99b35e8f30d6626fbff Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 4 Feb 2020 16:32:21 +0100 Subject: [PATCH 37/48] fix foldBackground description --- src/vs/editor/contrib/folding/folding.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/folding.ts index b236c12ab2a..71cc7b34b0e 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/folding.ts @@ -885,7 +885,7 @@ for (let i = 1; i <= 7; i++) { ); } -export const foldBackgroundBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hc: null }, nls.localize('editorSelectionBackground', "Color of the editor selection.")); +export const foldBackgroundBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hc: null }, nls.localize('foldBackgroundBackground', "Background color behind folded ranges.")); registerThemingParticipant((theme, collector) => { const foldBackground = theme.getColor(foldBackgroundBackground); From 491a17bd714c9e8784dd383cb546958e7bcee909 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Feb 2020 16:39:10 +0100 Subject: [PATCH 38/48] debug integrations tests: better testing of starting of debug --- .../src/singlefolder-tests/debug.test.ts | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts index 97eca08bc71..57bc7b517fe 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts @@ -59,8 +59,12 @@ suite('Debug', function () { test('start debugging', async function () { assert.equal(debug.activeDebugSession, undefined); let stoppedEvents = 0; - let variablesRetrieved: () => void; - const firstVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + let variablesReceived: () => void; + let capabilitiesReceived: () => void; + let initializedReceived: () => void; + let configurationDoneReceived: () => void; + + const firstVariablesRetrieved = new Promise(resolve => variablesReceived = resolve); const toDispose: Disposable[] = []; toDispose.push(debug.registerDebugAdapterTrackerFactory('node2', { createDebugAdapterTracker: () => ({ @@ -69,21 +73,37 @@ suite('Debug', function () { stoppedEvents++; } if (m.type === 'response' && m.command === 'variables') { - variablesRetrieved(); + variablesReceived(); + } + if (m.event === 'capabilities') { + capabilitiesReceived(); + } + if (m.event === 'initialized') { + initializedReceived(); + } + if (m.command === 'configurationDone') { + configurationDoneReceived(); } } }) })); + const capabilitiesPromise = new Promise(resolve => capabilitiesReceived = resolve); + const initializedPromise = new Promise(resolve => initializedReceived = resolve); + const configurationDonePromise = new Promise(resolve => configurationDoneReceived = resolve); const success = await debug.startDebugging(workspace.workspaceFolders![0], 'Launch debug.js'); assert.equal(success, true); + await capabilitiesPromise; + await initializedPromise; + await configurationDonePromise; + assert.notEqual(debug.activeDebugSession, undefined); assert.equal(debug.activeDebugSession?.name, 'Launch debug.js'); await firstVariablesRetrieved; assert.equal(stoppedEvents, 1); - const secondVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + const secondVariablesRetrieved = new Promise(resolve => variablesReceived = resolve); await commands.executeCommand('workbench.action.debug.stepOver'); await secondVariablesRetrieved; assert.equal(stoppedEvents, 2); @@ -91,17 +111,17 @@ suite('Debug', function () { assert.notEqual(editor, undefined); assert.equal(basename(editor!.document.fileName), 'debug.js'); - const thirdVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + const thirdVariablesRetrieved = new Promise(resolve => variablesReceived = resolve); await commands.executeCommand('workbench.action.debug.stepOver'); await thirdVariablesRetrieved; assert.equal(stoppedEvents, 3); - const fourthVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + const fourthVariablesRetrieved = new Promise(resolve => variablesReceived = resolve); await commands.executeCommand('workbench.action.debug.stepInto'); await fourthVariablesRetrieved; assert.equal(stoppedEvents, 4); - const fifthVariablesRetrieved = new Promise(resolve => variablesRetrieved = resolve); + const fifthVariablesRetrieved = new Promise(resolve => variablesReceived = resolve); await commands.executeCommand('workbench.action.debug.stepOut'); await fifthVariablesRetrieved; assert.equal(stoppedEvents, 5); From 16c7551f3664b713835b39faeb6c2db859c87647 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Feb 2020 16:58:20 +0100 Subject: [PATCH 39/48] move git smoke tests to integration tests --- extensions/git/src/api/api1.ts | 6 +- extensions/git/src/api/git.d.ts | 10 +++ extensions/git/src/commands.ts | 4 +- extensions/git/src/git.ts | 10 +-- extensions/git/src/repository.ts | 4 +- extensions/git/src/test/smoke.test.ts | 116 ++++++++++++++++++++++++++ test/smoke/src/areas/git/git.test.ts | 80 ------------------ test/smoke/src/main.ts | 2 - 8 files changed, 136 insertions(+), 96 deletions(-) create mode 100644 extensions/git/src/test/smoke.test.ts delete mode 100644 test/smoke/src/areas/git/git.test.ts diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts index 3e389285312..0b6ed8550aa 100644 --- a/extensions/git/src/api/api1.ts +++ b/extensions/git/src/api/api1.ts @@ -5,7 +5,7 @@ import { Model } from '../model'; import { Repository as BaseRepository, Resource } from '../repository'; -import { InputBox, Git, API, Repository, Remote, RepositoryState, Branch, Ref, Submodule, Commit, Change, RepositoryUIState, Status, LogOptions, APIState } from './git'; +import { InputBox, Git, API, Repository, Remote, RepositoryState, Branch, Ref, Submodule, Commit, Change, RepositoryUIState, Status, LogOptions, APIState, CommitOptions } from './git'; import { Event, SourceControlInputBox, Uri, SourceControl } from 'vscode'; import { mapEvent } from '../util'; import { toGitUri } from '../uri'; @@ -202,6 +202,10 @@ export class ApiRepository implements Repository { log(options?: LogOptions): Promise { return this._repository.log(options); } + + commit(message: string, opts?: CommitOptions): Promise { + return this._repository.commit(message, opts); + } } export class ApiGit implements Git { diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index d3bdd3de44b..e1efe1299fc 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -121,6 +121,14 @@ export interface LogOptions { readonly maxEntries?: number; } +export interface CommitOptions { + all?: boolean | 'tracked'; + amend?: boolean; + signoff?: boolean; + signCommit?: boolean; + empty?: boolean; +} + export interface Repository { readonly rootUri: Uri; @@ -176,6 +184,8 @@ export interface Repository { blame(path: string): Promise; log(options?: LogOptions): Promise; + + commit(message: string, opts?: CommitOptions): Promise; } export type APIState = 'uninitialized' | 'initialized'; diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 46958a026aa..be0f5387d15 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -9,8 +9,8 @@ import * as path from 'path'; import { commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder } from 'vscode'; import TelemetryReporter from 'vscode-extension-telemetry'; import * as nls from 'vscode-nls'; -import { Branch, GitErrorCodes, Ref, RefType, Status } from './api/git'; -import { CommitOptions, ForcePushMode, Git, Stash } from './git'; +import { Branch, GitErrorCodes, Ref, RefType, Status, CommitOptions } from './api/git'; +import { ForcePushMode, Git, Stash } from './git'; import { Model } from './model'; import { Repository, Resource, ResourceGroupType } from './repository'; import { applyLineChanges, getModifiedRange, intersectDiffWithRange, invertLineChange, toLineRanges } from './staging'; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 07baace3704..ebf998d2168 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -15,7 +15,7 @@ import { assign, groupBy, IDisposable, toDisposable, dispose, mkdirp, readBytes, import { CancellationToken, Progress, Uri } from 'vscode'; import { URI } from 'vscode-uri'; import { detectEncoding } from './encoding'; -import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status } from './api/git'; +import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status, CommitOptions } from './api/git'; import * as byline from 'byline'; import { StringDecoder } from 'string_decoder'; @@ -725,14 +725,6 @@ export function parseLsFiles(raw: string): LsFilesElement[] { .map(([, mode, object, stage, file]) => ({ mode, object, stage, file })); } -export interface CommitOptions { - all?: boolean | 'tracked'; - amend?: boolean; - signoff?: boolean; - signCommit?: boolean; - empty?: boolean; -} - export interface PullOptions { unshallow?: boolean; tags?: boolean; diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 0bc8d8ffb71..eefd59bea6a 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -7,10 +7,10 @@ import * as fs from 'fs'; import * as path from 'path'; import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, Decoration } from 'vscode'; import * as nls from 'vscode-nls'; -import { Branch, Change, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status } from './api/git'; +import { Branch, Change, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions } from './api/git'; import { AutoFetcher } from './autofetch'; import { debounce, memoize, throttle } from './decorators'; -import { Commit, CommitOptions, ForcePushMode, GitError, Repository as BaseRepository, Stash, Submodule, LogFileOptions } from './git'; +import { Commit, ForcePushMode, GitError, Repository as BaseRepository, Stash, Submodule, LogFileOptions } from './git'; import { StatusBarCommands } from './statusbar'; import { toGitUri } from './uri'; import { anyEvent, combinedDisposable, debounceEvent, dispose, EmptyDisposable, eventToPromise, filterEvent, find, IDisposable, isDescendant, onceEvent } from './util'; diff --git a/extensions/git/src/test/smoke.test.ts b/extensions/git/src/test/smoke.test.ts new file mode 100644 index 00000000000..c7450780cef --- /dev/null +++ b/extensions/git/src/test/smoke.test.ts @@ -0,0 +1,116 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'mocha'; +import * as assert from 'assert'; +import { workspace, commands, window, Uri, WorkspaceEdit, Range, TextDocument, extensions } from 'vscode'; +import * as cp from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import { GitExtension, API, Repository, Status } from '../api/git'; +import { eventToPromise } from '../util'; + +suite('git smoke test', function () { + const cwd = workspace.workspaceFolders![0].uri.path; + const file = (relativePath: string) => path.join(cwd, relativePath); + const uri = (relativePath: string) => Uri.file(file(relativePath)); + const open = async (relativePath: string) => { + const doc = await workspace.openTextDocument(uri(relativePath)); + await window.showTextDocument(doc); + return doc; + }; + const type = async (doc: TextDocument, text: string) => { + const edit = new WorkspaceEdit(); + const end = doc.lineAt(doc.lineCount - 1).range.end; + edit.replace(doc.uri, new Range(end, end), text); + await workspace.applyEdit(edit); + }; + + let git: API; + let repository: Repository; + + suiteSetup(async function () { + fs.writeFileSync(file('app.js'), 'hello', 'utf8'); + fs.writeFileSync(file('index.pug'), 'hello', 'utf8'); + cp.execSync('git init', { cwd }); + cp.execSync('git config user.name testuser', { cwd }); + cp.execSync('git config user.email monacotools@microsoft.com', { cwd }); + cp.execSync('git add .', { cwd }); + cp.execSync('git commit -m "initial commit"', { cwd }); + + git = extensions.getExtension('vscode.git')!.exports.getAPI(1); + + if (git.repositories.length === 0) { + await eventToPromise(git.onDidOpenRepository); + } + + assert.equal(git.repositories.length, 1); + assert.equal(git.repositories[0].rootUri.path, cwd); + + repository = git.repositories[0]; + }); + + test('reflects working tree changes', async function () { + await commands.executeCommand('workbench.view.scm'); + + const appjs = await open('app.js'); + await type(appjs, ' world'); + await appjs.save(); + await eventToPromise(repository.state.onDidChange); + assert.equal(repository.state.workingTreeChanges.length, 1); + repository.state.workingTreeChanges.some(r => r.uri.path === appjs.uri.path && r.status === Status.MODIFIED); + + fs.writeFileSync(file('newfile.txt'), ''); + const newfile = await open('newfile.txt'); + await type(newfile, 'hey there'); + await newfile.save(); + await repository.status(); + assert.equal(repository.state.workingTreeChanges.length, 2); + repository.state.workingTreeChanges.some(r => r.uri.path === appjs.uri.path && r.status === Status.MODIFIED); + repository.state.workingTreeChanges.some(r => r.uri.path === newfile.uri.path && r.status === Status.UNTRACKED); + }); + + test('opens diff editor', async function () { + const appjs = uri('app.js'); + await commands.executeCommand('git.openChange', appjs); + + assert(window.activeTextEditor); + assert.equal(window.activeTextEditor!.document.uri.path, appjs.path); + + // TODO: how do we really know this is a diff editor? + }); + + test('stages correctly', async function () { + const appjs = uri('app.js'); + const newfile = uri('newfile.txt'); + + await commands.executeCommand('git.stage', appjs); + assert.equal(repository.state.workingTreeChanges.length, 1); + repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED); + assert.equal(repository.state.indexChanges.length, 1); + repository.state.indexChanges.some(r => r.uri.path === appjs.path && r.status === Status.INDEX_MODIFIED); + + await commands.executeCommand('git.unstage', appjs); + assert.equal(repository.state.workingTreeChanges.length, 2); + repository.state.workingTreeChanges.some(r => r.uri.path === appjs.path && r.status === Status.MODIFIED); + repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED); + }); + + test('stages, commits changes and verifies outgoing change', async function () { + const appjs = uri('app.js'); + const newfile = uri('newfile.txt'); + + await commands.executeCommand('git.stage', appjs); + await repository.commit('second commit'); + assert.equal(repository.state.workingTreeChanges.length, 1); + repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED); + assert.equal(repository.state.indexChanges.length, 0); + + await commands.executeCommand('git.stageAll', appjs); + await repository.commit('third commit'); + assert.equal(repository.state.workingTreeChanges.length, 0); + assert.equal(repository.state.indexChanges.length, 0); + }); +}); diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts deleted file mode 100644 index 0d54066c4e5..00000000000 --- a/test/smoke/src/areas/git/git.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as cp from 'child_process'; -import { Application } from '../../../../automation'; - -const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; -const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-item[title$="Synchronize Changes"]'; - -export function setup() { - describe('Git', () => { - before(async function () { - const app = this.app as Application; - - cp.execSync('git config user.name testuser', { cwd: app.workspacePathOrFolder }); - cp.execSync('git config user.email monacotools@microsoft.com', { cwd: app.workspacePathOrFolder }); - }); - - it('reflects working tree changes', async function () { - const app = this.app as Application; - - await app.workbench.scm.openSCMViewlet(); - - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.editor.waitForTypeInEditor('app.js', '.foo{}'); - await app.workbench.editors.saveOpenedFile(); - - await app.workbench.quickopen.openFile('index.pug'); - await app.workbench.editor.waitForTypeInEditor('index.pug', 'hello world'); - await app.workbench.editors.saveOpenedFile(); - - await app.workbench.scm.refreshSCMViewlet(); - await app.workbench.scm.waitForChange('app.js', 'Modified'); - await app.workbench.scm.waitForChange('index.pug', 'Modified'); - }); - - it('opens diff editor', async function () { - const app = this.app as Application; - - await app.workbench.scm.openSCMViewlet(); - await app.workbench.scm.openChange('app.js'); - await app.code.waitForElement(DIFF_EDITOR_LINE_INSERT); - }); - - it('stages correctly', async function () { - const app = this.app as Application; - - await app.workbench.scm.openSCMViewlet(); - await app.workbench.scm.waitForChange('app.js', 'Modified'); - - await app.workbench.scm.stage('app.js'); - await app.workbench.scm.openChange('app.js'); - await new Promise(c => setTimeout(c, 1000)); - await app.workbench.scm.unstage('app.js'); - }); - - it(`stages, commits changes and verifies outgoing change`, async function () { - const app = this.app as Application; - - await app.workbench.scm.openSCMViewlet(); - await app.workbench.scm.waitForChange('app.js', 'Modified'); - - await app.workbench.scm.openChange('app.js'); - await app.workbench.scm.stage('app.js'); - - await app.workbench.scm.commit('first commit'); - await app.code.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); - - await app.workbench.quickopen.runCommand('Git: Stage All Changes'); - await app.workbench.scm.waitForChange('index.pug', 'Index Modified'); - - await app.workbench.scm.commit('second commit'); - await app.code.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); - - cp.execSync('git reset --hard origin/master', { cwd: app.workspacePathOrFolder }); - }); - }); -} diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index a6095fa6fa5..7b747a65f66 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -28,7 +28,6 @@ import { setup as setupDataPreferencesTests } from './areas/preferences/preferen import { setup as setupDataSearchTests } from './areas/search/search.test'; import { setup as setupDataCSSTests } from './areas/css/css.test'; import { setup as setupDataEditorTests } from './areas/editor/editor.test'; -import { setup as setupDataGitTests } from './areas/git/git.test'; import { setup as setupDataStatusbarTests } from './areas/statusbar/statusbar.test'; import { setup as setupDataExtensionTests } from './areas/extensions/extensions.test'; import { setup as setupTerminalTests } from './areas/terminal/terminal.test'; @@ -302,7 +301,6 @@ describe('Running Code', () => { setupDataSearchTests(); setupDataCSSTests(); setupDataEditorTests(); - setupDataGitTests(); setupDataStatusbarTests(!!opts.web); setupDataExtensionTests(); setupTerminalTests(); From ec41f20c40f36d1772dece2adbd1a7bd8639fdad Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Feb 2020 17:23:27 +0100 Subject: [PATCH 40/48] Web - run smoke tests using playwright (#89918) * playwright - initial version * browser - use existing page and not create new context * macOS: document how to remove the security flag * smoke test - allow to run against server build with --build option * do not rely on args * fix path for windows * smoke test - smoke :lipstick: and -ci option --- test/automation/package.json | 8 +- test/automation/src/application.ts | 1 + test/automation/src/code.ts | 107 ++++++++------- ...puppeteerDriver.ts => playwrightDriver.ts} | 48 +++---- test/automation/tsconfig.json | 2 +- test/automation/yarn.lock | 91 +++++++----- test/smoke/README.md | 36 ++++- test/smoke/package.json | 2 +- .../areas/workbench/data-migration.test.ts | 1 - test/smoke/src/main.ts | 129 ++++++++++-------- test/smoke/test/index.js | 8 +- test/smoke/yarn.lock | 8 +- 12 files changed, 250 insertions(+), 191 deletions(-) rename test/automation/src/{puppeteerDriver.ts => playwrightDriver.ts} (74%) diff --git a/test/automation/package.json b/test/automation/package.json index 297dce969b7..744778d5785 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -22,18 +22,18 @@ "devDependencies": { "@types/mkdirp": "0.5.1", "@types/ncp": "2.0.1", - "@types/node": "8.0.33", - "@types/puppeteer": "^1.19.0", + "@types/debug": "4.1.5", + "@types/node": "^12.11.7", "@types/tmp": "0.1.0", "concurrently": "^3.5.1", "cpx": "^1.5.0", - "typescript": "2.9.2", + "typescript": "3.7.5", "watch": "^1.0.2" }, "dependencies": { "mkdirp": "^0.5.1", "ncp": "^2.0.0", - "puppeteer": "^1.19.0", + "playwright": "0.10.0", "tmp": "0.1.0", "vscode-uri": "^2.0.3" } diff --git a/test/automation/src/application.ts b/test/automation/src/application.ts index 00005eebbf7..e95b5f561c2 100644 --- a/test/automation/src/application.ts +++ b/test/automation/src/application.ts @@ -126,6 +126,7 @@ export class Application { extraArgs, remote: this.options.remote, web: this.options.web, + browser: this.options.browser, headless: this.options.headless }); diff --git a/test/automation/src/code.ts b/test/automation/src/code.ts index 9900d92a880..dfe20727b8d 100644 --- a/test/automation/src/code.ts +++ b/test/automation/src/code.ts @@ -10,7 +10,7 @@ import * as fs from 'fs'; import * as mkdirp from 'mkdirp'; import { tmpName } from 'tmp'; import { IDriver, connect as connectElectronDriver, IDisposable, IElement, Thenable } from './driver'; -import { connect as connectPuppeteerDriver, launch } from './puppeteerDriver'; +import { connect as connectPlaywrightDriver, launch } from './playwrightDriver'; import { Logger } from './logger'; import { ncp } from 'ncp'; import { URI } from 'vscode-uri'; @@ -101,6 +101,8 @@ export interface SpawnOptions { remote?: boolean; /** Run in the web */ web?: boolean; + /** A specific browser to use (requires web: true) */ + browser?: 'chromium' | 'webkit' | 'firefox'; /** Run in headless mode (only applies when web is true) */ headless?: boolean; } @@ -120,68 +122,69 @@ export async function spawn(options: SpawnOptions): Promise { const outPath = codePath ? getBuildOutPath(codePath) : getDevOutPath(); const handle = await createDriverHandle(); - const args = [ - options.workspacePath, - '--skip-getting-started', - '--skip-release-notes', - '--sticky-quickopen', - '--disable-telemetry', - '--disable-updates', - '--disable-crash-reporter', - `--extensions-dir=${options.extensionsPath}`, - `--user-data-dir=${options.userDataDir}`, - '--driver', handle - ]; - - const env = process.env; - - if (options.remote) { - // Replace workspace path with URI - args[0] = `--${options.workspacePath.endsWith('.code-workspace') ? 'file' : 'folder'}-uri=vscode-remote://test+test/${URI.file(options.workspacePath).path}`; - - if (codePath) { - // running against a build: copy the test resolver extension - const testResolverExtPath = path.join(options.extensionsPath, 'vscode-test-resolver'); - if (!fs.existsSync(testResolverExtPath)) { - const orig = path.join(repoPath, 'extensions', 'vscode-test-resolver'); - await new Promise((c, e) => ncp(orig, testResolverExtPath, err => err ? e(err) : c())); - } - } - args.push('--enable-proposed-api=vscode.vscode-test-resolver'); - const remoteDataDir = `${options.userDataDir}-server`; - mkdirp.sync(remoteDataDir); - env['TESTRESOLVER_DATA_FOLDER'] = remoteDataDir; - } - - if (!codePath) { - args.unshift(repoPath); - } - - if (options.verbose) { - args.push('--driver-verbose'); - } - - if (options.log) { - args.push('--log', options.log); - } - - if (options.extraArgs) { - args.push(...options.extraArgs); - } - let child: cp.ChildProcess | undefined; let connectDriver: typeof connectElectronDriver; if (options.web) { - await launch(args); - connectDriver = connectPuppeteerDriver.bind(connectPuppeteerDriver, !!options.headless); + await launch(options.userDataDir, options.workspacePath, options.codePath); + connectDriver = connectPlaywrightDriver.bind(connectPlaywrightDriver, !!options.headless, options.browser); } else { + const env = process.env; + + const args = [ + options.workspacePath, + '--skip-getting-started', + '--skip-release-notes', + '--sticky-quickopen', + '--disable-telemetry', + '--disable-updates', + '--disable-crash-reporter', + `--extensions-dir=${options.extensionsPath}`, + `--user-data-dir=${options.userDataDir}`, + '--driver', handle + ]; + + if (options.remote) { + // Replace workspace path with URI + args[0] = `--${options.workspacePath.endsWith('.code-workspace') ? 'file' : 'folder'}-uri=vscode-remote://test+test/${URI.file(options.workspacePath).path}`; + + if (codePath) { + // running against a build: copy the test resolver extension + const testResolverExtPath = path.join(options.extensionsPath, 'vscode-test-resolver'); + if (!fs.existsSync(testResolverExtPath)) { + const orig = path.join(repoPath, 'extensions', 'vscode-test-resolver'); + await new Promise((c, e) => ncp(orig, testResolverExtPath, err => err ? e(err) : c())); + } + } + args.push('--enable-proposed-api=vscode.vscode-test-resolver'); + const remoteDataDir = `${options.userDataDir}-server`; + mkdirp.sync(remoteDataDir); + env['TESTRESOLVER_DATA_FOLDER'] = remoteDataDir; + } + + if (!codePath) { + args.unshift(repoPath); + } + + if (options.verbose) { + args.push('--driver-verbose'); + } + + if (options.log) { + args.push('--log', options.log); + } + + if (options.extraArgs) { + args.push(...options.extraArgs); + } + const spawnOptions: cp.SpawnOptions = { env }; child = cp.spawn(electronPath, args, spawnOptions); instances.add(child); child.once('exit', () => instances.delete(child!)); connectDriver = connectElectronDriver; } + return connect(connectDriver, child, outPath, handle, options.logger); } diff --git a/test/automation/src/puppeteerDriver.ts b/test/automation/src/playwrightDriver.ts similarity index 74% rename from test/automation/src/puppeteerDriver.ts rename to test/automation/src/playwrightDriver.ts index 73a118b6043..d1832f0c2e5 100644 --- a/test/automation/src/puppeteerDriver.ts +++ b/test/automation/src/playwrightDriver.ts @@ -3,17 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as puppeteer from 'puppeteer'; +import * as playwright from 'playwright'; import { ChildProcess, spawn } from 'child_process'; import { join } from 'path'; import { mkdir } from 'fs'; import { promisify } from 'util'; import { IDriver, IDisposable } from './driver'; +import { URI } from 'vscode-uri'; const width = 1200; const height = 800; -const vscodeToPuppeteerKey: { [key: string]: string } = { +const vscodeToPlaywrightKey: { [key: string]: string } = { cmd: 'Meta', ctrl: 'Control', shift: 'Shift', @@ -26,7 +27,7 @@ const vscodeToPuppeteerKey: { [key: string]: string } = { home: 'Home' }; -function buildDriver(browser: puppeteer.Browser, page: puppeteer.Page): IDriver { +function buildDriver(browser: playwright.Browser, page: playwright.Page): IDriver { const driver: IDriver = { _serviceBrand: undefined, getWindowIds: () => { @@ -45,8 +46,8 @@ function buildDriver(browser: puppeteer.Browser, page: puppeteer.Page): IDriver const keys = chord.split('+'); const keysDown: string[] = []; for (let i = 0; i < keys.length; i++) { - if (keys[i] in vscodeToPuppeteerKey) { - keys[i] = vscodeToPuppeteerKey[keys[i]]; + if (keys[i] in vscodeToPlaywrightKey) { + keys[i] = vscodeToPlaywrightKey[keys[i]]; } await page.keyboard.down(keys[i]); keysDown.push(keys[i]); @@ -68,7 +69,7 @@ function buildDriver(browser: puppeteer.Browser, page: puppeteer.Page): IDriver await driver.click(windowId, selector, 0, 0); await timeout(100); }, - setValue: async (windowId, selector, text) => page.evaluate(`window.driver.setValue('${selector}', '${text}')`), + setValue: async (windowId, selector, text) => page.evaluate(`window.driver.setValue('${selector}', '${text}')`).then(undefined), getTitle: (windowId) => page.evaluate(`window.driver.getTitle()`), isActiveElement: (windowId, selector) => page.evaluate(`window.driver.isActiveElement('${selector}')`), getElements: (windowId, selector, recursive) => page.evaluate(`window.driver.getElements('${selector}', ${recursive})`), @@ -86,31 +87,32 @@ function timeout(ms: number): Promise { // function runInDriver(call: string, args: (string | boolean)[]): Promise {} -let args: string[] | undefined; let server: ChildProcess | undefined; let endpoint: string | undefined; +let workspacePath: string | undefined; -export async function launch(_args: string[]): Promise { - args = _args; - const agentFolder = args.filter(e => e.includes('--user-data-dir='))[0].replace('--user-data-dir=', ''); +export async function launch(userDataDir: string, _workspacePath: string, codeServerPath = process.env.VSCODE_REMOTE_SERVER_PATH): Promise { + workspacePath = _workspacePath; + const agentFolder = userDataDir; await promisify(mkdir)(agentFolder); const env = { VSCODE_AGENT_FOLDER: agentFolder, + VSCODE_REMOTE_SERVER_PATH: codeServerPath, ...process.env }; let serverLocation: string | undefined; - if (process.env.VSCODE_REMOTE_SERVER_PATH) { - serverLocation = join(process.env.VSCODE_REMOTE_SERVER_PATH, `server.${process.platform === 'win32' ? 'cmd' : 'sh'}`); + if (codeServerPath) { + serverLocation = join(codeServerPath, `server.${process.platform === 'win32' ? 'cmd' : 'sh'}`); } else { - serverLocation = join(args[0], `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`); + serverLocation = join(__dirname, '..', '..', '..', `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`); } server = spawn( serverLocation, ['--browser', 'none', '--driver', 'web'], { env } ); - server.stderr.on('data', e => console.log('Server stderr: ' + e)); - server.stdout.on('data', e => console.log('Server stdout: ' + e)); + server.stderr?.on('data', e => console.log('Server stderr: ' + e)); + server.stdout?.on('data', e => console.log('Server stdout: ' + e)); process.on('exit', teardown); process.on('SIGINT', teardown); process.on('SIGTERM', teardown); @@ -126,7 +128,7 @@ function teardown(): void { function waitForEndpoint(): Promise { return new Promise(r => { - server!.stdout.on('data', (d: Buffer) => { + server!.stdout?.on('data', (d: Buffer) => { const matches = d.toString('ascii').match(/Web UI available at (.+)/); if (matches !== null) { r(matches[1]); @@ -135,20 +137,18 @@ function waitForEndpoint(): Promise { }); } -export function connect(headless: boolean, outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }> { +export function connect(headless: boolean, engine: 'chromium' | 'webkit' | 'firefox' = 'chromium'): Promise<{ client: IDisposable, driver: IDriver }> { return new Promise(async (c) => { - const browser = await puppeteer.launch({ + const browser = await playwright[engine].launch({ // Run in Edge dev on macOS // executablePath: '/Applications/Microsoft\ Edge\ Dev.app/Contents/MacOS/Microsoft\ Edge\ Dev', - headless, - slowMo: 80, - args: [`--window-size=${width},${height}`] + headless }); - const page = (await browser.pages())[0]; + const page = (await browser.defaultContext().pages())[0]; await page.setViewport({ width, height }); - await page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${args![1]}`); + await page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${URI.file(workspacePath!).path}`); const result = { - client: { dispose: () => teardown }, + client: { dispose: () => teardown() }, driver: buildDriver(browser, page) }; c(result); diff --git a/test/automation/tsconfig.json b/test/automation/tsconfig.json index eecaf21a699..24deb99ddf8 100644 --- a/test/automation/tsconfig.json +++ b/test/automation/tsconfig.json @@ -16,6 +16,6 @@ "exclude": [ "node_modules", "out", - "tools", + "tools" ] } diff --git a/test/automation/yarn.lock b/test/automation/yarn.lock index 94a1350861f..65be684bc57 100644 --- a/test/automation/yarn.lock +++ b/test/automation/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@types/debug@4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + "@types/mkdirp@0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.1.tgz#ea887cd024f691c1ca67cce20b7606b053e43b0f" @@ -21,17 +26,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.1.tgz#3b5c3a26393c19b400844ac422bd0f631a94d69d" integrity sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw== -"@types/node@8.0.33": - version "8.0.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.33.tgz#1126e94374014e54478092830704f6ea89df04cd" - integrity sha512-vmCdO8Bm1ExT+FWfC9sd9r4jwqM7o97gGy2WBshkkXbf/2nLAJQUrZfIhw27yVOtLUev6kSZc4cav/46KbDd8A== - -"@types/puppeteer@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.19.1.tgz#942ca62288953a0f5fbbc25c103b5f2ba28b60ab" - integrity sha512-ReWZvoEfMiJIA3AG+eM+nCx5GKrU2ANVYY5TC0nbpeiTCtnJbcqnmBbR8TkXMBTvLBYcuTOAELbTcuX73siDNQ== - dependencies: - "@types/node" "*" +"@types/node@^12.11.7": + version "12.12.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.26.tgz#213e153babac0ed169d44a6d919501e68f59dea9" + integrity sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA== "@types/tmp@0.1.0": version "0.1.0" @@ -729,10 +727,10 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== -https-proxy-agent@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz#fb6cd98ed5b9c35056b5a73cd01a8a721d7193d1" - integrity sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q== +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== dependencies: agent-base "^4.3.0" debug "^3.1.0" @@ -938,6 +936,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jpeg-js@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c" + integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -1320,6 +1323,35 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +playwright-core@=0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-0.10.0.tgz#86699c9cc3e613d733e6635a54aceea1993013d5" + integrity sha512-yernA6yrrBhmb8M5eO6GZsJOrBKWOZszlu65Luz8LP7ryaDExN1sE9XjQBNbiwJ5Gfs8cehtAO7GfTDJt+Z2cQ== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^3.0.0" + jpeg-js "^0.3.6" + mime "^2.0.3" + pngjs "^3.4.0" + progress "^2.0.3" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + uuid "^3.4.0" + ws "^6.1.0" + +playwright@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-0.10.0.tgz#d37f7e42e0e868dcc4ec35cb0a8dbc6248457642" + integrity sha512-f3VRME/PIO5NbcWnlCDfXwPC0DAZJ7ETkcAdE+sensLCOkfDtLh97E71ZuxNCaPYsUA6FIPi5syD8pHJW/4hQQ== + dependencies: + playwright-core "=0.10.0" + +pngjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -1335,7 +1367,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.1: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -1345,20 +1377,6 @@ proxy-from-env@^1.0.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= -puppeteer@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.19.0.tgz#e3b7b448c2c97933517078d7a2c53687361bebea" - integrity sha512-2S6E6ygpoqcECaagDbBopoSOPDv0pAZvTbnBgUY+6hq0/XDFDOLEMNlHF/SKJlzcaZ9ckiKjKDuueWI3FN/WXw== - dependencies: - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^2.2.1" - mime "^2.0.3" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" - randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -1751,10 +1769,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" - integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +typescript@3.7.5: + version "3.7.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" + integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== union-value@^1.0.0: version "1.0.1" @@ -1789,6 +1807,11 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" diff --git a/test/smoke/README.md b/test/smoke/README.md index 7fc0ced719f..1060250f7fd 100644 --- a/test/smoke/README.md +++ b/test/smoke/README.md @@ -7,15 +7,22 @@ Make sure you are on **Node v10.x**. ```bash # Install Dependencies and Compile yarn --cwd test/smoke +yarn --cwd test/automation -# Dev +# Dev (Electron) yarn smoketest -# Build -yarn smoketest --build PATH_TO_NEW_BUILD_PARENT_FOLDER --stable-build PATH_TO_LAST_STABLE_BUILD_PARENT_FOLDER +# Dev (Web) +yarn smoketest --web --browser -# Remote -yarn smoketest --build PATH_TO_NEW_BUILD_PARENT_FOLDER --remote +# Build (Electron) +yarn smoketest --build --stable-build + +# Build (Web - read instructions below) +yarn smoketest --build --web --browser + +# Remote (Electron) +yarn smoketest --build --remote ``` ### Run for a release @@ -27,18 +34,33 @@ git checkout release/1.22 yarn --cwd test/smoke ``` +#### Electron + In addition to the new build to be released you will need the previous stable build so that the smoketest can test the data migration. The recommended way to make these builds available for the smoketest is by downloading their archive version (\*.zip) and extracting them into two folders. Pass the folder paths to the smoketest as follows: ```bash -yarn smoketest --build PATH_TO_NEW_RELEASE_PARENT_FOLDER --stable-build PATH_TO_LAST_STABLE_RELEASE_PARENT_FOLDER +yarn smoketest --build --stable-build ``` +#### Web + +**macOS**: if you have downloaded the server with web bits, make sure to run the following command before unzipping it to avoid security issues on startup: + +```bash +xattr -d com.apple.quarantine +``` + +There is no support for testing an old version to a new one yet, so simply configure the `--build` command line argument to point to +the web server folder which includes the web client bits (e.g. `vscode-server-darwin-web` for macOS). + +**Note**: make sure to point to the server that includes the client bits! + ### Debug - `--verbose` logs all the low level driver calls made to Code; -- `-f PATTERN` filters the tests to be run. You can also use pretty much any mocha argument; +- `-f PATTERN` (alias `-g PATTERN`) filters the tests to be run. You can also use pretty much any mocha argument; - `--screenshots SCREENSHOT_DIR` captures screenshots when tests fail. ### Develop diff --git a/test/smoke/package.json b/test/smoke/package.json index 2ae2926ada1..28acde77a9f 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -27,7 +27,7 @@ "rimraf": "^2.6.1", "strip-json-comments": "^2.0.1", "tmp": "0.0.33", - "typescript": "2.9.2", + "typescript": "3.7.5", "watch": "^1.0.2" } } diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 0a403bef78d..659fd62952a 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -8,7 +8,6 @@ import { join } from 'path'; export function setup(stableCodePath: string, testDataPath: string) { - describe('Data Migration: This test MUST run before releasing by providing the --stable-build command line argument', () => { it(`verifies opened editors are restored`, async function () { if (!stableCodePath) { diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 7b747a65f66..f792cd1ffa8 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -47,6 +47,7 @@ process.once('exit', () => rimraf.sync(testDataPath)); const [, , ...args] = process.argv; const opts = minimist(args, { string: [ + 'browser', 'build', 'stable-build', 'wait-time', @@ -58,7 +59,8 @@ const opts = minimist(args, { 'verbose', 'remote', 'web', - 'headless' + 'headless', + 'ci' ], default: { verbose: false @@ -82,42 +84,46 @@ function fail(errorMessage): void { const repoPath = path.join(__dirname, '..', '..', '..'); -function getDevElectronPath(): string { - const buildPath = path.join(repoPath, '.build'); - const product = require(path.join(repoPath, 'product.json')); - - switch (process.platform) { - case 'darwin': - return path.join(buildPath, 'electron', `${product.nameLong}.app`, 'Contents', 'MacOS', 'Electron'); - case 'linux': - return path.join(buildPath, 'electron', `${product.applicationName}`); - case 'win32': - return path.join(buildPath, 'electron', `${product.nameShort}.exe`); - default: - throw new Error('Unsupported platform.'); - } -} - -function getBuildElectronPath(root: string): string { - switch (process.platform) { - case 'darwin': - return path.join(root, 'Contents', 'MacOS', 'Electron'); - case 'linux': { - const product = require(path.join(root, 'resources', 'app', 'product.json')); - return path.join(root, product.applicationName); - } - case 'win32': { - const product = require(path.join(root, 'resources', 'app', 'product.json')); - return path.join(root, `${product.nameShort}.exe`); - } - default: - throw new Error('Unsupported platform.'); - } -} - let quality: Quality; +// +// #### Electron Smoke Tests #### +// if (!opts.web) { + + function getDevElectronPath(): string { + const buildPath = path.join(repoPath, '.build'); + const product = require(path.join(repoPath, 'product.json')); + + switch (process.platform) { + case 'darwin': + return path.join(buildPath, 'electron', `${product.nameLong}.app`, 'Contents', 'MacOS', 'Electron'); + case 'linux': + return path.join(buildPath, 'electron', `${product.applicationName}`); + case 'win32': + return path.join(buildPath, 'electron', `${product.nameShort}.exe`); + default: + throw new Error('Unsupported platform.'); + } + } + + function getBuildElectronPath(root: string): string { + switch (process.platform) { + case 'darwin': + return path.join(root, 'Contents', 'MacOS', 'Electron'); + case 'linux': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, product.applicationName); + } + case 'win32': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, `${product.nameShort}.exe`); + } + default: + throw new Error('Unsupported platform.'); + } + } + let testCodePath = opts.build; let stableCodePath = opts['stable-build']; let electronPath: string; @@ -152,8 +158,13 @@ if (!opts.web) { } else { quality = Quality.Stable; } -} else { - let testCodeServerPath = process.env.VSCODE_REMOTE_SERVER_PATH; +} + +// +// #### Web Smoke Tests #### +// +else { + const testCodeServerPath = opts.build || process.env.VSCODE_REMOTE_SERVER_PATH; if (typeof testCodeServerPath === 'string' && !fs.existsSync(testCodeServerPath)) { fail(`Can't find Code server at ${testCodeServerPath}.`); @@ -236,13 +247,13 @@ function createOptions(): ApplicationOptions { screenshotsPath, remote: opts.remote, web: opts.web, + browser: opts.browser, headless: opts.headless }; } before(async function () { - // allow two minutes for setup - this.timeout(2 * 60 * 1000); + this.timeout(2 * 60 * 1000); // allow two minutes for setup await setup(); this.defaultOptions = createOptions(); }); @@ -259,11 +270,7 @@ after(async function () { await new Promise((c, e) => rimraf(testDataPath, { maxBusyTries: 10 }, err => err ? e(err) : c())); }); -if (!opts.web) { - setupDataMigrationTests(opts['stable-build'], testDataPath); -} - -describe('Running Code', () => { +describe(`VSCode Smoke Tests (${opts.web ? 'Web' : 'Electron'})`, () => { before(async function () { const app = new Application(this.defaultOptions); await app!.start(opts.web ? false : undefined); @@ -295,19 +302,25 @@ describe('Running Code', () => { }); } - if (!opts.web) { setupDataLossTests(); } - setupDataExplorerTests(); - if (!opts.web) { setupDataPreferencesTests(); } - setupDataSearchTests(); - setupDataCSSTests(); - setupDataEditorTests(); - setupDataStatusbarTests(!!opts.web); - setupDataExtensionTests(); - setupTerminalTests(); - if (!opts.web) { setupDataMultirootTests(); } - setupDataLocalizationTests(); -}); + // CI only tests (must be reliable) + if (opts.ci) { + // TODO@Ben figure out tests that can run continously and reliably + } -if (!opts.web) { - setupLaunchTests(); -} + // Non-CI execution (all tests) + else { + if (!opts.web) { setupDataMigrationTests(opts['stable-build'], testDataPath); } + if (!opts.web) { setupDataLossTests(); } + setupDataExplorerTests(); + if (!opts.web) { setupDataPreferencesTests(); } + setupDataSearchTests(); + setupDataCSSTests(); + setupDataEditorTests(); + setupDataStatusbarTests(!!opts.web); + setupDataExtensionTests(); + setupTerminalTests(); + if (!opts.web) { setupDataMultirootTests(); } + setupDataLocalizationTests(); + if (!opts.web) { setupLaunchTests(); } + } +}); diff --git a/test/smoke/test/index.js b/test/smoke/test/index.js index 71023e7e91f..5e33b701fa3 100644 --- a/test/smoke/test/index.js +++ b/test/smoke/test/index.js @@ -11,16 +11,14 @@ const suite = 'Smoke Tests'; const [, , ...args] = process.argv; const opts = minimist(args, { - string: [ - 'f' - ] + string: ['f', 'g'] }); const options = { - useColors: true, + color: true, timeout: 60000, slow: 30000, - grep: opts['f'] + grep: opts['f'] || opts['g'] }; if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) { diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index 82626a55c7a..8649c9859c9 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -2122,10 +2122,10 @@ tree-kill@^1.1.0: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== -typescript@2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" - integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +typescript@3.7.5: + version "3.7.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" + integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== union-value@^1.0.0: version "1.0.1" From c91898c08fc5a2e6f0ff85c16844510935b8f445 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Feb 2020 09:06:41 -0800 Subject: [PATCH 41/48] debug: update js-debug-nightly to "2020.1.43263" @ 2020-02-04T17:02:18.597Z --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 464af9c3511..5634eedbb03 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -46,7 +46,7 @@ }, { "name": "ms-vscode.js-debug-nightly", - "version": "2020.1.43263", + "version": "2020.2.408", "forQualities": [ "insider" ], From 3d4e0f874d9fbd02f3224567b12f7b8df661bd99 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Feb 2020 18:10:47 +0100 Subject: [PATCH 42/48] remove enum-based MenuId --- src/vs/platform/actions/common/actions.ts | 57 ----------------------- 1 file changed, 57 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index dcf943843d6..be405d6d637 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -125,63 +125,6 @@ export class MenuId { } } -export const enum MenuId3 { - CommandPalette, - DebugBreakpointsContext, - DebugCallStackContext, - DebugConsoleContext, - DebugVariablesContext, - DebugWatchContext, - DebugToolBar, - EditorContext, - EditorContextPeek, - EditorTitle, - EditorTitleContext, - EmptyEditorGroupContext, - ExplorerContext, - ExtensionContext, - GlobalActivity, - MenubarAppearanceMenu, - MenubarDebugMenu, - MenubarEditMenu, - MenubarFileMenu, - MenubarGoMenu, - MenubarHelpMenu, - MenubarLayoutMenu, - MenubarNewBreakpointMenu, - MenubarPreferencesMenu, - MenubarRecentMenu, - MenubarSelectionMenu, - MenubarSwitchEditorMenu, - MenubarSwitchGroupMenu, - MenubarTerminalMenu, - MenubarViewMenu, - OpenEditorsContext, - ProblemsPanelContext, - SCMChangeContext, - SCMResourceContext, - SCMResourceFolderContext, - SCMResourceGroupContext, - SCMSourceControl, - SCMTitle, - SearchContext, - StatusBarWindowIndicatorMenu, - TouchBarContext, - TitleBarContext, - TunnelContext, - TunnelInline, - TunnelTitle, - ViewItemContext, - ViewTitle, - ViewTitleContext, - CommentThreadTitle, - CommentThreadActions, - CommentTitle, - CommentActions, - BulkEditTitle, - BulkEditContext, -} - export interface IMenuActionOptions { arg?: any; shouldForwardArgs?: boolean; From 5782094815936ae7b8eb7c7b8b4b3e64c7054d78 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 4 Feb 2020 18:27:56 +0100 Subject: [PATCH 43/48] Tweak API shape to better reflect call style --- src/vs/editor/standalone/browser/standaloneCodeEditor.ts | 2 +- src/vs/monaco.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 82b3f3475e2..bf61c89c899 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -75,7 +75,7 @@ export interface IActionDescriptor { * Method that will be executed when the action is triggered. * @param editor The editor instance is passed in as a convenience */ - run(editor: ICodeEditor, param?: any): void | Promise; + run(editor: ICodeEditor, ...args: any[]): void | Promise; } /** diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index de1d0cb0634..ad9ede1dca1 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1046,7 +1046,7 @@ declare namespace monaco.editor { * Method that will be executed when the action is triggered. * @param editor The editor instance is passed in as a convenience */ - run(editor: ICodeEditor, param?: any): void | Promise; + run(editor: ICodeEditor, ...args: any[]): void | Promise; } /** From 2ce45bf734bf585d9abb89f976190b37838317a6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 3 Feb 2020 17:32:06 +0100 Subject: [PATCH 44/48] Fixes microsoft/monaco-editor#1796: Expose ConfigurationChangedEvent.hasChanged in the API --- src/vs/editor/common/config/editorOptions.ts | 3 --- src/vs/monaco.d.ts | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 73c30dd221b..adf546ac92b 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -624,9 +624,6 @@ export class ConfigurationChangedEvent { constructor(values: boolean[]) { this._values = values; } - /** - * @internal - */ public hasChanged(id: EditorOption): boolean { return this._values[id]; } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index ad9ede1dca1..a683a9b8e2f 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3089,6 +3089,7 @@ declare namespace monaco.editor { * An event describing that the configuration of the editor has changed. */ export class ConfigurationChangedEvent { + hasChanged(id: EditorOption): boolean; } /** From 65fee791989e5c7b1cc9f46684219547c7dd620f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 3 Feb 2020 23:14:21 +0100 Subject: [PATCH 45/48] Add types for MonacoEnvironment (microsoft/monaco-editor#1795) --- build/gulpfile.editor.js | 7 ++++++- build/monaco/monaco.d.ts.recipe | 10 ++++++++-- src/vs/monaco.d.ts | 10 ++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index b686d280189..105402470d8 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -227,8 +227,13 @@ function toExternalDTS(contents) { if (line.indexOf('declare namespace monaco.') === 0) { lines[i] = line.replace('declare namespace monaco.', 'export namespace '); } + + if (line.indexOf('declare let MonacoEnvironment') === 0) { + lines[i] = `declare global {\n let MonacoEnvironment: Environment | undefined;\n}`; + // lines[i] = line.replace('declare namespace monaco.', 'export namespace '); + } } - return lines.join('\n'); + return lines.join('\n').replace(/\n\n\n+/g, '\n\n'); } function filterStream(testFunc) { diff --git a/build/monaco/monaco.d.ts.recipe b/build/monaco/monaco.d.ts.recipe index fdcdf533406..7288af94c9d 100644 --- a/build/monaco/monaco.d.ts.recipe +++ b/build/monaco/monaco.d.ts.recipe @@ -3,12 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +declare let MonacoEnvironment: monaco.Environment | undefined; + declare namespace monaco { - // THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. - export type Thenable = PromiseLike; + export interface Environment { + baseUrl?: string; + getWorker?(workerId: string, label: string): Worker; + getWorkerUrl?(workerId: string, label: string): string; + } + export interface IDisposable { dispose(): void; } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a683a9b8e2f..a5e4ed9546d 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3,12 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +declare let MonacoEnvironment: monaco.Environment | undefined; + declare namespace monaco { - // THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. - export type Thenable = PromiseLike; + export interface Environment { + baseUrl?: string; + getWorker?(workerId: string, label: string): Worker; + getWorkerUrl?(workerId: string, label: string): string; + } + export interface IDisposable { dispose(): void; } From b2000e2c38fa5dc6f0372e25788f338ecc80208a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 3 Feb 2020 23:26:07 +0100 Subject: [PATCH 46/48] editor.semanticHighlighting is not an editor instance option --- .../common/config/commonEditorConfig.ts | 5 ++ src/vs/editor/common/config/editorOptions.ts | 51 --------------- .../common/services/modelServiceImpl.ts | 6 +- .../common/standalone/standaloneEnums.ts | 51 ++++++++------- src/vs/monaco.d.ts | 63 ++++++++----------- .../inspectEditorTokens.ts | 5 +- 6 files changed, 64 insertions(+), 117 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 7a4bc82f8f1..ed8c20c1674 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -484,6 +484,11 @@ const editorConfiguration: IConfigurationNode = { default: true, description: nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.") }, + 'editor.semanticHighlighting.enabled': { + type: 'boolean', + default: true, + description: nls.localize('semanticHighlighting.enabled', "Controls whether the semanticHighlighting is shown for the languages that support it.") + }, 'editor.stablePeek': { type: 'boolean', default: false, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index adf546ac92b..c66c92d66f9 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -1588,55 +1588,6 @@ class EditorHover extends BaseEditorOption>; - -class EditorSemanticHighlighting extends BaseEditorOption { - - constructor() { - const defaults: EditorSemanticHighlightingOptions = { - enabled: true - }; - super( - EditorOption.semanticHighlighting, 'semanticHighlighting', defaults, - { - 'editor.semanticHighlighting.enabled': { - type: 'boolean', - default: defaults.enabled, - description: nls.localize('semanticHighlighting.enabled', "Controls whether the semanticHighlighting is shown for the languages that support it.") - } - } - ); - } - - public validate(_input: any): EditorSemanticHighlightingOptions { - if (typeof _input !== 'object') { - return this.defaultValue; - } - const input = _input as IEditorSemanticHighlightingOptions; - return { - enabled: EditorBooleanOption.boolean(input.enabled, this.defaultValue.enabled) - }; - } -} - -//#endregion - //#region layoutInfo /** @@ -3245,7 +3196,6 @@ export const enum EditorOption { selectionClipboard, selectionHighlight, selectOnLineNumbers, - semanticHighlighting, showFoldingControls, showUnused, snippetSuggestions, @@ -3715,7 +3665,6 @@ export const EditorOptions = { selectOnLineNumbers: register(new EditorBooleanOption( EditorOption.selectOnLineNumbers, 'selectOnLineNumbers', true, )), - semanticHighlighting: register(new EditorSemanticHighlighting()), showFoldingControls: register(new EditorStringEnumOption( EditorOption.showFoldingControls, 'showFoldingControls', 'mouseover' as 'always' | 'mouseover', diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index ece088d6ee4..bc8824d7f89 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -8,7 +8,7 @@ import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecyc import * as platform from 'vs/base/common/platform'; import * as errors from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; -import { EDITOR_MODEL_DEFAULTS, IEditorSemanticHighlightingOptions } from 'vs/editor/common/config/editorOptions'; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { DefaultEndOfLine, EndOfLinePreference, EndOfLineSequence, IIdentifiedSingleEditOperation, ITextBuffer, ITextBufferFactory, ITextModel, ITextModelCreationOptions } from 'vs/editor/common/model'; @@ -26,6 +26,10 @@ import { SparseEncodedTokens, MultilineTokens2 } from 'vs/editor/common/model/to import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; +export interface IEditorSemanticHighlightingOptions { + enabled?: boolean; +} + function MODEL_ID(resource: URI): string { return resource.toString(); } diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 5041c28367c..fbc5a8afb80 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -250,32 +250,31 @@ export enum EditorOption { selectionClipboard = 82, selectionHighlight = 83, selectOnLineNumbers = 84, - semanticHighlighting = 85, - showFoldingControls = 86, - showUnused = 87, - snippetSuggestions = 88, - smoothScrolling = 89, - stopRenderingLineAfter = 90, - suggest = 91, - suggestFontSize = 92, - suggestLineHeight = 93, - suggestOnTriggerCharacters = 94, - suggestSelection = 95, - tabCompletion = 96, - useTabStops = 97, - wordSeparators = 98, - wordWrap = 99, - wordWrapBreakAfterCharacters = 100, - wordWrapBreakBeforeCharacters = 101, - wordWrapColumn = 102, - wordWrapMinified = 103, - wrappingIndent = 104, - wrappingStrategy = 105, - editorClassName = 106, - pixelRatio = 107, - tabFocusMode = 108, - layoutInfo = 109, - wrappingInfo = 110 + showFoldingControls = 85, + showUnused = 86, + snippetSuggestions = 87, + smoothScrolling = 88, + stopRenderingLineAfter = 89, + suggest = 90, + suggestFontSize = 91, + suggestLineHeight = 92, + suggestOnTriggerCharacters = 93, + suggestSelection = 94, + tabCompletion = 95, + useTabStops = 96, + wordSeparators = 97, + wordWrap = 98, + wordWrapBreakAfterCharacters = 99, + wordWrapBreakBeforeCharacters = 100, + wordWrapColumn = 101, + wordWrapMinified = 102, + wrappingIndent = 103, + wrappingStrategy = 104, + editorClassName = 105, + pixelRatio = 106, + tabFocusMode = 107, + layoutInfo = 108, + wrappingInfo = 109 } /** diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a5e4ed9546d..2290b759eb8 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3245,17 +3245,6 @@ declare namespace monaco.editor { export type EditorHoverOptions = Readonly>; - /** - * Configuration options for semantic highlighting - */ - export interface IEditorSemanticHighlightingOptions { - /** - * Enable semantic highlighting. - * Defaults to true. - */ - enabled?: boolean; - } - /** * A description for the overview ruler position. */ @@ -3797,32 +3786,31 @@ declare namespace monaco.editor { selectionClipboard = 82, selectionHighlight = 83, selectOnLineNumbers = 84, - semanticHighlighting = 85, - showFoldingControls = 86, - showUnused = 87, - snippetSuggestions = 88, - smoothScrolling = 89, - stopRenderingLineAfter = 90, - suggest = 91, - suggestFontSize = 92, - suggestLineHeight = 93, - suggestOnTriggerCharacters = 94, - suggestSelection = 95, - tabCompletion = 96, - useTabStops = 97, - wordSeparators = 98, - wordWrap = 99, - wordWrapBreakAfterCharacters = 100, - wordWrapBreakBeforeCharacters = 101, - wordWrapColumn = 102, - wordWrapMinified = 103, - wrappingIndent = 104, - wrappingStrategy = 105, - editorClassName = 106, - pixelRatio = 107, - tabFocusMode = 108, - layoutInfo = 109, - wrappingInfo = 110 + showFoldingControls = 85, + showUnused = 86, + snippetSuggestions = 87, + smoothScrolling = 88, + stopRenderingLineAfter = 89, + suggest = 90, + suggestFontSize = 91, + suggestLineHeight = 92, + suggestOnTriggerCharacters = 93, + suggestSelection = 94, + tabCompletion = 95, + useTabStops = 96, + wordSeparators = 97, + wordWrap = 98, + wordWrapBreakAfterCharacters = 99, + wordWrapBreakBeforeCharacters = 100, + wordWrapColumn = 101, + wordWrapMinified = 102, + wrappingIndent = 103, + wrappingStrategy = 104, + editorClassName = 105, + pixelRatio = 106, + tabFocusMode = 107, + layoutInfo = 108, + wrappingInfo = 109 } export const EditorOptions: { acceptSuggestionOnCommitCharacter: IEditorOption; @@ -3910,7 +3898,6 @@ declare namespace monaco.editor { selectionClipboard: IEditorOption; selectionHighlight: IEditorOption; selectOnLineNumbers: IEditorOption; - semanticHighlighting: IEditorOption; showFoldingControls: IEditorOption; showUnused: IEditorOption; snippetSuggestions: IEditorOption; diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts index 21dca4fae63..6868714c914 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts @@ -29,7 +29,10 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { ColorThemeData, TokenStyleDefinitions, TokenStyleDefinition } from 'vs/workbench/services/themes/common/colorThemeData'; import { TokenStylingRule, TokenStyleData } from 'vs/platform/theme/common/tokenClassificationRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import type { IEditorSemanticHighlightingOptions } from 'vs/editor/common/config/editorOptions'; + +export interface IEditorSemanticHighlightingOptions { + enabled?: boolean; +} class InspectEditorTokensController extends Disposable implements IEditorContribution { From 05cf2fc09d8bae616a3b99fa508f22a5f5102276 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 3 Feb 2020 23:37:37 +0100 Subject: [PATCH 47/48] editor monaco.d.ts API tweaks --- src/vs/editor/common/model.ts | 1 + src/vs/editor/common/model/textModelEvents.ts | 1 + .../standalone/browser/standaloneLanguages.ts | 16 ++++++++ src/vs/monaco.d.ts | 41 +++++-------------- 4 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 8c7edd2e6f8..b150ede69bb 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -290,6 +290,7 @@ export const enum EndOfLineSequence { /** * An identifier for a single edit operation. + * @internal */ export interface ISingleEditOperationIdentifier { /** diff --git a/src/vs/editor/common/model/textModelEvents.ts b/src/vs/editor/common/model/textModelEvents.ts index fc84cb84f93..11fc0e4165f 100644 --- a/src/vs/editor/common/model/textModelEvents.ts +++ b/src/vs/editor/common/model/textModelEvents.ts @@ -80,6 +80,7 @@ export interface IModelDecorationsChangedEvent { /** * An event describing that some ranges of lines have been tokenized (their tokens have changed). + * @internal */ export interface IModelTokensChangedEvent { readonly tokenizationSupportChanged: boolean; diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index 38ff152bdbb..56a723a309e 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -496,6 +496,20 @@ export function registerSelectionRangeProvider(languageId: string, provider: mod return modes.SelectionRangeRegistry.register(languageId, provider); } +/** + * Register a document semantic tokens provider + */ +export function registerDocumentSemanticTokensProvider(languageId: string, provider: modes.DocumentSemanticTokensProvider): IDisposable { + return modes.DocumentSemanticTokensProviderRegistry.register(languageId, provider); +} + +/** + * Register a document range semantic tokens provider + */ +export function registerDocumentRangeSemanticTokensProvider(languageId: string, provider: modes.DocumentRangeSemanticTokensProvider): IDisposable { + return modes.DocumentRangeSemanticTokensProviderRegistry.register(languageId, provider); +} + /** * Contains additional diagnostic information about the context in which * a [code action](#CodeActionProvider.provideCodeActions) is run. @@ -558,6 +572,8 @@ export function createMonacoLanguagesAPI(): typeof monaco.languages { registerFoldingRangeProvider: registerFoldingRangeProvider, registerDeclarationProvider: registerDeclarationProvider, registerSelectionRangeProvider: registerSelectionRangeProvider, + registerDocumentSemanticTokensProvider: registerDocumentSemanticTokensProvider, + registerDocumentRangeSemanticTokensProvider: registerDocumentRangeSemanticTokensProvider, // enums DocumentHighlightKind: standaloneEnums.DocumentHighlightKind, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 2290b759eb8..c4aa3e03146 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1467,20 +1467,6 @@ declare namespace monaco.editor { CRLF = 1 } - /** - * An identifier for a single edit operation. - */ - export interface ISingleEditOperationIdentifier { - /** - * Identifier major - */ - major: number; - /** - * Identifier minor - */ - minor: number; - } - /** * A single edit operation, that acts as a simple replace. * i.e. Replace text at `range` with `text` in model. @@ -2379,23 +2365,6 @@ declare namespace monaco.editor { export interface IModelDecorationsChangedEvent { } - /** - * An event describing that some ranges of lines have been tokenized (their tokens have changed). - */ - export interface IModelTokensChangedEvent { - readonly tokenizationSupportChanged: boolean; - readonly ranges: { - /** - * The start of the range (inclusive) - */ - readonly fromLineNumber: number; - /** - * The end of the range (inclusive) - */ - readonly toLineNumber: number; - }[]; - } - export interface IModelOptionsChangedEvent { readonly tabSize: boolean; readonly indentSize: boolean; @@ -4907,6 +4876,16 @@ declare namespace monaco.languages { */ export function registerSelectionRangeProvider(languageId: string, provider: SelectionRangeProvider): IDisposable; + /** + * Register a document semantic tokens provider + */ + export function registerDocumentSemanticTokensProvider(languageId: string, provider: DocumentSemanticTokensProvider): IDisposable; + + /** + * Register a document range semantic tokens provider + */ + export function registerDocumentRangeSemanticTokensProvider(languageId: string, provider: DocumentRangeSemanticTokensProvider): IDisposable; + /** * Contains additional diagnostic information about the context in which * a [code action](#CodeActionProvider.provideCodeActions) is run. From 4f4e26aec864e324d48ba558de20d9029e93b405 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Feb 2020 18:52:44 +0100 Subject: [PATCH 48/48] debt - move tests to correct layers --- .../test/{ => common}/commands.test.ts | 0 .../files/test/{ => common}/files.test.ts | 1 + .../workspacesMainService.test.ts | 83 ++++- .../electron-browser/backupRestorer.test.ts | 2 +- .../electron-browser/backupTracker.test.ts | 3 +- .../debug/test/browser/baseDebugView.test.ts | 2 +- .../test/browser/debugANSIHandling.test.ts | 2 +- .../debug/test/browser/linkDetector.test.ts | 2 +- .../contrib/debug/test/node/debugger.test.ts | 2 +- .../experimentService.test.ts | 2 +- .../experimentalPrompts.test.ts | 2 +- .../extensionsActions.test.ts | 3 +- .../extensionsTipsService.test.ts | 3 +- .../electron-browser/extensionsViews.test.ts | 3 +- .../extensionsWorkbenchService.test.ts | 3 +- .../files/test/browser/editorAutoSave.test.ts | 4 +- .../files/test/browser/explorerView.test.ts | 2 +- .../test/browser/fileEditorInput.test.ts | 2 +- .../test/browser/fileEditorTracker.test.ts | 2 +- .../fileOnDiskProvider.test.ts | 2 +- .../electron-browser/explorerModel.test.ts | 2 +- .../{ => browser}/outputLinkProvider.test.ts | 2 +- .../{common => browser}/queryBuilder.test.ts | 44 +-- .../search/test/browser/searchViewlet.test.ts | 2 +- .../electron-browser/queryBuilder.test.ts | 85 +++++ .../workspaceTags.test.ts | 0 .../url/test/browser}/linkProtection.test.ts | 0 .../backupFileService.test.ts | 2 +- .../configurationEditingService.test.ts | 3 +- .../configurationService.test.ts | 3 +- .../configurationResolverService.test.ts | 3 +- .../test/browser/editorGroupsService.test.ts | 2 +- .../editor/test/browser/editorService.test.ts | 2 +- .../test/browser/editorsObserver.test.ts | 2 +- .../extensionEnablementService.test.ts | 2 +- .../test/{ => browser}/history.test.ts | 2 +- .../browserKeyboardMapper.test.ts | 6 +- .../keybindingEditing.test.ts | 10 +- .../keybindingIO.test.ts | 0 .../keyboardMapperTestUtils.ts | 4 +- .../{ => electron-browser}/linux_de_ch.js | 0 .../{ => electron-browser}/linux_de_ch.txt | 0 .../{ => electron-browser}/linux_en_uk.js | 0 .../{ => electron-browser}/linux_en_uk.txt | 0 .../{ => electron-browser}/linux_en_us.js | 0 .../{ => electron-browser}/linux_en_us.txt | 0 .../test/{ => electron-browser}/linux_ru.js | 0 .../test/{ => electron-browser}/linux_ru.txt | 0 .../macLinuxFallbackKeyboardMapper.test.ts | 2 +- .../macLinuxKeyboardMapper.test.ts | 2 +- .../test/{ => electron-browser}/mac_de_ch.js | 0 .../test/{ => electron-browser}/mac_de_ch.txt | 0 .../test/{ => electron-browser}/mac_en_us.js | 0 .../test/{ => electron-browser}/mac_en_us.txt | 0 .../{ => electron-browser}/mac_zh_hant.js | 0 .../{ => electron-browser}/mac_zh_hant.txt | 0 .../test/{ => electron-browser}/win_de_ch.js | 0 .../test/{ => electron-browser}/win_de_ch.txt | 0 .../test/{ => electron-browser}/win_en_us.js | 0 .../test/{ => electron-browser}/win_en_us.txt | 0 .../{ => electron-browser}/win_por_ptb.js | 0 .../{ => electron-browser}/win_por_ptb.txt | 0 .../test/{ => electron-browser}/win_ru.js | 0 .../test/{ => electron-browser}/win_ru.txt | 0 .../windowsKeyboardMapper.test.ts | 2 +- .../label/test/{ => browser}/label.test.ts | 2 +- .../{ => browser}/progressIndicator.test.ts | 2 +- .../{ => browser}/textFileEditorModel.test.ts | 2 +- .../textFileEditorModelManager.test.ts | 2 +- .../{ => browser}/textFileService.test.ts | 4 +- .../{ => common}/saveSequenzializer.test.ts | 0 .../fixtures/binary.txt | Bin .../fixtures/index.html | 0 .../{ => electron-browser}/fixtures/lorem.txt | 0 .../fixtures/lorem_big5.txt | 0 .../fixtures/lorem_cp1252.txt | 0 .../fixtures/lorem_cp866.txt | 0 .../fixtures/lorem_gbk.txt | 0 .../fixtures/lorem_shiftjis.txt | 0 .../fixtures/lorem_utf16be.txt | Bin .../fixtures/lorem_utf16le.txt | Bin .../fixtures/lorem_utf8bom.txt | 0 .../{ => electron-browser}/fixtures/small.txt | 0 .../fixtures/small_umlaut.txt | 0 .../fixtures/some.utf16le | Bin .../fixtures/some_big5.txt | 0 .../fixtures/some_cp1252.txt | 0 .../fixtures/some_cyrillic.txt | 0 .../fixtures/some_gbk.txt | 0 .../fixtures/some_shiftjs.txt | 0 .../fixtures/some_small_cp1252.txt | 0 .../fixtures/some_utf16le.css | Bin .../fixtures/some_utf8_bom.txt | 0 .../fixtures/utf16_be_nobom.txt | Bin .../fixtures/utf16_le_nobom.txt | Bin .../textFileService.io.test.ts | 2 +- .../textModelResolverService.test.ts | 4 +- .../test/common/workingCopyService.test.ts | 2 +- src/vs/workbench/test/browser/part.test.ts | 2 +- .../browser/parts/editor/baseEditor.test.ts | 2 +- .../parts/editor/breadcrumbModel.test.ts | 2 +- .../parts}/editor/editor.test.ts | 2 +- .../parts}/editor/editorDiffModel.test.ts | 4 +- .../parts}/editor/editorGroups.test.ts | 2 +- .../parts}/editor/editorInput.test.ts | 0 .../parts}/editor/editorModel.test.ts | 2 +- .../parts/editor/rangeDecorations.test.ts | 2 +- .../parts}/editor/resourceEditorInput.test.ts | 2 +- .../parts}/editor/untitledTextEditor.test.ts | 2 +- .../test/browser/parts/views/views.test.ts | 2 +- .../{ => browser}/workbenchTestServices.ts | 327 ++---------------- src/vs/workbench/test/common/memento.test.ts | 4 +- .../test/common/workbenchTestServices.ts | 129 +++++++ .../api/mainThreadDocumentsAndEditors.test.ts | 2 +- .../api/mainThreadEditors.test.ts | 2 +- .../api/mainThreadSaveParticipant.test.ts | 2 +- .../api/mainThreadWorkspace.test.ts | 2 +- .../quickopen.perf.integrationTest.ts | 3 +- .../textsearch.perf.integrationTest.ts | 3 +- .../electron-browser/workbenchTestServices.ts | 188 ++++++++++ 120 files changed, 603 insertions(+), 410 deletions(-) rename src/vs/platform/commands/test/{ => common}/commands.test.ts (100%) rename src/vs/platform/files/test/{ => common}/files.test.ts (99%) rename src/vs/workbench/contrib/files/test/{common => browser}/fileOnDiskProvider.test.ts (97%) rename src/vs/workbench/contrib/output/test/{ => browser}/outputLinkProvider.test.ts (99%) rename src/vs/workbench/contrib/search/test/{common => browser}/queryBuilder.test.ts (95%) create mode 100644 src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts rename src/vs/workbench/contrib/tags/test/{ => electron-browser}/workspaceTags.test.ts (100%) rename src/vs/workbench/{test/contrib => contrib/url/test/browser}/linkProtection.test.ts (100%) rename src/vs/workbench/services/history/test/{ => browser}/history.test.ts (99%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/browserKeyboardMapper.test.ts (95%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/keybindingIO.test.ts (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/keyboardMapperTestUtils.ts (95%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_de_ch.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_de_ch.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_en_uk.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_en_uk.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_en_us.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_en_us.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_ru.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/linux_ru.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/macLinuxFallbackKeyboardMapper.test.ts (98%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/macLinuxKeyboardMapper.test.ts (99%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_de_ch.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_de_ch.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_en_us.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_en_us.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_zh_hant.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/mac_zh_hant.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_de_ch.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_de_ch.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_en_us.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_en_us.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_por_ptb.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_por_ptb.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_ru.js (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/win_ru.txt (100%) rename src/vs/workbench/services/keybinding/test/{ => electron-browser}/windowsKeyboardMapper.test.ts (99%) rename src/vs/workbench/services/label/test/{ => browser}/label.test.ts (99%) rename src/vs/workbench/services/progress/test/{ => browser}/progressIndicator.test.ts (99%) rename src/vs/workbench/services/textfile/test/{ => browser}/textFileEditorModel.test.ts (99%) rename src/vs/workbench/services/textfile/test/{ => browser}/textFileEditorModelManager.test.ts (99%) rename src/vs/workbench/services/textfile/test/{ => browser}/textFileService.test.ts (95%) rename src/vs/workbench/services/textfile/test/{ => common}/saveSequenzializer.test.ts (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/binary.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/index.html (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_big5.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_cp1252.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_cp866.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_gbk.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_shiftjis.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_utf16be.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_utf16le.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/lorem_utf8bom.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/small.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/small_umlaut.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some.utf16le (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_big5.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_cp1252.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_cyrillic.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_gbk.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_shiftjs.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_small_cp1252.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_utf16le.css (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/some_utf8_bom.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/utf16_be_nobom.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/fixtures/utf16_le_nobom.txt (100%) rename src/vs/workbench/services/textfile/test/{ => electron-browser}/textFileService.io.test.ts (99%) rename src/vs/workbench/services/textmodelResolver/test/{ => browser}/textModelResolverService.test.ts (97%) rename src/vs/workbench/test/{common => browser/parts}/editor/editor.test.ts (99%) rename src/vs/workbench/test/{common => browser/parts}/editor/editorDiffModel.test.ts (92%) rename src/vs/workbench/test/{common => browser/parts}/editor/editorGroups.test.ts (99%) rename src/vs/workbench/test/{common => browser/parts}/editor/editorInput.test.ts (100%) rename src/vs/workbench/test/{common => browser/parts}/editor/editorModel.test.ts (98%) rename src/vs/workbench/test/{common => browser/parts}/editor/resourceEditorInput.test.ts (98%) rename src/vs/workbench/test/{common => browser/parts}/editor/untitledTextEditor.test.ts (99%) rename src/vs/workbench/test/{ => browser}/workbenchTestServices.ts (78%) create mode 100644 src/vs/workbench/test/common/workbenchTestServices.ts create mode 100644 src/vs/workbench/test/electron-browser/workbenchTestServices.ts diff --git a/src/vs/platform/commands/test/commands.test.ts b/src/vs/platform/commands/test/common/commands.test.ts similarity index 100% rename from src/vs/platform/commands/test/commands.test.ts rename to src/vs/platform/commands/test/common/commands.test.ts diff --git a/src/vs/platform/files/test/files.test.ts b/src/vs/platform/files/test/common/files.test.ts similarity index 99% rename from src/vs/platform/files/test/files.test.ts rename to src/vs/platform/files/test/common/files.test.ts index 153d4201ba6..5956d293b4c 100644 --- a/src/vs/platform/files/test/files.test.ts +++ b/src/vs/platform/files/test/common/files.test.ts @@ -8,6 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { isEqual, isEqualOrParent } from 'vs/base/common/extpath'; import { FileChangeType, FileChangesEvent, isParent } from 'vs/platform/files/common/files'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; +// eslint-disable-next-line code-import-patterns import { toResource } from 'vs/base/test/common/utils'; suite('Files', () => { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index e082679d700..f460432d840 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -11,14 +11,93 @@ import * as pfs from 'vs/base/node/pfs'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; import { WorkspacesMainService, IStoredWorkspace } from 'vs/platform/workspaces/electron-main/workspacesMainService'; -import { WORKSPACE_EXTENSION, IRawFileWorkspaceFolder, IWorkspaceFolderCreationData, IRawUriWorkspaceFolder, rewriteWorkspaceFileForNewLocation } from 'vs/platform/workspaces/common/workspaces'; +import { WORKSPACE_EXTENSION, IRawFileWorkspaceFolder, IWorkspaceFolderCreationData, IRawUriWorkspaceFolder, rewriteWorkspaceFileForNewLocation, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { NullLogService } from 'vs/platform/log/common/log'; import { URI } from 'vs/base/common/uri'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { isWindows } from 'vs/base/common/platform'; import { normalizeDriveLetter } from 'vs/base/common/labels'; import { dirname, joinPath } from 'vs/base/common/resources'; -import { TestBackupMainService, TestDialogMainService } from 'vs/workbench/test/workbenchTestServices'; +import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { IBackupMainService, IWorkspaceBackupInfo } from 'vs/platform/backup/electron-main/backup'; +import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; + +export class TestDialogMainService implements IDialogMainService { + _serviceBrand: undefined; + + pickFileFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + pickFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + pickFile(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + pickWorkspace(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } + + showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { + throw new Error('Method not implemented.'); + } +} + +export class TestBackupMainService implements IBackupMainService { + _serviceBrand: undefined; + + isHotExitEnabled(): boolean { + throw new Error('Method not implemented.'); + } + + getWorkspaceBackups(): IWorkspaceBackupInfo[] { + throw new Error('Method not implemented.'); + } + + getFolderBackupPaths(): URI[] { + throw new Error('Method not implemented.'); + } + + getEmptyWindowBackupPaths(): IEmptyWindowBackupInfo[] { + throw new Error('Method not implemented.'); + } + + registerWorkspaceBackupSync(workspace: IWorkspaceBackupInfo, migrateFrom?: string | undefined): string { + throw new Error('Method not implemented.'); + } + + registerFolderBackupSync(folderUri: URI): string { + throw new Error('Method not implemented.'); + } + + registerEmptyWindowBackupSync(backupFolder?: string | undefined, remoteAuthority?: string | undefined): string { + throw new Error('Method not implemented.'); + } + + unregisterWorkspaceBackupSync(workspace: IWorkspaceIdentifier): void { + throw new Error('Method not implemented.'); + } + + unregisterFolderBackupSync(folderUri: URI): void { + throw new Error('Method not implemented.'); + } + + unregisterEmptyWindowBackupSync(backupFolder: string): void { + throw new Error('Method not implemented.'); + } +} suite('WorkspacesMainService', () => { const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'workspacesservice'); diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts index ac8680aea3f..94b546b5a2f 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts @@ -15,7 +15,7 @@ import { DefaultEndOfLine } from 'vs/editor/common/model'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { hashPath } from 'vs/workbench/services/backup/node/backupFileService'; import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-browser/backupTracker'; -import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { BackupRestorer } from 'vs/workbench/contrib/backup/common/backupRestorer'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts index 4ae7f1e7421..07497c79a54 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts @@ -13,7 +13,7 @@ import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { hashPath } from 'vs/workbench/services/backup/node/backupFileService'; import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-browser/backupTracker'; -import { TestTextFileService, workbenchInstantiationService, TestLifecycleService, TestFilesConfigurationService, TestContextService, TestFileService, TestElectronService, TestFileDialogService } from 'vs/workbench/test/workbenchTestServices'; +import { TestLifecycleService, TestFilesConfigurationService, TestContextService, TestFileService, TestFileDialogService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; @@ -42,6 +42,7 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { BackupTracker } from 'vs/workbench/contrib/backup/common/backupTracker'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; +import { TestTextFileService, TestElectronService, workbenchInstantiationService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; const userdataDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'backuprestorer'); const backupHome = path.join(userdataDir, 'Backups'); diff --git a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index 9ecd1023005..eb29ef3a07c 100644 --- a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -11,7 +11,7 @@ import { MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { isStatusbarInDebugMode } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; import { State } from 'vs/workbench/contrib/debug/common/debug'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts index dc333048571..6ba96158d52 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -8,7 +8,7 @@ import * as dom from 'vs/base/browser/dom'; import { generateUuid } from 'vs/base/common/uuid'; import { appendStylizedStringToContainer, handleANSIOutput, calcANSI8bitColor } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { Color, RGBA } from 'vs/base/common/color'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts index c98019c513a..b22d2044a9c 100644 --- a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { isWindows } from 'vs/base/common/platform'; import { WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts index 5105121ce58..8524ab38a8f 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -11,7 +11,7 @@ import { Debugger } from 'vs/workbench/contrib/debug/common/debugger'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { URI } from 'vs/base/common/uri'; import { ExecutableDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; -import { TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextResourcePropertiesService } from 'vs/editor/test/common/services/modelService.test'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts index d1760d86d52..c15f650b26f 100644 --- a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { ExperimentActionType, ExperimentState, IExperiment, ExperimentService } from 'vs/workbench/contrib/experiments/common/experimentService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; +import { TestLifecycleService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IExtensionManagementService, DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; diff --git a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts index ff693a1f4e3..5c0e4f90a94 100644 --- a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts @@ -15,7 +15,7 @@ import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtil import { ExperimentalPrompts } from 'vs/workbench/contrib/experiments/browser/experimentalPrompt'; import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService, LocalizedPromptText } from 'vs/workbench/contrib/experiments/common/experimentService'; import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; -import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; +import { TestLifecycleService } from 'vs/workbench/test/browser/workbenchTestServices'; suite('Experimental Prompts', () => { let instantiationService: TestInstantiationService; diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index 914359dcfca..8332aa9209c 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -27,7 +27,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestContextService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { URLService } from 'vs/platform/url/node/urlService'; diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts index d89c8cd79ab..d9af9315a0d 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts @@ -22,7 +22,8 @@ import { Emitter } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestContextService, TestLifecycleService, TestSharedProcessService, productService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestLifecycleService, productService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts index b0c97c59d9d..89f4df2db7c 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts @@ -27,7 +27,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestContextService, TestSharedProcessService, TestMenuService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestMenuService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { URLService } from 'vs/platform/url/node/urlService'; diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 57095928076..13655b0da65 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -27,7 +27,8 @@ import { IPager } from 'vs/base/common/paging'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestContextService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IProgressService } from 'vs/platform/progress/common/progress'; diff --git a/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts b/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts index 7f8f47c2b25..93617ce7314 100644 --- a/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { Event } from 'vs/base/common/event'; import { toResource } from 'vs/base/test/common/utils'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { workbenchInstantiationService, TestTextFileService, TestFileService, TestFilesConfigurationService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService, TestFilesConfigurationService, TestEnvironmentService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ITextFileService, IResolvedTextFileEditorModel, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -32,7 +32,7 @@ class ServiceAccessor { constructor( @IEditorService public editorService: IEditorService, @IEditorGroupsService public editorGroupService: IEditorGroupsService, - @ITextFileService public textFileService: TestTextFileService, + @ITextFileService public textFileService: ITextFileService, @IFileService public fileService: TestFileService, @IConfigurationService public configurationService: TestConfigurationService ) { diff --git a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts index 7ad3da744ea..2c40a917185 100644 --- a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { toResource } from 'vs/base/test/common/utils'; -import { TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { getContext } from 'vs/workbench/contrib/files/browser/views/explorerView'; import { listInvalidItemForeground } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts index 60d492ba393..3d987628e4f 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { toResource } from 'vs/base/test/common/utils'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EncodingMode, Verbosity } from 'vs/workbench/common/editor'; import { ITextFileService, TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts index 54e1c76d0e0..e98ba327585 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts @@ -8,7 +8,7 @@ import { Event } from 'vs/base/common/event'; import { FileEditorTracker } from 'vs/workbench/contrib/files/browser/editors/fileEditorTracker'; import { toResource } from 'vs/base/test/common/utils'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { workbenchInstantiationService, TestTextFileService, TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService, TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ITextFileService, IResolvedTextFileEditorModel, snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; import { FileChangesEvent, FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; diff --git a/src/vs/workbench/contrib/files/test/common/fileOnDiskProvider.test.ts b/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts similarity index 97% rename from src/vs/workbench/contrib/files/test/common/fileOnDiskProvider.test.ts rename to src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts index 9c2064028d2..18735013da0 100644 --- a/src/vs/workbench/contrib/files/test/common/fileOnDiskProvider.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestFileService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileContentProvider } from 'vs/workbench/contrib/files/common/files'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts b/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts index 6966534a25b..743e1f939ea 100644 --- a/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts +++ b/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts @@ -10,7 +10,7 @@ import { join } from 'vs/base/common/path'; import { validateFileName } from 'vs/workbench/contrib/files/browser/fileActions'; import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { toResource } from 'vs/base/test/common/utils'; -import { TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService } from 'vs/workbench/test/browser/workbenchTestServices'; const fileService = new TestFileService(); function createStat(this: any, path: string, name: string, isFolder: boolean, hasChildren: boolean, size: number, mtime: number): ExplorerItem { diff --git a/src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts b/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts similarity index 99% rename from src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts rename to src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts index 554e84456fe..ce131747b3c 100644 --- a/src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts +++ b/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { isMacintosh, isLinux, isWindows } from 'vs/base/common/platform'; import { OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; -import { TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; function toOSPath(p: string): string { if (isMacintosh || isLinux) { diff --git a/src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts b/src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts similarity index 95% rename from src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts rename to src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts index ed8fd458877..26f6e129337 100644 --- a/src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts @@ -13,7 +13,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { IFolderQuery, IPatternInfo, QueryType, ITextQuery, IFileQuery } from 'vs/workbench/services/search/common/search'; import { IWorkspaceContextService, toWorkspaceFolder, Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; -import { TestContextService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestEnvironmentService } from 'vs/workbench/test/browser/workbenchTestServices'; import { isWindows } from 'vs/base/common/platform'; const DEFAULT_EDITOR_CONFIG = {}; @@ -584,32 +584,6 @@ suite('QueryBuilder', () => { cases.forEach(testIncludesDataItem); }); - test('includes with tilde', () => { - const userHome = TestEnvironmentService.userHome; - const cases: [string, ISearchPathsInfo][] = [ - [ - '~/foo/bar', - { - searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }] - } - ], - [ - '~/foo/bar, a', - { - searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }], - pattern: patternsToIExpression(...globalGlob('a')) - } - ], - [ - fixPath('/foo/~/bar'), - { - searchPaths: [{ searchPath: getUri('/foo/~/bar') }] - } - ], - ]; - cases.forEach(testIncludesDataItem); - }); - test('relative includes w/single root folder', () => { const cases: [string, ISearchPathsInfo][] = [ [ @@ -949,7 +923,7 @@ function assertEqualTextQueries(actual: ITextQuery, expected: ITextQuery): void return assertEqualQueries(actual, expected); } -function assertEqualQueries(actual: ITextQuery | IFileQuery, expected: ITextQuery | IFileQuery): void { +export function assertEqualQueries(actual: ITextQuery | IFileQuery, expected: ITextQuery | IFileQuery): void { expected = { ...DEFAULT_QUERY_PROPS, ...expected @@ -985,7 +959,7 @@ function assertEqualQueries(actual: ITextQuery | IFileQuery, expected: ITextQuer assert.deepEqual(actual, expected); } -function assertEqualSearchPathResults(actual: ISearchPathsInfo, expected: ISearchPathsInfo, message?: string): void { +export function assertEqualSearchPathResults(actual: ISearchPathsInfo, expected: ISearchPathsInfo, message?: string): void { cleanUndefinedQueryValues(actual); assert.deepEqual(actual.pattern, expected.pattern, message); @@ -1003,7 +977,7 @@ function assertEqualSearchPathResults(actual: ISearchPathsInfo, expected: ISearc * Recursively delete all undefined property values from the search query, to make it easier to * assert.deepEqual with some expected object. */ -function cleanUndefinedQueryValues(q: any): void { +export function cleanUndefinedQueryValues(q: any): void { for (const key in q) { if (q[key] === undefined) { delete q[key]; @@ -1015,24 +989,24 @@ function cleanUndefinedQueryValues(q: any): void { return q; } -function globalGlob(pattern: string): string[] { +export function globalGlob(pattern: string): string[] { return [ `**/${pattern}/**`, `**/${pattern}` ]; } -function patternsToIExpression(...patterns: string[]): IExpression { +export function patternsToIExpression(...patterns: string[]): IExpression { return patterns.length ? patterns.reduce((glob, cur) => { glob[cur] = true; return glob; }, Object.create(null)) : undefined; } -function getUri(...slashPathParts: string[]): uri { +export function getUri(...slashPathParts: string[]): uri { return uri.file(fixPath(...slashPathParts)); } -function fixPath(...slashPathParts: string[]): string { +export function fixPath(...slashPathParts: string[]): string { if (isWindows && slashPathParts.length && !slashPathParts[0].match(/^c:/i)) { slashPathParts.unshift('c:'); } @@ -1040,7 +1014,7 @@ function fixPath(...slashPathParts: string[]): string { return join(...slashPathParts); } -function normalizeExpression(expression: IExpression | undefined): IExpression | undefined { +export function normalizeExpression(expression: IExpression | undefined): IExpression | undefined { if (!expression) { return expression; } diff --git a/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts index 7c1ea08b6e3..a1c96e21aa2 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts @@ -13,7 +13,7 @@ import { IFileMatch, ITextSearchMatch, OneLineRange, QueryType, SearchSortOrder import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { FileMatch, Match, searchMatchComparer, SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; -import { TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; import { isWindows } from 'vs/base/common/platform'; suite('Search - Viewlet', () => { diff --git a/src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts b/src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts new file mode 100644 index 00000000000..5222422e2b4 --- /dev/null +++ b/src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { IWorkspaceContextService, toWorkspaceFolder, Workspace } from 'vs/platform/workspace/common/workspace'; +import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestEnvironmentService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import { assertEqualSearchPathResults, getUri, patternsToIExpression, globalGlob, fixPath } from 'vs/workbench/contrib/search/test/browser/queryBuilder.test'; + +const DEFAULT_EDITOR_CONFIG = {}; +const DEFAULT_USER_CONFIG = { useRipgrep: true, useIgnoreFiles: true, useGlobalIgnoreFiles: true }; + +suite('QueryBuilder', () => { + const ROOT_1 = fixPath('/foo/root1'); + const ROOT_1_URI = getUri(ROOT_1); + + let instantiationService: TestInstantiationService; + let queryBuilder: QueryBuilder; + let mockConfigService: TestConfigurationService; + let mockContextService: TestContextService; + let mockWorkspace: Workspace; + + setup(() => { + instantiationService = new TestInstantiationService(); + + mockConfigService = new TestConfigurationService(); + mockConfigService.setUserConfiguration('search', DEFAULT_USER_CONFIG); + mockConfigService.setUserConfiguration('editor', DEFAULT_EDITOR_CONFIG); + instantiationService.stub(IConfigurationService, mockConfigService); + + mockContextService = new TestContextService(); + mockWorkspace = new Workspace('workspace', [toWorkspaceFolder(ROOT_1_URI)]); + mockContextService.setWorkspace(mockWorkspace); + + instantiationService.stub(IWorkspaceContextService, mockContextService); + instantiationService.stub(IEnvironmentService, TestEnvironmentService); + + queryBuilder = instantiationService.createInstance(QueryBuilder); + }); + + suite('parseSearchPaths', () => { + + function testIncludes(includePattern: string, expectedResult: ISearchPathsInfo): void { + assertEqualSearchPathResults( + queryBuilder.parseSearchPaths(includePattern), + expectedResult, + includePattern); + } + + function testIncludesDataItem([includePattern, expectedResult]: [string, ISearchPathsInfo]): void { + testIncludes(includePattern, expectedResult); + } + + test('includes with tilde', () => { + const userHome = TestEnvironmentService.userHome; + const cases: [string, ISearchPathsInfo][] = [ + [ + '~/foo/bar', + { + searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }] + } + ], + [ + '~/foo/bar, a', + { + searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }], + pattern: patternsToIExpression(...globalGlob('a')) + } + ], + [ + fixPath('/foo/~/bar'), + { + searchPaths: [{ searchPath: getUri('/foo/~/bar') }] + } + ], + ]; + cases.forEach(testIncludesDataItem); + }); + }); +}); diff --git a/src/vs/workbench/contrib/tags/test/workspaceTags.test.ts b/src/vs/workbench/contrib/tags/test/electron-browser/workspaceTags.test.ts similarity index 100% rename from src/vs/workbench/contrib/tags/test/workspaceTags.test.ts rename to src/vs/workbench/contrib/tags/test/electron-browser/workspaceTags.test.ts diff --git a/src/vs/workbench/test/contrib/linkProtection.test.ts b/src/vs/workbench/contrib/url/test/browser/linkProtection.test.ts similarity index 100% rename from src/vs/workbench/test/contrib/linkProtection.test.ts rename to src/vs/workbench/contrib/url/test/browser/linkProtection.test.ts diff --git a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts index ac020313462..77e239607a4 100644 --- a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts @@ -26,7 +26,7 @@ import { hashPath, BackupFileService } from 'vs/workbench/services/backup/node/b import { BACKUPS } from 'vs/platform/environment/common/environment'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { VSBuffer } from 'vs/base/common/buffer'; -import { TestWindowConfiguration } from 'vs/workbench/test/workbenchTestServices'; +import { TestWindowConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; const userdataDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'backupfileservice'); const appSettingsHome = path.join(userdataDir, 'User'); diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts index 07a2bd32de9..606660daeac 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts @@ -12,7 +12,8 @@ import * as json from 'vs/base/common/json'; import { Registry } from 'vs/platform/registry/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestTextFileService, workbenchInstantiationService, TestWindowConfiguration } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestWindowConfiguration, TestTextFileService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index 086e6ef8b0a..613a0148272 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -20,7 +20,8 @@ import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configurati import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { workbenchInstantiationService, TestTextFileService, RemoteFileSystemProvider, TestWindowConfiguration } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, RemoteFileSystemProvider } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestWindowConfiguration, TestTextFileService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; diff --git a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts index b853c5ea658..f8ece9854b7 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts @@ -11,7 +11,8 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { ConfigurationResolverService } from 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { TestEditorService, TestContextService, TestWindowConfiguration } from 'vs/workbench/test/workbenchTestServices'; +import { TestEditorService, TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestWindowConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { Disposable } from 'vs/base/common/lifecycle'; import { IQuickInputService, IQuickPickItem, QuickPickInput, IPickOptions, Omit, IInputOptions, IQuickInputButton, IQuickPick, IInputBox, IQuickNavigateConfiguration } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index 014473bce7a..ffcd2cb6215 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; -import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupChangeKind, GroupLocation } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EditorInput, IFileEditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorExtensions, EditorOptions, CloseDirection, IEditorPartOptions, EditorsOrder } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index ddec69f8f72..57307219e1e 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -8,7 +8,7 @@ import { EditorActivation, IEditorModel } from 'vs/platform/editor/common/editor import { URI } from 'vs/base/common/uri'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorInput, EditorOptions, IFileEditorInput, GroupIdentifier, ISaveOptions, IRevertOptions, EditorsOrder, IEditorInput } from 'vs/workbench/common/editor'; -import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { EditorService, DelegatingEditorService } from 'vs/workbench/services/editor/browser/editorService'; diff --git a/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts b/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts index 1dae9361931..b1129a2dc01 100644 --- a/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { EditorOptions, EditorInput, IEditorInputFactoryRegistry, Extensions as EditorExtensions, IEditorInputFactory, IFileEditorInput } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { IEditorRegistry, EditorDescriptor, Extensions } from 'vs/workbench/browser/editor'; diff --git a/src/vs/workbench/services/extensionManagement/test/electron-browser/extensionEnablementService.test.ts b/src/vs/workbench/services/extensionManagement/test/electron-browser/extensionEnablementService.test.ts index 000a28dcee0..7a4ee7ed3cc 100644 --- a/src/vs/workbench/services/extensionManagement/test/electron-browser/extensionEnablementService.test.ts +++ b/src/vs/workbench/services/extensionManagement/test/electron-browser/extensionEnablementService.test.ts @@ -21,7 +21,7 @@ import { Schemas } from 'vs/base/common/network'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { assign } from 'vs/base/common/objects'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { productService } from 'vs/workbench/test/workbenchTestServices'; +import { productService } from 'vs/workbench/test/browser/workbenchTestServices'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; function createStorageService(instantiationService: TestInstantiationService): IStorageService { diff --git a/src/vs/workbench/services/history/test/history.test.ts b/src/vs/workbench/services/history/test/browser/history.test.ts similarity index 99% rename from src/vs/workbench/services/history/test/history.test.ts rename to src/vs/workbench/services/history/test/browser/history.test.ts index 0ccce7b7c28..6ea008debf7 100644 --- a/src/vs/workbench/services/history/test/history.test.ts +++ b/src/vs/workbench/services/history/test/browser/history.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { EditorOptions, EditorInput, IEditorInputFactoryRegistry, Extensions as EditorExtensions, IEditorInputFactory, IFileEditorInput } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { IEditorRegistry, EditorDescriptor, Extensions } from 'vs/workbench/browser/editor'; diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/browserKeyboardMapper.test.ts similarity index 95% rename from src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/browserKeyboardMapper.test.ts index a01c00e3180..93aec7997a5 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/browserKeyboardMapper.test.ts @@ -6,13 +6,13 @@ import * as assert from 'assert'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin'; // 15% import 'vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin'; import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { BrowserKeyboardMapperFactoryBase } from '../browser/keymapService'; -import { KeymapInfo, IKeymapInfo } from '../common/keymapInfo'; +import { BrowserKeyboardMapperFactoryBase } from '../../browser/keymapService'; +import { KeymapInfo, IKeymapInfo } from '../../common/keymapInfo'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 339f4b3b4ce..924ac2bb3b1 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -38,7 +38,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { KeybindingsEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; -import { TestBackupFileService, TestContextService, TestEditorGroupsService, TestEditorService, TestLifecycleService, TestTextFileService, TestTextResourcePropertiesService, TestWorkingCopyService, TestWindowConfiguration } from 'vs/workbench/test/workbenchTestServices'; +import { TestBackupFileService, TestContextService, TestEditorGroupsService, TestEditorService, TestLifecycleService, TestTextResourcePropertiesService, TestWorkingCopyService } from 'vs/workbench/test/browser/workbenchTestServices'; import { FileService } from 'vs/platform/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; @@ -47,6 +47,10 @@ import { FileUserDataProvider } from 'vs/workbench/services/userData/common/file import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { TestWindowConfiguration, TestTextFileService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { LabelService } from 'vs/workbench/services/label/common/labelService'; +import { IFilesConfigurationService, FilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; class TestEnvironmentService extends NativeWorkbenchEnvironmentService { @@ -65,7 +69,7 @@ interface Modifiers { shiftKey?: boolean; } -suite.skip('KeybindingsEditing', () => { +suite('KeybindingsEditing', () => { let instantiationService: TestInstantiationService; let testObject: KeybindingsEditingService; @@ -95,6 +99,8 @@ suite.skip('KeybindingsEditing', () => { instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.stub(IModeService, ModeServiceImpl); instantiationService.stub(ILogService, new NullLogService()); + instantiationService.stub(ILabelService, instantiationService.createInstance(LabelService)); + instantiationService.stub(IFilesConfigurationService, instantiationService.createInstance(FilesConfigurationService)); instantiationService.stub(ITextResourcePropertiesService, new TestTextResourcePropertiesService(instantiationService.get(IConfigurationService))); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); const fileService = new FileService(new NullLogService()); diff --git a/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingIO.test.ts similarity index 100% rename from src/vs/workbench/services/keybinding/test/keybindingIO.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/keybindingIO.test.ts diff --git a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils.ts similarity index 95% rename from src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils.ts index 7cc3b4be295..5e0f097b7e9 100644 --- a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils.ts @@ -50,7 +50,7 @@ export function assertResolveUserBinding(mapper: IKeyboardMapper, parts: (Simple } export function readRawMapping(file: string): Promise { - return readFile(getPathFromAmdModule(require, `vs/workbench/services/keybinding/test/${file}.js`)).then((buff) => { + return readFile(getPathFromAmdModule(require, `vs/workbench/services/keybinding/test/electron-browser/${file}.js`)).then((buff) => { let contents = buff.toString(); let func = new Function('define', contents); let rawMappings: T | null = null; @@ -62,7 +62,7 @@ export function readRawMapping(file: string): Promise { } export function assertMapping(writeFileIfDifferent: boolean, mapper: IKeyboardMapper, file: string): Promise { - const filePath = path.normalize(getPathFromAmdModule(require, `vs/workbench/services/keybinding/test/${file}`)); + const filePath = path.normalize(getPathFromAmdModule(require, `vs/workbench/services/keybinding/test/electron-browser/${file}`)); return readFile(filePath).then((buff) => { let expected = buff.toString(); diff --git a/src/vs/workbench/services/keybinding/test/linux_de_ch.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_de_ch.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_de_ch.js rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_de_ch.js diff --git a/src/vs/workbench/services/keybinding/test/linux_de_ch.txt b/src/vs/workbench/services/keybinding/test/electron-browser/linux_de_ch.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_de_ch.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_de_ch.txt diff --git a/src/vs/workbench/services/keybinding/test/linux_en_uk.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_en_uk.js rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js diff --git a/src/vs/workbench/services/keybinding/test/linux_en_uk.txt b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_en_uk.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.txt diff --git a/src/vs/workbench/services/keybinding/test/linux_en_us.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_us.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_en_us.js rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_en_us.js diff --git a/src/vs/workbench/services/keybinding/test/linux_en_us.txt b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_us.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_en_us.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_en_us.txt diff --git a/src/vs/workbench/services/keybinding/test/linux_ru.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_ru.js rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js diff --git a/src/vs/workbench/services/keybinding/test/linux_ru.txt b/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/linux_ru.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.txt diff --git a/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts similarity index 98% rename from src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts index 410f0ac6644..c61fee376c9 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts @@ -7,7 +7,7 @@ import { KeyChord, KeyCode, KeyMod, SimpleKeybinding, createKeybinding } from 'v import { OperatingSystem } from 'vs/base/common/platform'; import { ScanCode, ScanCodeBinding } from 'vs/base/common/scanCode'; import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; -import { IResolvedKeybinding, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding } from 'vs/workbench/services/keybinding/test/keyboardMapperTestUtils'; +import { IResolvedKeybinding, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding } from 'vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils'; suite('keyboardMapper - MAC fallback', () => { diff --git a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts similarity index 99% rename from src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts index d2d22d10600..f4088abc61e 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts @@ -10,7 +10,7 @@ import { OperatingSystem } from 'vs/base/common/platform'; import { ScanCode, ScanCodeBinding, ScanCodeUtils } from 'vs/base/common/scanCode'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; -import { IResolvedKeybinding, assertMapping, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding, readRawMapping } from 'vs/workbench/services/keybinding/test/keyboardMapperTestUtils'; +import { IResolvedKeybinding, assertMapping, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding, readRawMapping } from 'vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils'; const WRITE_FILE_IF_DIFFERENT = false; diff --git a/src/vs/workbench/services/keybinding/test/mac_de_ch.js b/src/vs/workbench/services/keybinding/test/electron-browser/mac_de_ch.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_de_ch.js rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_de_ch.js diff --git a/src/vs/workbench/services/keybinding/test/mac_de_ch.txt b/src/vs/workbench/services/keybinding/test/electron-browser/mac_de_ch.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_de_ch.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_de_ch.txt diff --git a/src/vs/workbench/services/keybinding/test/mac_en_us.js b/src/vs/workbench/services/keybinding/test/electron-browser/mac_en_us.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_en_us.js rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_en_us.js diff --git a/src/vs/workbench/services/keybinding/test/mac_en_us.txt b/src/vs/workbench/services/keybinding/test/electron-browser/mac_en_us.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_en_us.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_en_us.txt diff --git a/src/vs/workbench/services/keybinding/test/mac_zh_hant.js b/src/vs/workbench/services/keybinding/test/electron-browser/mac_zh_hant.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_zh_hant.js rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_zh_hant.js diff --git a/src/vs/workbench/services/keybinding/test/mac_zh_hant.txt b/src/vs/workbench/services/keybinding/test/electron-browser/mac_zh_hant.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/mac_zh_hant.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/mac_zh_hant.txt diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.js b/src/vs/workbench/services/keybinding/test/electron-browser/win_de_ch.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_de_ch.js rename to src/vs/workbench/services/keybinding/test/electron-browser/win_de_ch.js diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.txt b/src/vs/workbench/services/keybinding/test/electron-browser/win_de_ch.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_de_ch.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/win_de_ch.txt diff --git a/src/vs/workbench/services/keybinding/test/win_en_us.js b/src/vs/workbench/services/keybinding/test/electron-browser/win_en_us.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_en_us.js rename to src/vs/workbench/services/keybinding/test/electron-browser/win_en_us.js diff --git a/src/vs/workbench/services/keybinding/test/win_en_us.txt b/src/vs/workbench/services/keybinding/test/electron-browser/win_en_us.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_en_us.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/win_en_us.txt diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.js b/src/vs/workbench/services/keybinding/test/electron-browser/win_por_ptb.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_por_ptb.js rename to src/vs/workbench/services/keybinding/test/electron-browser/win_por_ptb.js diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt b/src/vs/workbench/services/keybinding/test/electron-browser/win_por_ptb.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_por_ptb.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/win_por_ptb.txt diff --git a/src/vs/workbench/services/keybinding/test/win_ru.js b/src/vs/workbench/services/keybinding/test/electron-browser/win_ru.js similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_ru.js rename to src/vs/workbench/services/keybinding/test/electron-browser/win_ru.js diff --git a/src/vs/workbench/services/keybinding/test/win_ru.txt b/src/vs/workbench/services/keybinding/test/electron-browser/win_ru.txt similarity index 100% rename from src/vs/workbench/services/keybinding/test/win_ru.txt rename to src/vs/workbench/services/keybinding/test/electron-browser/win_ru.txt diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts similarity index 99% rename from src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts index 10e576b7bd7..5babd01552e 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts @@ -7,7 +7,7 @@ import { KeyChord, KeyCode, KeyMod, SimpleKeybinding, createKeybinding } from 'v import { OperatingSystem } from 'vs/base/common/platform'; import { ScanCode, ScanCodeBinding } from 'vs/base/common/scanCode'; import { IWindowsKeyboardMapping, WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; -import { IResolvedKeybinding, assertMapping, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding, readRawMapping } from 'vs/workbench/services/keybinding/test/keyboardMapperTestUtils'; +import { IResolvedKeybinding, assertMapping, assertResolveKeybinding, assertResolveKeyboardEvent, assertResolveUserBinding, readRawMapping } from 'vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils'; const WRITE_FILE_IF_DIFFERENT = false; diff --git a/src/vs/workbench/services/label/test/label.test.ts b/src/vs/workbench/services/label/test/browser/label.test.ts similarity index 99% rename from src/vs/workbench/services/label/test/label.test.ts rename to src/vs/workbench/services/label/test/browser/label.test.ts index a0d8af36a20..b9afd8221e9 100644 --- a/src/vs/workbench/services/label/test/label.test.ts +++ b/src/vs/workbench/services/label/test/browser/label.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { TestEnvironmentService, TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEnvironmentService, TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { URI } from 'vs/base/common/uri'; import { sep } from 'vs/base/common/path'; diff --git a/src/vs/workbench/services/progress/test/progressIndicator.test.ts b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts similarity index 99% rename from src/vs/workbench/services/progress/test/progressIndicator.test.ts rename to src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts index 79f25c0b909..f5f47990d29 100644 --- a/src/vs/workbench/services/progress/test/progressIndicator.test.ts +++ b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts @@ -10,7 +10,7 @@ import { CompositeScope, CompositeProgressIndicator } from 'vs/workbench/service import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewlet } from 'vs/workbench/common/viewlet'; -import { TestViewletService, TestPanelService } from 'vs/workbench/test/workbenchTestServices'; +import { TestViewletService, TestPanelService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Event } from 'vs/base/common/event'; import { IView, IViewPaneContainer } from 'vs/workbench/common/views'; diff --git a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts similarity index 99% rename from src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts rename to src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts index 9d4d74cceb3..d6bc866bf8f 100644 --- a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts @@ -8,7 +8,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { EncodingMode } from 'vs/workbench/common/editor'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { ITextFileService, ModelState, snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; -import { workbenchInstantiationService, TestTextFileService, createFileInput, TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { createFileInput, TestFileService, TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { FileOperationResult, FileOperationError, IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts similarity index 99% rename from src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts rename to src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts index 8d32fd9113d..ac3289d69ca 100644 --- a/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; -import { workbenchInstantiationService, TestFileService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestFileService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; diff --git a/src/vs/workbench/services/textfile/test/textFileService.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts similarity index 95% rename from src/vs/workbench/services/textfile/test/textFileService.test.ts rename to src/vs/workbench/services/textfile/test/browser/textFileService.test.ts index ff656aaf791..93536008ec8 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { workbenchInstantiationService, TestLifecycleService, TestContextService, TestFileService, TestElectronService, TestFilesConfigurationService, TestFileDialogService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; +import { TestLifecycleService, TestContextService, TestFileService, TestFilesConfigurationService, TestFileDialogService, TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; @@ -15,7 +15,6 @@ import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/commo import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { IElectronService } from 'vs/platform/electron/node/electron'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; @@ -27,7 +26,6 @@ class ServiceAccessor { @IWorkspaceContextService public contextService: TestContextService, @IModelService public modelService: ModelServiceImpl, @IFileService public fileService: TestFileService, - @IElectronService public electronService: TestElectronService, @IFileDialogService public fileDialogService: TestFileDialogService ) { } diff --git a/src/vs/workbench/services/textfile/test/saveSequenzializer.test.ts b/src/vs/workbench/services/textfile/test/common/saveSequenzializer.test.ts similarity index 100% rename from src/vs/workbench/services/textfile/test/saveSequenzializer.test.ts rename to src/vs/workbench/services/textfile/test/common/saveSequenzializer.test.ts diff --git a/src/vs/workbench/services/textfile/test/fixtures/binary.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/binary.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/binary.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/binary.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/index.html b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/index.html similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/index.html rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/index.html diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_big5.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_big5.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_big5.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_big5.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_cp1252.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_cp1252.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_cp1252.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_cp1252.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_cp866.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_cp866.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_cp866.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_cp866.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_gbk.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_gbk.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_gbk.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_gbk.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_shiftjis.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_shiftjis.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_shiftjis.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_shiftjis.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_utf16be.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf16be.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_utf16be.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf16be.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_utf16le.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf16le.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_utf16le.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf16le.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/lorem_utf8bom.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf8bom.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/lorem_utf8bom.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/lorem_utf8bom.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/small.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/small.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/small.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/small.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/small_umlaut.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/small_umlaut.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/small_umlaut.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/small_umlaut.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some.utf16le b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some.utf16le similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some.utf16le rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some.utf16le diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_big5.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_big5.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_big5.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_big5.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_cp1252.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_cp1252.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_cp1252.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_cp1252.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_cyrillic.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_cyrillic.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_cyrillic.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_cyrillic.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_gbk.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_gbk.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_gbk.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_gbk.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_shiftjs.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjs.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_shiftjs.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjs.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_small_cp1252.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_small_cp1252.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_small_cp1252.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_small_cp1252.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_utf16le.css b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_utf16le.css similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_utf16le.css rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_utf16le.css diff --git a/src/vs/workbench/services/textfile/test/fixtures/some_utf8_bom.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_utf8_bom.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/some_utf8_bom.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_utf8_bom.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/utf16_be_nobom.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/utf16_be_nobom.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/utf16_be_nobom.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/utf16_be_nobom.txt diff --git a/src/vs/workbench/services/textfile/test/fixtures/utf16_le_nobom.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/utf16_le_nobom.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/fixtures/utf16_le_nobom.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/utf16_le_nobom.txt diff --git a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts similarity index 99% rename from src/vs/workbench/services/textfile/test/textFileService.io.test.ts rename to src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts index 03402b14bf7..d50d6a3bf5e 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; import { ITextFileService, snapshotToString, TextFileOperationResult, TextFileOperationError } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; @@ -27,6 +26,7 @@ import { TextModel } from 'vs/editor/common/model/textModel'; import { isWindows } from 'vs/base/common/platform'; import { readFileSync, statSync } from 'fs'; import { detectEncodingByBOM } from 'vs/base/test/node/encoding/encoding.test'; +import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; class ServiceAccessor { constructor( diff --git a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts similarity index 97% rename from src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts rename to src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts index eb928f7b836..05a21c0dcf4 100644 --- a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -26,7 +26,7 @@ class ServiceAccessor { @ITextModelService public textModelResolverService: ITextModelService, @IModelService public modelService: IModelService, @IModeService public modeService: IModeService, - @ITextFileService public textFileService: TestTextFileService, + @ITextFileService public textFileService: ITextFileService, @IUntitledTextEditorService public untitledTextEditorService: IUntitledTextEditorService ) { } diff --git a/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts b/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts index d20c91df91d..4e189be6867 100644 --- a/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts @@ -8,7 +8,7 @@ import { IWorkingCopy, IWorkingCopyBackup } from 'vs/workbench/services/workingC import { URI } from 'vs/base/common/uri'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { TestWorkingCopyService } from 'vs/workbench/test/workbenchTestServices'; +import { TestWorkingCopyService } from 'vs/workbench/test/common/workbenchTestServices'; import { ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor'; import { basename } from 'vs/base/common/resources'; diff --git a/src/vs/workbench/test/browser/part.test.ts b/src/vs/workbench/test/browser/part.test.ts index e0cefdd51c8..63946bb4257 100644 --- a/src/vs/workbench/test/browser/part.test.ts +++ b/src/vs/workbench/test/browser/part.test.ts @@ -8,7 +8,7 @@ import { Part } from 'vs/workbench/browser/part'; import * as Types from 'vs/base/common/types'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { append, $, hide } from 'vs/base/browser/dom'; -import { TestStorageService, TestLayoutService } from 'vs/workbench/test/workbenchTestServices'; +import { TestStorageService, TestLayoutService } from 'vs/workbench/test/browser/workbenchTestServices'; import { StorageScope } from 'vs/platform/storage/common/storage'; class SimplePart extends Part { diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index a2d778aeb88..2bee5d76faa 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -11,7 +11,7 @@ import * as Platform from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import { workbenchInstantiationService, TestEditorGroupView, TestEditorGroupsService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestEditorGroupView, TestEditorGroupsService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts index 7757b1e08b6..d74c28ef6c4 100644 --- a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { EditorBreadcrumbsModel, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel'; -import { TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { FileKind } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/test/common/editor/editor.test.ts b/src/vs/workbench/test/browser/parts/editor/editor.test.ts similarity index 99% rename from src/vs/workbench/test/common/editor/editor.test.ts rename to src/vs/workbench/test/browser/parts/editor/editor.test.ts index bcf0f96e508..4f4348a4fc8 100644 --- a/src/vs/workbench/test/common/editor/editor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editor.test.ts @@ -10,7 +10,7 @@ import { IEditorModel } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Schemas } from 'vs/base/common/network'; class ServiceAccessor { diff --git a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts similarity index 92% rename from src/vs/workbench/test/common/editor/editorDiffModel.test.ts rename to src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts index 662bd56d224..369db0b1abb 100644 --- a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts @@ -11,8 +11,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { URI } from 'vs/base/common/uri'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ITextModel } from 'vs/editor/common/model'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -21,7 +20,6 @@ class ServiceAccessor { @ITextModelService public textModelResolverService: ITextModelService, @IModelService public modelService: IModelService, @IModeService public modeService: IModeService, - @ITextFileService public textFileService: TestTextFileService ) { } } diff --git a/src/vs/workbench/test/common/editor/editorGroups.test.ts b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts similarity index 99% rename from src/vs/workbench/test/common/editor/editorGroups.test.ts rename to src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts index dea9b896e53..d70d7fc2709 100644 --- a/src/vs/workbench/test/common/editor/editorGroups.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EditorGroup, ISerializedEditorGroup, EditorCloseEvent } from 'vs/workbench/common/editor/editorGroup'; import { Extensions as EditorExtensions, IEditorInputFactoryRegistry, EditorInput, IFileEditorInput, IEditorInputFactory, CloseDirection, EditorsOrder } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; -import { TestLifecycleService, TestContextService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestLifecycleService, TestContextService, TestStorageService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/test/common/editor/editorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/editorInput.test.ts similarity index 100% rename from src/vs/workbench/test/common/editor/editorInput.test.ts rename to src/vs/workbench/test/browser/parts/editor/editorInput.test.ts diff --git a/src/vs/workbench/test/common/editor/editorModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts similarity index 98% rename from src/vs/workbench/test/common/editor/editorModel.test.ts rename to src/vs/workbench/test/browser/parts/editor/editorModel.test.ts index c442c63736b..a754831a0a1 100644 --- a/src/vs/workbench/test/common/editor/editorModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts @@ -17,7 +17,7 @@ import { ITextBufferFactory } from 'vs/editor/common/model'; import { URI } from 'vs/base/common/uri'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService'; -import { TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextResourcePropertiesService } from 'vs/workbench/test/browser/workbenchTestServices'; class MyEditorModel extends EditorModel { } class MyTextEditorModel extends BaseTextEditorModel { diff --git a/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts b/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts index 22b8c35cbce..c610a4ddbfb 100644 --- a/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; diff --git a/src/vs/workbench/test/common/editor/resourceEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts similarity index 98% rename from src/vs/workbench/test/common/editor/resourceEditorInput.test.ts rename to src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts index 137ced3b7e4..2eaede4adbc 100644 --- a/src/vs/workbench/test/common/editor/resourceEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/test/common/editor/untitledTextEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/untitledTextEditor.test.ts similarity index 99% rename from src/vs/workbench/test/common/editor/untitledTextEditor.test.ts rename to src/vs/workbench/test/browser/parts/editor/untitledTextEditor.test.ts index 43c68b49e96..027de2efbe3 100644 --- a/src/vs/workbench/test/common/editor/untitledTextEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/untitledTextEditor.test.ts @@ -9,7 +9,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/test/browser/parts/views/views.test.ts b/src/vs/workbench/test/browser/parts/views/views.test.ts index aa3aff7d4e7..016880ee782 100644 --- a/src/vs/workbench/test/browser/parts/views/views.test.ts +++ b/src/vs/workbench/test/browser/parts/views/views.test.ts @@ -9,7 +9,7 @@ import { IViewsRegistry, IViewDescriptor, IViewContainersRegistry, Extensions as import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { move } from 'vs/base/common/arrays'; import { Registry } from 'vs/platform/registry/common/platform'; -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts similarity index 78% rename from src/vs/workbench/test/workbenchTestServices.ts rename to src/vs/workbench/test/browser/workbenchTestServices.ts index df2d3423f2b..65a50f43c73 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -6,7 +6,6 @@ import 'vs/workbench/contrib/files/browser/files.contribution'; // load our contribution into the test import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { join } from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -22,26 +21,23 @@ import { TextModelResolverService } from 'vs/workbench/services/textmodelResolve import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IEditorOptions, IResourceInput } from 'vs/platform/editor/common/editor'; import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; -import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, Workspace } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { FileOperationEvent, IFileService, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent } from 'vs/platform/files/common/files'; +import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { ITextFileStreamContent, ITextFileService, IResourceEncoding, IReadTextFileOptions } from 'vs/workbench/services/textfile/common/textfiles'; -import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; +import { IResourceEncoding, ITextFileService, IReadTextFileOptions, ITextFileStreamContent } from 'vs/workbench/services/textfile/common/textfiles'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { MenuBarVisibility, IWindowConfiguration, IWindowOpenable, IOpenWindowOptions, IOpenEmptyWindowOptions, IOpenedWindow } from 'vs/platform/windows/common/windows'; +import { MenuBarVisibility, IWindowOpenable, IOpenWindowOptions, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; -import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; -import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService'; import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; @@ -63,145 +59,49 @@ import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { EditorGroup } from 'vs/workbench/common/editor/editorGroup'; import { Dimension } from 'vs/base/browser/dom'; -import { ILogService, NullLogService, LogLevel } from 'vs/platform/log/common/log'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { ILabelService } from 'vs/platform/label/common/label'; import { timeout } from 'vs/base/common/async'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ViewletDescriptor, Viewlet } from 'vs/workbench/browser/viewlet'; import { IViewlet } from 'vs/workbench/common/viewlet'; -import { IStorageService, InMemoryStorageService, IWillSaveStateEvent } from 'vs/platform/storage/common/storage'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { isLinux } from 'vs/base/common/platform'; import { LabelService } from 'vs/workbench/services/label/common/labelService'; import { IDimension } from 'vs/platform/layout/browser/layoutService'; import { Part } from 'vs/workbench/browser/part'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPanel } from 'vs/workbench/common/panel'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; -import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { VSBuffer, VSBufferReadable } from 'vs/base/common/buffer'; -import { NativeTextFileService } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; import { Schemas } from 'vs/base/common/network'; import { IProductService } from 'vs/platform/product/common/productService'; import product from 'vs/platform/product/common/product'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IElectronService } from 'vs/platform/electron/node/electron'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; -import { IBackupMainService, IWorkspaceBackupInfo } from 'vs/platform/backup/electron-main/backup'; -import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; -import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs'; import { find } from 'vs/base/common/arrays'; -import { WorkingCopyService, IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IFilesConfigurationService, FilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { IAccessibilityService, AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; +import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { BrowserTextFileService } from 'vs/workbench/services/textfile/browser/browserTextFileService'; +import * as CommonWorkbenchTestServices from 'vs/workbench/test/common/workbenchTestServices'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; + +export import TestTextResourcePropertiesService = CommonWorkbenchTestServices.TestTextResourcePropertiesService; +export import TestContextService = CommonWorkbenchTestServices.TestContextService; +export import TestStorageService = CommonWorkbenchTestServices.TestStorageService; +export import TestWorkingCopyService = CommonWorkbenchTestServices.TestWorkingCopyService; export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined); } -export const TestWindowConfiguration: IWindowConfiguration = { - windowId: 0, - sessionId: 'testSessionId', - logLevel: LogLevel.Error, - mainPid: 0, - appRoot: '', - userEnv: {}, - execPath: process.execPath, - perfEntries: [], - ...parseArgs(process.argv, OPTIONS) -}; - -export const TestEnvironmentService = new NativeWorkbenchEnvironmentService(TestWindowConfiguration, process.execPath, 0); - -export class TestContextService implements IWorkspaceContextService { - _serviceBrand: undefined; - - private workspace: Workspace; - private options: any; - - private readonly _onDidChangeWorkspaceName: Emitter; - private readonly _onDidChangeWorkspaceFolders: Emitter; - private readonly _onDidChangeWorkbenchState: Emitter; - - constructor(workspace: any = TestWorkspace, options: any = null) { - this.workspace = workspace; - this.options = options || Object.create(null); - this._onDidChangeWorkspaceName = new Emitter(); - this._onDidChangeWorkspaceFolders = new Emitter(); - this._onDidChangeWorkbenchState = new Emitter(); - } - - get onDidChangeWorkspaceName(): Event { - return this._onDidChangeWorkspaceName.event; - } - - get onDidChangeWorkspaceFolders(): Event { - return this._onDidChangeWorkspaceFolders.event; - } - - get onDidChangeWorkbenchState(): Event { - return this._onDidChangeWorkbenchState.event; - } - - getFolders(): IWorkspaceFolder[] { - return this.workspace ? this.workspace.folders : []; - } - - getWorkbenchState(): WorkbenchState { - if (this.workspace.configuration) { - return WorkbenchState.WORKSPACE; - } - - if (this.workspace.folders.length) { - return WorkbenchState.FOLDER; - } - - return WorkbenchState.EMPTY; - } - - getCompleteWorkspace(): Promise { - return Promise.resolve(this.getWorkspace()); - } - - getWorkspace(): IWorkbenchWorkspace { - return this.workspace; - } - - getWorkspaceFolder(resource: URI): IWorkspaceFolder | null { - return this.workspace.getFolder(resource); - } - - setWorkspace(workspace: any): void { - this.workspace = workspace; - } - - getOptions() { - return this.options; - } - - updateOptions() { - - } - - isInsideWorkspace(resource: URI): boolean { - if (resource && this.workspace) { - return resources.isEqualOrParent(resource, this.workspace.folders[0].uri); - } - - return false; - } - - toResource(workspaceRelativePath: string): URI { - return URI.file(join('C:\\', workspaceRelativePath)); - } - - isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean { - return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && resources.isEqual(this.workspace.folders[0].uri, workspaceIdentifier); - } +export interface ITestInstantiationService extends IInstantiationService { + stub(service: ServiceIdentifier, ctor: any): T; } -export class TestTextFileService extends NativeTextFileService { +export class TestTextFileService extends BrowserTextFileService { private resolveTextContentError!: FileOperationError | null; constructor( @@ -230,7 +130,6 @@ export class TestTextFileService extends NativeTextFileService { dialogService, fileDialogService, textResourceConfigurationService, - productService, filesConfigurationService, textModelService, codeEditorService, @@ -264,12 +163,11 @@ export class TestTextFileService extends NativeTextFileService { } } -export interface ITestInstantiationService extends IInstantiationService { - stub(service: ServiceIdentifier, ctor: any): T; -} +export const TestEnvironmentService = new BrowserWorkbenchEnvironmentService(Object.create(null)); + +export function workbenchInstantiationService(overrides?: { textFileService?: (instantiationService: IInstantiationService) => ITextFileService }): ITestInstantiationService { + const instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()])); -export function workbenchInstantiationService(): ITestInstantiationService { - let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()])); instantiationService.stub(IEnvironmentService, TestEnvironmentService); const contextKeyService = instantiationService.createInstance(MockContextKeyService); instantiationService.stub(IContextKeyService, contextKeyService); @@ -285,7 +183,6 @@ export function workbenchInstantiationService(): ITestInstantiationService { instantiationService.stub(IDialogService, new TestDialogService()); instantiationService.stub(IAccessibilityService, new TestAccessibilityService()); instantiationService.stub(IFileDialogService, new TestFileDialogService()); - instantiationService.stub(IElectronService, new TestElectronService()); instantiationService.stub(IModeService, instantiationService.createInstance(ModeServiceImpl)); instantiationService.stub(IHistoryService, new TestHistoryService()); instantiationService.stub(ITextResourcePropertiesService, new TestTextResourcePropertiesService(configService)); @@ -299,8 +196,8 @@ export function workbenchInstantiationService(): ITestInstantiationService { instantiationService.stub(IKeybindingService, new MockKeybindingService()); instantiationService.stub(IDecorationsService, new TestDecorationsService()); instantiationService.stub(IExtensionService, new TestExtensionService()); + instantiationService.stub(ITextFileService, overrides?.textFileService ? overrides.textFileService(instantiationService) : instantiationService.createInstance(TestTextFileService)); instantiationService.stub(IHostService, instantiationService.createInstance(TestHostService)); - instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(IThemeService, new TestThemeService()); instantiationService.stub(ILogService, new NullLogService()); @@ -667,11 +564,6 @@ export class TestPanelService implements IPanelService { } } -export class TestStorageService extends InMemoryStorageService { - readonly _onWillSaveState = this._register(new Emitter()); - readonly onWillSaveState = this._onWillSaveState.event; -} - export class TestEditorGroupsService implements IEditorGroupsService { _serviceBrand: undefined; @@ -1301,39 +1193,6 @@ export class TestTextResourceConfigurationService implements ITextResourceConfig } } -export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { - - _serviceBrand: undefined; - - constructor( - @IConfigurationService private readonly configurationService: IConfigurationService, - ) { - } - - getEOL(resource: URI, language?: string): string { - const eol = this.configurationService.getValue('files.eol', { overrideIdentifier: language, resource }); - if (eol && eol !== 'auto') { - return eol; - } - return (isLinux || isMacintosh) ? '\n' : '\r\n'; - } -} - - -export class TestSharedProcessService implements ISharedProcessService { - - _serviceBrand: undefined; - - getChannel(channelName: string): any { - return undefined; - } - - registerChannel(channelName: string, channel: any): void { } - - async toggleSharedProcessWindow(): Promise { } - async whenSharedProcessReady(): Promise { } -} - export class RemoteFileSystemProvider implements IFileSystemProvider { constructor(private readonly diskFileSystemProvider: IFileSystemProvider, private readonly remoteAuthority: string) { } @@ -1387,140 +1246,6 @@ export class TestHostService implements IHostService { async toggleFullScreen(): Promise { } } -export class TestElectronService implements IElectronService { - _serviceBrand: undefined; - - onWindowOpen: Event = Event.None; - onWindowMaximize: Event = Event.None; - onWindowUnmaximize: Event = Event.None; - onWindowFocus: Event = Event.None; - onWindowBlur: Event = Event.None; - - windowCount = Promise.resolve(1); - getWindowCount(): Promise { return this.windowCount; } - - async getWindows(): Promise { return []; } - async getActiveWindowId(): Promise { return undefined; } - - openWindow(options?: IOpenEmptyWindowOptions): Promise; - openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise; - openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise { - throw new Error('Method not implemented.'); - } - - async toggleFullScreen(): Promise { } - async handleTitleDoubleClick(): Promise { } - async isMaximized(): Promise { return true; } - async maximizeWindow(): Promise { } - async unmaximizeWindow(): Promise { } - async minimizeWindow(): Promise { } - async focusWindow(options?: { windowId?: number | undefined; } | undefined): Promise { } - async showMessageBox(options: Electron.MessageBoxOptions): Promise { throw new Error('Method not implemented.'); } - async showSaveDialog(options: Electron.SaveDialogOptions): Promise { throw new Error('Method not implemented.'); } - async showOpenDialog(options: Electron.OpenDialogOptions): Promise { throw new Error('Method not implemented.'); } - async pickFileFolderAndOpen(options: INativeOpenDialogOptions): Promise { } - async pickFileAndOpen(options: INativeOpenDialogOptions): Promise { } - async pickFolderAndOpen(options: INativeOpenDialogOptions): Promise { } - async pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise { } - async showItemInFolder(path: string): Promise { } - async setRepresentedFilename(path: string): Promise { } - async setDocumentEdited(edited: boolean): Promise { } - async openExternal(url: string): Promise { return false; } - async updateTouchBar(): Promise { } - async newWindowTab(): Promise { } - async showPreviousWindowTab(): Promise { } - async showNextWindowTab(): Promise { } - async moveWindowTabToNewWindow(): Promise { } - async mergeAllWindowTabs(): Promise { } - async toggleWindowTabsBar(): Promise { } - async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } - async reload(): Promise { } - async closeWindow(): Promise { } - async quit(): Promise { } - async openDevTools(options?: Electron.OpenDevToolsOptions | undefined): Promise { } - async toggleDevTools(): Promise { } - async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise { } - async resolveProxy(url: string): Promise { return undefined; } -} - -export class TestBackupMainService implements IBackupMainService { - _serviceBrand: undefined; - - isHotExitEnabled(): boolean { - throw new Error('Method not implemented.'); - } - - getWorkspaceBackups(): IWorkspaceBackupInfo[] { - throw new Error('Method not implemented.'); - } - - getFolderBackupPaths(): URI[] { - throw new Error('Method not implemented.'); - } - - getEmptyWindowBackupPaths(): IEmptyWindowBackupInfo[] { - throw new Error('Method not implemented.'); - } - - registerWorkspaceBackupSync(workspace: IWorkspaceBackupInfo, migrateFrom?: string | undefined): string { - throw new Error('Method not implemented.'); - } - - registerFolderBackupSync(folderUri: URI): string { - throw new Error('Method not implemented.'); - } - - registerEmptyWindowBackupSync(backupFolder?: string | undefined, remoteAuthority?: string | undefined): string { - throw new Error('Method not implemented.'); - } - - unregisterWorkspaceBackupSync(workspace: IWorkspaceIdentifier): void { - throw new Error('Method not implemented.'); - } - - unregisterFolderBackupSync(folderUri: URI): void { - throw new Error('Method not implemented.'); - } - - unregisterEmptyWindowBackupSync(backupFolder: string): void { - throw new Error('Method not implemented.'); - } -} - -export class TestDialogMainService implements IDialogMainService { - _serviceBrand: undefined; - - pickFileFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - pickFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - pickFile(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - pickWorkspace(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } - - showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { - throw new Error('Method not implemented.'); - } -} - -export class TestWorkingCopyService extends WorkingCopyService { } - export class TestFilesConfigurationService extends FilesConfigurationService { onFilesConfigurationChange(configuration: any): void { diff --git a/src/vs/workbench/test/common/memento.test.ts b/src/vs/workbench/test/common/memento.test.ts index b6179a6506a..3f63c1c2948 100644 --- a/src/vs/workbench/test/common/memento.test.ts +++ b/src/vs/workbench/test/common/memento.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; import { Memento } from 'vs/workbench/common/memento'; -import { TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; suite('Memento', () => { let context: StorageScope | undefined = undefined; @@ -177,4 +177,4 @@ suite('Memento', () => { memento = myMemento2.getMemento(StorageScope.WORKSPACE); assert.deepEqual(memento, { foo: 'Hello World', bar: 'Hello World' }); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/test/common/workbenchTestServices.ts b/src/vs/workbench/test/common/workbenchTestServices.ts new file mode 100644 index 00000000000..0ab76f0644e --- /dev/null +++ b/src/vs/workbench/test/common/workbenchTestServices.ts @@ -0,0 +1,129 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { join } from 'vs/base/common/path'; +import * as resources from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { Event, Emitter } from 'vs/base/common/event'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, Workspace } from 'vs/platform/workspace/common/workspace'; +import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; +import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService'; +import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { InMemoryStorageService, IWillSaveStateEvent } from 'vs/platform/storage/common/storage'; +import { WorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; + +export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: undefined; + + constructor( + @IConfigurationService private readonly configurationService: IConfigurationService, + ) { + } + + getEOL(resource: URI, language?: string): string { + const eol = this.configurationService.getValue('files.eol', { overrideIdentifier: language, resource }); + if (eol && eol !== 'auto') { + return eol; + } + return (isLinux || isMacintosh) ? '\n' : '\r\n'; + } +} + +export class TestContextService implements IWorkspaceContextService { + _serviceBrand: undefined; + + private workspace: Workspace; + private options: any; + + private readonly _onDidChangeWorkspaceName: Emitter; + private readonly _onDidChangeWorkspaceFolders: Emitter; + private readonly _onDidChangeWorkbenchState: Emitter; + + constructor(workspace: any = TestWorkspace, options: any = null) { + this.workspace = workspace; + this.options = options || Object.create(null); + this._onDidChangeWorkspaceName = new Emitter(); + this._onDidChangeWorkspaceFolders = new Emitter(); + this._onDidChangeWorkbenchState = new Emitter(); + } + + get onDidChangeWorkspaceName(): Event { + return this._onDidChangeWorkspaceName.event; + } + + get onDidChangeWorkspaceFolders(): Event { + return this._onDidChangeWorkspaceFolders.event; + } + + get onDidChangeWorkbenchState(): Event { + return this._onDidChangeWorkbenchState.event; + } + + getFolders(): IWorkspaceFolder[] { + return this.workspace ? this.workspace.folders : []; + } + + getWorkbenchState(): WorkbenchState { + if (this.workspace.configuration) { + return WorkbenchState.WORKSPACE; + } + + if (this.workspace.folders.length) { + return WorkbenchState.FOLDER; + } + + return WorkbenchState.EMPTY; + } + + getCompleteWorkspace(): Promise { + return Promise.resolve(this.getWorkspace()); + } + + getWorkspace(): IWorkbenchWorkspace { + return this.workspace; + } + + getWorkspaceFolder(resource: URI): IWorkspaceFolder | null { + return this.workspace.getFolder(resource); + } + + setWorkspace(workspace: any): void { + this.workspace = workspace; + } + + getOptions() { + return this.options; + } + + updateOptions() { + + } + + isInsideWorkspace(resource: URI): boolean { + if (resource && this.workspace) { + return resources.isEqualOrParent(resource, this.workspace.folders[0].uri); + } + + return false; + } + + toResource(workspaceRelativePath: string): URI { + return URI.file(join('C:\\', workspaceRelativePath)); + } + + isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean { + return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && resources.isEqual(this.workspace.folders[0].uri, workspaceIdentifier); + } +} + +export class TestStorageService extends InMemoryStorageService { + readonly _onWillSaveState = this._register(new Emitter()); + readonly onWillSaveState = this._onWillSaveState.event; +} + +export class TestWorkingCopyService extends WorkingCopyService { } diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index b4d4ea7e610..04fc91a7a76 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -13,7 +13,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/common/extHost.protocol'; import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; -import { TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService, TestEnvironmentService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Event } from 'vs/base/common/event'; import { ITextModel } from 'vs/editor/common/model'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index d44bb6189c0..27d399d79da 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -19,7 +19,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Position } from 'vs/editor/common/core/position'; import { IModelService } from 'vs/editor/common/services/modelService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { TestFileService, TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestContextService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService, TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestContextService, TestTextResourcePropertiesService } from 'vs/workbench/test/browser/workbenchTestServices'; import { BulkEditService } from 'vs/workbench/services/bulkEdit/browser/bulkEditService'; import { NullLogService, ILogService } from 'vs/platform/log/common/log'; import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts index 70efc25cece..e9c8770111e 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FinalNewLineParticipant, TrimFinalNewLinesParticipant } from 'vs/workbench/api/browser/mainThreadSaveParticipant'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { IModelService } from 'vs/editor/common/services/modelService'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts index 50f8a7aa045..62188e87d43 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ISearchService, IFileQuery } from 'vs/workbench/services/search/common/search'; import { MainThreadWorkspace } from 'vs/workbench/api/browser/mainThreadWorkspace'; diff --git a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts index 5c3e43ffb5b..10560e35590 100644 --- a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts @@ -28,7 +28,8 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { LocalSearchService } from 'vs/workbench/services/search/node/searchService'; import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; -import { TestContextService, TestEditorGroupsService, TestEditorService, TestEnvironmentService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestEditorGroupsService, TestEditorService, TestTextResourcePropertiesService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestEnvironmentService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { NullLogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index e79af8a3d3d..ac995be33b1 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -17,7 +17,8 @@ import * as minimist from 'vscode-minimist'; import * as path from 'vs/base/common/path'; import { LocalSearchService } from 'vs/workbench/services/search/node/searchService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { TestEnvironmentService, TestContextService, TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestEnvironmentService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { URI } from 'vs/base/common/uri'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts new file mode 100644 index 00000000000..a5705d198a9 --- /dev/null +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -0,0 +1,188 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { workbenchInstantiationService as browserWorkbenchInstantiationService, ITestInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { Event } from 'vs/base/common/event'; +import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; +import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { NativeTextFileService } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; +import { IElectronService } from 'vs/platform/electron/node/electron'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { FileOperationError, IFileService } from 'vs/platform/files/common/files'; +import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { URI } from 'vs/base/common/uri'; +import { IReadTextFileOptions, ITextFileStreamContent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; +import { IOpenedWindow, IOpenEmptyWindowOptions, IWindowOpenable, IOpenWindowOptions, IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; +import { LogLevel } from 'vs/platform/log/common/log'; + +export const TestWindowConfiguration: IWindowConfiguration = { + windowId: 0, + sessionId: 'testSessionId', + logLevel: LogLevel.Error, + mainPid: 0, + appRoot: '', + userEnv: {}, + execPath: process.execPath, + perfEntries: [], + ...parseArgs(process.argv, OPTIONS) +}; + +export const TestEnvironmentService = new NativeWorkbenchEnvironmentService(TestWindowConfiguration, process.execPath, 0); + +export class TestTextFileService extends NativeTextFileService { + private resolveTextContentError!: FileOperationError | null; + + constructor( + @IFileService protected fileService: IFileService, + @IUntitledTextEditorService untitledTextEditorService: IUntitledTextEditorService, + @ILifecycleService lifecycleService: ILifecycleService, + @IInstantiationService instantiationService: IInstantiationService, + @IModelService modelService: IModelService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IDialogService dialogService: IDialogService, + @IFileDialogService fileDialogService: IFileDialogService, + @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, + @IProductService productService: IProductService, + @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, + @ITextModelService textModelService: ITextModelService, + @ICodeEditorService codeEditorService: ICodeEditorService, + @INotificationService notificationService: INotificationService + ) { + super( + fileService, + untitledTextEditorService, + lifecycleService, + instantiationService, + modelService, + environmentService, + dialogService, + fileDialogService, + textResourceConfigurationService, + productService, + filesConfigurationService, + textModelService, + codeEditorService, + notificationService + ); + } + + setResolveTextContentErrorOnce(error: FileOperationError): void { + this.resolveTextContentError = error; + } + + async readStream(resource: URI, options?: IReadTextFileOptions): Promise { + if (this.resolveTextContentError) { + const error = this.resolveTextContentError; + this.resolveTextContentError = null; + + throw error; + } + + const content = await this.fileService.readFileStream(resource, options); + return { + resource: content.resource, + name: content.name, + mtime: content.mtime, + ctime: content.ctime, + etag: content.etag, + encoding: 'utf8', + value: await createTextBufferFactoryFromStream(content.value), + size: 10 + }; + } +} + +export class TestSharedProcessService implements ISharedProcessService { + + _serviceBrand: undefined; + + getChannel(channelName: string): any { + return undefined; + } + + registerChannel(channelName: string, channel: any): void { } + + async toggleSharedProcessWindow(): Promise { } + async whenSharedProcessReady(): Promise { } +} + +export class TestElectronService implements IElectronService { + _serviceBrand: undefined; + + onWindowOpen: Event = Event.None; + onWindowMaximize: Event = Event.None; + onWindowUnmaximize: Event = Event.None; + onWindowFocus: Event = Event.None; + onWindowBlur: Event = Event.None; + + windowCount = Promise.resolve(1); + getWindowCount(): Promise { return this.windowCount; } + + async getWindows(): Promise { return []; } + async getActiveWindowId(): Promise { return undefined; } + + openWindow(options?: IOpenEmptyWindowOptions): Promise; + openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise; + openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise { + throw new Error('Method not implemented.'); + } + + async toggleFullScreen(): Promise { } + async handleTitleDoubleClick(): Promise { } + async isMaximized(): Promise { return true; } + async maximizeWindow(): Promise { } + async unmaximizeWindow(): Promise { } + async minimizeWindow(): Promise { } + async focusWindow(options?: { windowId?: number | undefined; } | undefined): Promise { } + async showMessageBox(options: Electron.MessageBoxOptions): Promise { throw new Error('Method not implemented.'); } + async showSaveDialog(options: Electron.SaveDialogOptions): Promise { throw new Error('Method not implemented.'); } + async showOpenDialog(options: Electron.OpenDialogOptions): Promise { throw new Error('Method not implemented.'); } + async pickFileFolderAndOpen(options: INativeOpenDialogOptions): Promise { } + async pickFileAndOpen(options: INativeOpenDialogOptions): Promise { } + async pickFolderAndOpen(options: INativeOpenDialogOptions): Promise { } + async pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise { } + async showItemInFolder(path: string): Promise { } + async setRepresentedFilename(path: string): Promise { } + async setDocumentEdited(edited: boolean): Promise { } + async openExternal(url: string): Promise { return false; } + async updateTouchBar(): Promise { } + async newWindowTab(): Promise { } + async showPreviousWindowTab(): Promise { } + async showNextWindowTab(): Promise { } + async moveWindowTabToNewWindow(): Promise { } + async mergeAllWindowTabs(): Promise { } + async toggleWindowTabsBar(): Promise { } + async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } + async reload(): Promise { } + async closeWindow(): Promise { } + async quit(): Promise { } + async openDevTools(options?: Electron.OpenDevToolsOptions | undefined): Promise { } + async toggleDevTools(): Promise { } + async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise { } + async resolveProxy(url: string): Promise { return undefined; } +} + +export function workbenchInstantiationService(): ITestInstantiationService { + const instantiationService = browserWorkbenchInstantiationService({ + textFileService: insta => insta.createInstance(TestTextFileService) + }); + + instantiationService.stub(IElectronService, new TestElectronService()); + + return instantiationService; +}